Unity3D之四元数

来源:互联网 发布:golang syscall.kill 编辑:程序博客网 时间:2024/05/14 08:32
四元数,对于我以前的经历来说,是一个新的数学概念,即不同于以前的算法。**先介绍一下一些概念:**超复数:简单的说,就是在以前复数的基础上又发现了新的数据表示方式或者说是新的空间表示,例如a+bj就是实数与复数的组合,但是只有一个复数(所以没有超),有了两个以上类似于复数的表示就是超复数了。四元数:是一个简单的超复数,三元数是不存在的,是因为不符合模法则,其形式:a+bj+ci+dk,i,j,k就想象成复数j的符号。**在这里进入正题:**在Unity3D中,四元数主要被运用在模型旋转上,表示方式P=(W1,V),其中w表示一个实数,V表示向量,为了方便V就是上面对应统称的复数部分。在Unity3D中我们使用P=(cos(A/2),(V)sin(A/2))使用该方法将物体旋转A度(这里我没有说是沿着哪个方向,里面会有左手定则或者右手定则的问题)。Problem:将点U(1,0,1)旋转A度后得到的U'是多少?Answer:(1)将U进行四元数拓展,形成与上述P相同的形式,因为向量就可以看做是复数部分,所以拓展之后是U=(W2,U);(2)计算公式:U'=PU(P-1);(这里的P-1是指四元数P的逆)有关于上述计算过程的公式:PU = (W1*U+W2*V+VxU,W1*W2-V*U);P* = (W1,-V);|P|=sqrt(pow(a,2)+pow(b,2)+pow(c,2)+pow(d,2));P-1 = p*/|p|;在这里补充一句:有关于两个向量的点乘和叉乘。点乘的运算:直接相对应维度的数值进行相乘之后然后相加叉乘的运算AxB:按照三维行列式进行计算[i,j,k;a,b,c;l,m,n],其中(a,b,c)与(l,m,n)分别是A与B的向量。至于二维向量,自己去添加一维,第三维按照0去计算。在这里大家最好去计算一下,我也是看了一位博主的博客,博主要求去计算,计算之后收获挺多的,顺便去复习一下矩阵或者是向量的知识。最终算出的答案是(1,0,-1)。在这里参与四元数运算的四元数的模值都是1。即U是单位向量,P因为有三角函数的原因,所以它的模值也是1。**Unity中四元数的使用**Unity当中提供了一些函数去创建四元数,其中使用Quaternion.AngleAxis(float angle,new Vector3 axis);angle代表的是旋转的角度,axis代表的是旋转轴。在得到四元数的角度之后,使用一个Vector3与它进行左乘,然后就可以得到旋转之后的坐标点,就类似于上述的方法U'=PU(P-1)。如果想要进行多次旋转,再对其进行左乘就可以了。例如:Vector3 newVector = Quaternion.AngleAxis(90, Vector3.up) * Quaternion.LookRotation(someDirection) * someVector;知识补充:旋转的方法有,矩阵旋转:[x',y']=[x,y][cosA,sinA;-sinA,cosA],其中[x,y]是原坐标向量,A是旋转的角度,[x',y']是旋转之后的坐标向量。在其中向量的长度是不改变的,根据三角函数进行推导:欧拉旋转:在三维空间中的有限转动,可依次用三个相对转角表示,即进动角、章动角和自旋角,这三个转角统称为欧拉角。所以当旋转当中间轴旋转90度的时候,里面的轴会随着中间轴旋转,但是最外层的轴不动,这样会导致里面的轴与外层轴处于同一平面。万向锁就是物体的旋转并没有按照预期的进行旋转,因为在这种情况下需要将两个轴分离之后再次进行旋转。具体的可以看此视频:http://v.youku.com/v_show/id_XNzkyOTIyMTI=.html;四元数旋转:略。(新人多多指教,有错误之处,还请指出,谢谢)
0 0
原创粉丝点击