四元数与旋转矩阵和欧拉角相比,除了能够解决万向锁这样的问题和计算方便之外,我认为最大的优点就是符合人们的认知习惯。一轴一角度就和一点一方向一样,成为解决三维几何计算的核心工具。
四元数的历史跟一个人相关,那就是欧拉。他证明了一个旋转序列等价于单个旋转。因此3D中任意角位移都能表示为绕单一轴的旋转。并且四元数成功避免了万向锁问题。我们有些时候不必再去思考“先绕x轴转还是先绕y轴转”这样的问题,因为对于三维空间抽象能力欠缺的新手来说,这是很头疼的一件事情。
记得我刚使用四元数的时候,是为了简化计算。假设给了一个点P,然后需要计算这个点绕某个轴旋转60°以后得到的新点P’坐标。如果利用传统几何来解决,肯定是要计算一大堆sin,cos的问题。后来发现四元数可以很轻松的应付这个问题。再之后就是从Ogre引擎里面找到了这个类Quaternion,使用起来也很方便。
说来惭愧,刚入门的时候,对四元数理解不够深刻。例如,上面那个问题,我可以首先根据旋转轴和旋转角度计算出四元数。然后,我天真的以为,接下来直接将四元数与原来的点坐标进行“乘法”,就得到新的点坐标了。突然,我发现,由于我使用的旋转轴实际上是一个向量,而这个向量,实际上代表了一组平行向量,如此说来,空间中平行的旋转轴,对于同一个旋转角度,构建的四元数都是相同的?难道说,对于同一个点P,绕这么多空间中不同的旋转轴旋转同一个角度,得到的新点P’坐标都是相同的?
显然得到的坐标应该是不同的。我百思不得其解。到底是哪里出了问题?难道我使用四元数的方法有问题?多番求证,发现自己犯了一个很致命的错误。那就是理解上的误区。呵呵。四元数的旋转轴矢量和我们感性理解的固定旋转轴不是一个概念。具体我就不解释了,可以参见一下我以前写在笔记上的一段话:现在看起来虽然很傻,但也是一种思维上的变化,值得回味。
具体四元数在三维软件中的应用就有很多了。例如模型的交互式旋转等等。下一节着重讨论关于四元数插值的应用。
评论