两种绕轴旋转方式

3,787 阅读2分钟

绕轴旋转方式

  在Unity里,欧拉旋转的旋转顺序是Z、X、Y,这在相关的API文档中都有说明,API文档。其实文档中说得不是非常详细,还有一个细节我们需要明白。如果你仔细想想,就会发现有一个非常重要的东西我们没有说明白,那就是旋转时使用的坐标系。给定一个旋转顺序(例如这里的Z、X、Y),以及它们对应的旋转角度(α,β,r),有两种坐标系可以选择:

  • 绕坐标系E下的Z轴旋转α,绕坐标系E下的Y轴旋转β,绕坐标系E下的X轴旋转r,即进行一次旋转时不一起旋转当前坐标系;
  • 绕坐标系E下的Z轴旋转α,绕坐标系E在绕Z轴旋转α后的新坐标系E'下的Y轴旋转β,绕坐标系E'在绕Y轴旋转β后的新坐标系E''下的X轴旋转r, 即在旋转时,把坐标系一起转动;

  很容易知道,这两种选择的结果是不一样的。但如果把它们的旋转顺序颠倒一下,其实结果就会一样。说得明白点,在第一种情况下、按ZXY顺序旋转和在第二种情况下、按YXZ顺序旋转是一样的。证明方法。而Unity文档中说明的旋转顺序指的是在第一种情况下的顺序。
  也就是说

  transform.Rotate(new Vector3(30, 90, -40));

  transform.Rotate(new Vector3(0, 90, 0));
  transform.Rotate(new Vector3(30, 0, 0));
  transform.Rotate(new Vector3(0, 0, -40));

这两种旋转物体的结果是一样的。进一步说明了

  transform.Rotate(new Vector3(30, 90, -40));

用的是第一种旋转,而后面的三句则是使用的第二种旋转

总结

  更详细的解释说明可以去看这篇文章