Unity Transform与Hierachy

术语

        模型空间:由模型对象本身决定的空间(Model Space),有时也称对象空间(Object Space)或者局部空间(Local Space),坐标轴xyz分别对应右、上、前三个方向。

        世界空间:最外层的空间(World Space),用于定义绝对位置。

        模型变换矩阵:是指从模型空间变换到世界空间的矩阵(Model Transform Matrix)

Transform

        Transform组件由Position、Rotation和Scale构成,这三者是模型变换矩阵的组成部分。

        默认情况下物体空间与世界空间重合,Transform显示的这三者代表了从物体空间坐标要经过何种变换才能变成世界空间坐标:比如Position(A,B,C)代表物体空间坐标需要加上(A,B,C)的位移;Scale(A,B,C)代表物体空间坐标需要乘以(A,B,C)的倍数;Rotation(A,B,C)代表物体空间坐标需要绕坐标轴旋转一定角度。Unity计算这三种变换的顺序是先缩放,再旋转,最后平移。以上分析可知模型变换矩阵计算公式为:

P_{world}=M_{model2world}* P_{}= M_{translation}* M_{rotation}*M_{scale} * P_{model}

        上面给出的矩阵运算顺序是左乘,需要从右往左阅读。

Hierarchy

        既然每个GameObject都有一个Transform对应,那么每个场景根物体都内含各自的模型变换矩阵。但是如果一个物体有父物体,那么Transform显示的是从子物体空间坐标要经过何种变换才能变成父物体空间坐标,这时根据子物体Transform计算出来的变换矩阵不再是其模型变换矩阵,不妨叫做中间矩阵。假设A物体有个子物体B,空间中有某个固定点P在AB两个物体各自的模型空间的坐标分别为PA和PB,并且两个中间矩阵分别为MA和MB,那么有:

P_{world} = M_{A} * P_{A}

P_{A} = M_{B} * P_{B}

        从而:

P_{world}=M_{A}* M_{B} *P_{model}

M_{local2worldB}=M_{A}* M_{B}

        也就是说,为了得到子物体B的模型变换矩阵,Unity需要将A和B的中间矩阵依次相乘,当层级过多时,这不可避免会产生一些成本。

Editor

         所以我们调整一个GameObject的Transform也要留意父节点的Transform。举个例子,下面的物体原本是矩形,因为父节点存在非等比缩放,导致物体旋转时产生变形,产生了剪切变换的效果。

        在Editor手动调整物体旋转时,还需要注意一点是旋转中心。Editor左上角有一个Tool Handle Position,有两个选项,Pivot和Center,Center是指相对当前选中物体的中心,是渲染包围盒的中心。Pivot是当前物体的模型空间原点位置,如果是一个Empty GameObject,其Pivot就是它的坐标本身,一般可以通过这种方式设置任意旋转中心。

        当选中多个物体时, Center代表围绕所有物体的中心(中心位置是所有物体的包围盒中心)旋转,而Pivot代表围绕每个物体各自的原点。

旋转类比

        类比于之前的Hierarchy模型变换矩阵公式:

M_{local2worldB}=M_{A}* M_{B}

         四元数变换也类似,同样假设A是服务体,子物体B在世界空间的旋转Quaternion计算方式为:

Q_{worldB}=Q_{modelA} * Q_{modelB}

猜你喜欢

转载自blog.csdn.net/paserity/article/details/130000241