不过,我觉得这个标题并不缺全面,应该还有一种情况可以包含在里面,

即“unity中,为什么我的物体没有按照预期的方向去移动?”


为什么呢?

这是因为unity中分为全局坐标系和局部坐标系,你的两个物体内,至少一定有一个的position是局部坐标系,说简单一点就是至少一定有一个物体是子物体。

你可能会说“不对呀,我这个不是子物体?它没有父物体之类的。”

或是“为什么另一个也是子物体,但它就是全局坐标系?这个坐标系什么的到底都是些什么乱七八糟的?”

没关系我后面会解释这些情况~


先来说一下全局坐标系的(0,0,0)和局部坐标系的(0,0,0)是什么?为什么会位置不一样?

下图1:最左侧的层级栏显示cube是一个单独的物体,它不是任何物体的子物体,所以它的XYZ(0,0,0)是在全局坐标系下的,写代码移动它的时候,它会按照预期的方向运动。

下图2:最左侧的层级栏显示cube是test的子物体,所以它的XYZ(0,0,0)是局部坐标系下的。写代码移动它的时候,很可能不会按照你预期的方向运动,这是因为物体运动的是基于全局坐标系的,而你写的代码是参考局部坐标系中的起始点写的。

那我这个物体的全局坐标系在哪里呢?全局坐标系在根物体上,因为父物体也有可能会有父物体,所以说这里就说是根物体。

局部坐标系的概念是相对的,在图二中cube就是相对于父物体坐标XYZ为(0,0,0),也就是说局部坐标系就是把父物体的XYZ都当做0来看待。

图2 cube的根物体就是test, test的坐标就是正常的全局坐标系,见下图3。

(这里test的移动手柄默认是在所有物体的中心,但是实际上test的位置是在红色cube那里)

当然移动父物体也一定会使它的所有子物体跟着移动,但是子物体因为是局部坐标系的,坐标并不会因此改变。

将cube从test下移出,它的坐标就正常了,见下图4。


搞清楚这些,那来解释另外两个问题。

问题1:“不对呀,我这个不是子物体?它没有父物体之类的。”

答:也许你不小心拖动错误,把它挂成了某个物体的子物体,你应该仔细检查一下;也许你把空物体当收纳的收纳箱用了,但是空物体并不是一个收纳箱,它也是有自己的坐标的,你挂到它下面那么你的物体的position就肯定用的局部坐标系,你可以用空物体当收纳箱,但是你空物体的transform应该没有reset。

问题2:“为什么另一个也是子物体,但它就是全局坐标系?这个坐标系什么的到底都是些什么乱七八糟的?”

答:那说明它的根物体或者父物体刚生成的时候,其transform被reset了,那么挂载到这个父物体下面的所有子物体的局部坐标系会和全局坐标系重合,看起来就和全局坐标系一样。

问题3:transform reset是什么?

答:应该算是一个良好的习惯?至少对于你把空物体拿来当收纳箱用是这样的。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐