Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

关于3D旋转

  旋转是咱再熟悉不过的东西了,之前的文章也一直在用,但是都没细说这玩意儿。三维的旋转到底是怎么回事呢?它不像二维旋转那么简单,我搞明白这个问题也是查了好多资料的。因为旋转是平面运动,而三维有无数个平面,所以三维的旋转并不适合使用固定矩阵。
  最基本的旋转是绕坐标轴旋转,三维空间中有xyz三条坐标轴,也就有三种旋转。比如绕着y轴旋转时就是y值不变xz值变化,也就是在xz平面做平面旋转。我们可以在任意两条坐标轴构成的平面上做平面旋转,重复这个操作就可以把坐标旋转到任何位置。以前绘制球体时候使用的参数方的两个参数,一个旋转了一周,一个旋转了半周。把这个两个参数做成矩阵后相乘就可以遍历到所有可旋转的坐标。所以只要做两次旋转就可以把坐标旋转到到任何位置。
  但是,如果直接取两个平面的旋转矩阵乘积来使用就会发现很不方便。因为它把很多参数固定了。比如我想绕z轴旋转a度,可是如果我在构造矩阵时取的平面是xz和yz,那就要计算xy和yz上需要旋转的度数来对应到xy平面上旋转的度数,这样会让开发者的计算量增加。对于三维的旋转我们不会用一个固定的矩阵来做。也许这个问题在坐标的旋转过程中只是为了操作方便而已吧,但是换做实际物体,情况就完全不同了。对实际物体的旋转就比单个坐标的旋转困难一些。用之前对坐标旋转的方法在两个平面上分别旋转一次未必可以把一个物体旋转到需要的位置,这就是传说中的万向节锁(gimbal lock)问题。物体需要做三次旋转才可以旋转到需要的位置。如果把这三次旋转写成同一个矩阵,就会遇上和顶点旋转一样麻烦的问题,需要开发者自己去计算很多东西。所以很多3D框架都是根据需求来动态构造旋转矩阵的。这是个好方法,我在WebGL的例子中也是使用了这个方法,只不过是人工构造的而不是自动生成的。
  这篇文章我想表达的东西就是3D旋转不适合使用固定矩阵。但是维基百科上对3D旋转的介绍内容很多,有欧拉角和四元数之类的。这些方法在某些特殊的情况下会用到。前面说的不使用固定矩阵而动态生成矩阵实际上就是Roll、Pitch、Yaw的概念。
  该图片来自维基百科

  这三个东西其实就是绕不同的坐标轴旋转,每一个旋转都可以得到一个平面旋转矩阵。我们所谓的动态生成就是把这些得到的平面旋转矩阵按旋转的先后顺序乘起来。这个方法对参数的要求很低,我们只要知道物体绕那个轴旋转多少就可以得出矩阵。而后面的欧拉角实际上就是这个方法的一种特殊情况,它是把三个坐标轴的平面旋转矩阵都相乘了。这样对计算机而言减少了很多矩阵相乘的计算量,但是对于开发者而言就需要去构造这个矩阵。比如我现在需要对x、y、x三个坐标轴顺序旋转若干度,把它转换成欧拉角的方式就非常困难,这和一开始使用固定矩阵做坐标旋转遇上的问题一样。最后还有角轴旋转的方法也可以让3D物体旋转到需要的位置。但是它的参数要求太苛刻了,要计算旋转轴本身就是一件非常困难的事情。除非有特殊的情况,比如给定旋转轴,或旋转轴很容易计算。
  这些特殊的旋转方式用的比较少,不过还是有必要了解下,在遇到特殊问题时候会用上的。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^