[]父物体旋转会导致子物体的世界坐标系不正确?(附demo)

一个简单的场景

场景.png

如果我旋转图中
层级.png

方框指示的sprite3d的rotation,会导致子物体TargetGuard的transform.position不正确,好像子节点属于的坐标系变动了?
 
比如说,绳子不旋转的时候,我在代码中动下面圆盘的transform.position
this.block = s.getChildByName("target_root").getChildByName("PendulumCircleTarget").getChildByName("MoveBlockPivot").getChildByName("TargetGuard") as Laya.Sprite3D;

Laya.stage.on(Laya.Event.KEY_PRESS, this, this.KeyPress);
this.pivot = s.getChildByName("target_root").getChildByName("PendulumCircleTarget").getChildByName("MoveBlockPivot") as Laya.Sprite3D;
let newRot = new Laya.Quaternion(0, 0, 0, 0);
Laya.Quaternion.createFromYawPitchRoll(0, 0* (Math.PI / 180), 0, newRot);
this.pivot.transform.rotation = newRot;

..............................................
if (e.keyCode == 97) {
// console.log("a");
let newPos = new Laya.Vector3(this.block.transform.position.x + 0.1, this.block.transform.position.y, this.block.transform.position.z);
console.log(newPos.x);
this.block.transform.position = newPos;
}
else if (e.keyCode == 100) {
// console.log('d');
let newPos = new Laya.Vector3(this.block.transform.position.x - 0.1, this.block.transform.position.y, this.block.transform.position.z);
console.log(newPos.x);
this.block.transform.position = newPos;
}
能够正确的左右移动
不旋转.png

 
如果我让绳子旋转一点
        this.pivot = s.getChildByName("target_root").getChildByName("PendulumCircleTarget").getChildByName("MoveBlockPivot") as Laya.Sprite3D;
let newRot = new Laya.Quaternion(0, 0, 0, 0);
Laya.Quaternion.createFromYawPitchRoll(0, 20 * (Math.PI / 180), 0, newRot);
this.pivot.transform.rotation = newRot;
这个时候直接操作transform.position的xyz,都是不按照世界坐标系的上下左右来移动,而是一个很奇怪的坐标系:
 

旋转20度.png

 
unity场景和laya工程都在附件中,麻烦帮忙看一下
 
 
 
已邀请:

Aar0n

赞同来自:

我给您看一下,稍后回复

LagField

赞同来自:

专门在unity做了同样的事情,能够正确改变世界位置。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestMove : MonoBehaviour
{

[SerializeField] private Transform pivot;

[SerializeField] private Transform guard;


// Use this for initialization
void Start ()
{
pivot.transform.rotation = Quaternion.Euler(0, 0, -20);

}

// Update is called once per frame
void Update () {
if (Input.GetKey(KeyCode.A))
{
guard.transform.position = new Vector3(guard.transform.position.x + 0.1f, guard.transform.position.y, guard.transform.position.z);
}
else if (Input.GetKey(KeyCode.D))
{
guard.transform.position = new Vector3(guard.transform.position.x - 0.1f, guard.transform.position.y, guard.transform.position.z);
}
}
}
Laya里面的transform.position是怎么计算来的,如果要看源码能大概说一下在哪个文件里吗

LagField

赞同来自:

同样,我在unity里面直接先旋转好绳子:

先旋转好.png

 
这个时候导入Laya,显示的是旋转好的样子,这个时候我不在代码里面做旋转,而是直接改动下面圆盘的transform.position的x,这个时候就能正确左右平移了,这个时候为什么又不是以父节点为坐标系了呢?我有点混乱啊
 
同样,旋转后的工程在附件

LagField

赞同来自:

附件工程是unity里面不旋转,在laya里面做了旋转有问题的工程
unity使用的场景也导出来了,在附件里面
 

Laya版本.png

Laya使用的环境版本

Aar0n

赞同来自:

r.png

旋转用这行代码 就ok 了 ,就是和unity一样了,你从哪看的那个搞欧拉角的?空间都给扭了

LagField

赞同来自:

只要是设置的transform.rotation就会出问题,如果只设置localrotation就是好的

LagField

赞同来自:

感觉旋转已经没法做了,这个问题不解决的话

要回复问题请先

商务合作
商务合作