四元数—Quaternion

一、什么是四元数

在计算机图形学中,四元数用于物体的旋转,是一种较为复杂,但是效率较高的旋转方式。在三种坐标变换:旋转,平移,缩放当中,旋转应该算是比较复杂的存在。平常我们接触的比较多的是矩阵变换和欧拉变换。关于矩阵变换和欧拉变换,我这里不打算详细介绍,有兴趣的同学可以访问以下链接:

旋转矩阵: http://baike.baidu.com/view/180617.htm
欧拉角: http://baike.baidu.com/view/90087.htm

对于一个物体的旋转,其实我们只需要知道四个值:一个旋转的向量 + 一个旋转的角度。而四元数也正是这样的设计:
                            

                                                                                                                  
其中x,y,z 代表的是向量的三维坐标,w代表的是角度;同时我们也可以写成以下的形式方便我们计算和分析:
                           

                                                                                                                 
其实,四元数本质上是一个超复数,q = xi + yj + zk + w , i^2 = j^ 2 = k^2  = -1;

现在我们对四元数的概念应该有了一定的了解了,那么四元数是怎样体现在旋转上面呢?

二、四元数与旋转

现在我们先来看一个简单的例子:一个向量(1,1,0)绕Z轴(0,0,1)旋转90度,得到的旋转后的向量是多少?相信很多同学一看就知道答案:(-1,1,0)。
那我们用四元数来做应该怎么做呢?( 注:绕某轴旋转是指面对某轴然后顺时针旋转

这里简单的说一下利用四元数来做旋转的方式:
现在我们有一个向量:v1,要让它绕 v2 旋转 Θ 度,我们先把这个向量写成一个四元数:p = (v1, 0); 那么旋转的四元数则是:q = ( v2 * sin(Θ/2) , cos(Θ/2) ) ;旋转后的四元数为(得到的四元数实部为0,虚部为新的坐标):
                            

                                                                                                              
相乘:


四元数的共轭:



取模:



取逆:




在使用四元数旋转之前要注意:
1、用于旋转的四元数必须是单位四元数(即模为1)
2、实际参与旋转的四元数有两个:p 和 p的逆

现在大家可以算一下之前的问题

三、在Unity里使用四元数旋转

只需新建一个四元数,然后跟要旋转的向量进行左乘即可。

Vector3 begin = new Vector3(1, 1, 1);
Quaternion Antest = new Quaternion(0.5f, 0.5f, -0.5f, 0.5f);
Vector3 final = Antest * begin;



你可能感兴趣的:(C#,Unity)