最近对Transform.LocalToWorldMatrix的矩阵很好奇,想知道它具体是怎么得到的,于是做了验证。
- 旋转顺规
首先,unity的旋转顺规世界系下是zxy,自身系是yxz,可以这样理解:
世界系下zxy顺规:表示的是别的系转到世界系下的顺规,而且是以z-x-y旋转先后顺序旋转。如,局部系L先绕z轴转到1系下,1系绕x轴转到2系下,2系绕y轴转到世界系W下。公式表示(这个公式对应LocalToWorldMatrix,R表示旋转矩阵):
自身系下yxz顺规:表示别的系转局部系的顺规,是以y-x-z先后顺序旋转。如,世界系W先绕y轴转到1系下,1系绕x轴转到2系下,2系绕z轴转到局部系L下。公式表示(这个公式对应WorldToLocalMatrix): - 旋转欧拉角
对于Inspector面板上的transform组件,在Rotation中的xyz旋转角都是相对于世界系下的旋转角,也就是世界系下的旋转角。不用改符号直接用于局部系转世界系中。
对于z轴,由世界系转成局部系:角度由0转到90,角度增加,z坐标轴旋转方向:从头看是顺时针旋转,所以定义从头看顺时针旋转为正。
所以按理说由世界系转成局部系时角度值应以该角度值带入矩阵计算,局部系转世界系时应以该角度的负值代入计算。但是这里矩阵计算时正好相反。
结论: 由局部系转成世界系:面板上该角度计算
由世界系转成局部系:面板上该角度的负值计算 - 举例
以上面Inspector表示的旋转,计算LocalToWorldMatrix与WorldToLocalMatrix矩阵。
- [ 1] 旋转其次坐标变换
- [ 2] LocalToWorldMatrix计算
将欧拉角z=90,x=30,y=0分别带入上述矩阵,得到: - [ 3] WorldToLocalMatrix计算:
将欧拉角y=0,x=-30,z=-90分别带入上述矩阵,得到:
当然,LocalToWorldMatrix与WorldToLocalMatrix互为逆矩阵,所以,可以由LocalToWorldMatrix求逆得到WorldToLocalMatrix。
逆矩阵可以这样求:
公式参考:机器人学.蔡自兴.pdf,自己去下吧。