一、变换的前提
考虑坐标变换时候,一定要分清楚几个前提条件:
1.当前是否需要进行变换,通过一些相对位置是否能够求取出来; 通过中间位置(屏幕位置)得到结果,或者通过方便的函数计算出来,不需要自己计算,如UnityEngine.RectTransformUtility.ScreenPointToLocalPointInRectangle。
2.当前是左手坐标系还是右手坐标系。(cocos2dx中用的就是右手坐标系,而u3d中世界坐标系是左手坐标系),不同坐标系统,z轴定义不同基于观察坐标系的左右翻转,旋转角度不同,绕序正面不同,矩阵是行矩阵还是列矩阵定义不同,向量乘以矩阵顺序不同,四元数乘法规则和乘法顺序不同。
3.当前是变换物体,还是变换坐标系,变换坐标系也要基于变换物体的逆来考虑。
4.变换的顺序,连续变换的顺序,基于父节点要先进行缩放->旋转->平移才能得到正确的结果。
二、理论层面理解
1.不同坐标体系,旋转定义规则,不同矩阵定义规则,四元数乘法定义规则,变换会不同。
2.简化变换的思想
:
使用
惯性坐标系
(惯性坐标系是世界坐标系平移到物体坐标系的位置)可以简化物体-世界,世界-物体,或者说任何两个坐标系间的转换做一个中间的转换,使问题变得简单。使用
嵌套坐标系(父坐标系-子坐标系-子坐标系)也可以分解问题,简化复杂的变换逻辑。
其实把问题简单化思考的方法,不外乎实例化,拆分它,转换它,再组合转换抽象回来,就可以很elegant的解决问题了。