0810学习 agile Posted on Aug 10 2023 面试 unity基础 **旋转顺序** --- ![Snip20230811_14.png](https://tools.nxcloud.club:12500/images/2023/08/11/Snip20230811_14.png) ![Snip20230811_15.png](https://tools.nxcloud.club:12500/images/2023/08/11/Snip20230811_15.png) --- **旋转方式比较** --- ![Snip20230811_16.png](https://tools.nxcloud.club:12500/images/2023/08/11/Snip20230811_16.png) ![Snip20230811_17.png](https://tools.nxcloud.club:12500/images/2023/08/11/Snip20230811_17.png) --- **万向锁数学表现** --- 假设我们要对行向量采用α-β-γ欧拉角顺序的旋转,以下为这个旋转的矩阵表示形式: ![v2-2b251d418460cb5600e70ddada91b45f_b.png](https://tools.nxcloud.club:12500/images/2023/08/15/v2-2b251d418460cb5600e70ddada91b45f_b.png) --- 当β为π/2时,上式变为: ![v2-2ac2b50c9658dd87f123903ac9941b25_b.jpg](https://tools.nxcloud.club:12500/images/2023/08/15/v2-2ac2b50c9658dd87f123903ac9941b25_b.jpg) --- 将上式进行整理,得到: ![v2-4e73edfc8a2fcaff8497a925a8e04a3b_b.jpg](https://tools.nxcloud.club:12500/images/2023/08/15/v2-4e73edfc8a2fcaff8497a925a8e04a3b_b.jpg) `也就是可以理解为如果绕着Z轴转α度,绕着X轴转π/2,绕着Y轴转γ度,可以只通过绕Z轴(α+γ)度,绕着X轴转π/2来达到相同的作用,当然还可以通过绕X轴转π/2,绕Y轴转(α+γ)度达到相同效果` --- 万向锁就是:`在指定旋转顺序下,绕第二轴旋转正或负90至使一三两轴平行或反向平行,一三两轴成了等效轴,于是物体由原来的可绕三个轴旋转变为只能绕两个轴旋转,丢失了一个旋转自由度`。 `另外还还可以看到,当发生万向锁时,rotation所对应的欧拉角不唯一,如果一三两轴平行,则绕第一轴的旋转角A1和绕第三轴的旋转角A3之和不变即可保证rotation不变;如果一三两轴反向平行,则只要A1和A3之差不变,即可保证rotation不变` --- ![v2-d70bd25b4a7384e22fc75c89a4491739_b.jpg](https://tools.nxcloud.club:12500/images/2023/08/15/v2-d70bd25b4a7384e22fc75c89a4491739_b.jpg) 这个非常好理解,以上面这个飞机为例,假定开始时飞机自身坐标系和世界坐标系重合,此时我们按照`yaw—pitch—roll`的顺序,首先绕自身`z`轴(此时也是`世界坐标系的z轴`),就像转陀螺一样,飞机进行一定角度的旋转,然后绕自身`y轴旋转π/2`,此时你会发现飞机`自身x轴和第一次旋转的z轴在世界坐标系里重合`了,再进行第三次旋转的时候,以世界坐标系的角度来看,这和第一次旋转起到相同的效果 --- 万向锁产生的根本原因为旋转存在顺序,由于万向锁的存在,导致一组欧拉角和最终的旋转矩阵并非一一对应关系,从而难以模拟一些插值过程,如在动画的某些帧中产生预期外的移动等 --- **规范欧拉角** --- ![Snip20230811_19.png](https://tools.nxcloud.club:12500/images/2023/08/11/Snip20230811_19.png) --- **物体Transform变换顺序** --- Scale、Rotation、Translate变换的顺序为`Scale->Rotate->Translate` 首先看Scale希望沿xyz轴变换,如果rotate在前,会导致物体的xyz轴和初始的xyz轴不重合,scale的结果根据rotate的结果而不同,所以scale在前,rotate在后;再看rotate和translate的顺序,如果translate会导致物体的中心和初始中心不重合,而rotate是希望按物体中心旋转的,translate后的旋转是按初始中心旋转,会使translate的结果被修改,所以translate在rotate后。 --- 0831学习 0801学习