在平时的开发中,经常会遇到旋转的操作,也因此经常会接触到四元数的相关概念。但是,这个概念说难不难,但是理解起来也挺费劲的。
我经常会使用到四元数,但是每次使用时都会查资料,当时理解了概念,但是过两天又忘记了,当再次使用的时候,又要重新查资料。挺蛋疼。于是就写一篇博客,关于四元数,算是加强印象。
先放一篇对四元数讲解的非常详细的博客:
https://blog.csdn.net/candycat1992/article/details/41254799
我看过这篇博客之后,对四元数又作了一些简要的提炼。下面只描述我 是如何理解四元数的。
四元数的主要作用是用来解决旋转问题的,因此,我们必须知道两个条件,一个是旋转轴(一般是一个归一化向量),一个是旋转的角度,还有一个已知的是我们要旋转的原始顶点 或者 向量。
这样问题就转化成了3个已知数:
P : 要旋转的源顶点 或者 向量
Y:要围绕其旋转的旋转轴(这里用Y来表示是假定我们用Y轴来旋转,易于理解)
θ: 要旋转的角度
求出 旋转 之后的 目标 顶点坐标 或者 向量
面对这个问题。我们要构造出两个四元数,一个四元数与P有关,一个四元数与Y和 θ 有关,其中:
与P有关的四元数是 在P的顶点坐标后面直接补一个0,简单粗暴,即(P,0)
与Y和 θ 有关的四元数也不难, 就是 (Y * sin(θ / 2) , cos( θ / 2))
好了,现在我们两个四元数都构造好了,剩下就是套公式了。也许公式理解起来很头疼,但是我们可以不用管公式的推倒过程,直接记结果,拿起笔直接算好了:
结果:要求的结果 X = (Y * sin(θ / 2) , cos( θ / 2)) * (P,0) * ( -Y * sin(θ / 2) , cos( θ / 2))
这是公式,计算出来的结果X其实也是一个四元数,比如(x,y,z,w),这个四元数前三位的值(x,y,z)即是我们所求的旋转过后的点 或者 向量 (具体的如何计算这个公式可以看前面博客提到的那篇博文)
不过好在,目前我们是信息时代,这些复杂的数学计算就交给计算机去做了。不过它的原理我觉得我们还是有必要去了解的。By the way, 我们平时在用Unity的时候也可以用Unity提供的Api去计算旋转什么的。也很方便。