最近在研究物体的转动问题,想过用矩阵、角度,但处理起来都不怎么方便,特别是在插值方面,然后发现还是unity自带的Quaternion好用。Quaternion是一个四元数,大学里这一块数学没学好,只能通俗了解一下这个东西。
四元数是最简单的超复数。四元数都是由实数加上三个元素 i、j、k 组成,而且它们有如下的关系: i^2 = j^2 = k^2 = ijk = -1 , 每个四元数都是 1、i、j 和 k 的线性组合,即四元数一般可表示为a + bi + cj + dk 。(其中i^2=j^2=k^2=-1,ij=k,ji=-k,jk=i,kj=-i ki=j,ik=-j)。由此可知四元数没有交换律。
性质:
1.(a^2+b^2+c^2+d^2)的平方根 称为四元数的模
2.加法p + q
跟复数、向量和矩阵一样,两个四元数之和需要将不同的元素加起来
p + q =a+t+bi+xi+cj+yj+dk+zk = (a+t) + (b+x)i + (c+y)j + (d+z)k
3.乘法
4.点积
5.外积
6.
7.。。。等等好多性质,具体可以查看百度百科:Quaternion
在unity中U3d已经有封装好的函数了;那么这个Quaternion到底是个什么样的东西呢?
uaternion 中 (x,y,z) 跟旋转轴有关, w 与绕旋转轴旋转的角度有关,因为它们都要经过代数运算才能得出旋转轴和旋转角度
在unity3d中, quaternion 的乘法操作 (operator * ) 有两种操作:
(1) quaternion * quaternion , 例如 q = t * p; 这是将一个点先进行t 操作旋转,然后进行p操作旋转.
(2) Quaternion * Vector3, 例如 p : Vector3, t : Quaternion , q : Quaternion; q = t * p; 这是将点p 进性t 操作旋转;
我进行的是第2种操作,即对一个向量进行旋转;
首先 ,Quaternion 的基本数学方程为 : Q = cos (a/2) + i (x * sin(a/2)) + j (y * sin(a/2)) + k(z * sin(a/2)) (a 为旋转角度)
Q.w = cos (angle / 2)
Q.x = axis.x * sin (angle / 2)
Q.y = axis.y * sin (angle / 2)
Q.z = axis.z * sin (angle / 2)
我们只要有角度就可以给出四元数的四个部分值,例如我想要让点M=Vector3(o,p,q) 绕x轴顺时针旋转90度;那么对应的quaternion数值就应该为:
Q : Quaternion;
Q.x = 1 * sin(90度/2) = sin(45度) = 0.7071
Q.y = 0;
Q.z = 0;
Q.w = cos(90度/2) = cos (45度) = 0.7071
Q = (0.7071, 0 , 0 , 0.7071);
m = Q * m; (将点m 绕 x轴(1,0,0) 顺时针旋转了90度)
var m : Vector3;
var t1 : Quaternion;
m = Vector3(1,0,0);
t1 = Quaternion(0.7,0,0,0.7);
m = t1*m ;
var m : Vector3;
var t1 : Quaternion;
m = Vector3(1,0,0);
t1 = Quaternion(0.7,0,0,0.7);
m = t1*m;
这是quaternion 的最基本用法,只要给出角度,就可以算出Quaternion,然后进行旋转。