Unity3D 四元数的常用方法

Posted 暗光之痕

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D 四元数的常用方法相关的知识,希望对你有一定的参考价值。

环境:Unity2018.3 语言:C#

 

总起:

本文主要参考《3D数学基础:图形与游戏开发》。

 

四元数:

负四元数:

q=-q,同一个四元数有两个表示方式,他们互相为负。(下文只举四元数的一种形式)

 

单位四元数:

[1, 0],即cos(θ/2)=1,θ为4πk,则sinθ=0,不管轴是什么,不进行旋转就是本身。

 

对应Unity中的Quaternion.identity。

 

四元数的模:

|q|=sqrt(w^2 + x^2 + y^2 + z^2)=sqrt(cos(θ/2)^2+sin(θ/2)^2 |n|^2)。关于旋转,我们只讨论单位四元数。

 

对应Unity中的Quaternion.Normalize。

 

四元数的共轭:

q*=[w, n]*=[w, -n],四元数的逆q-1=q* / |q|,因此单位四元数下,共轭和逆是相同的。

 

对应Unity中的Quaternion. Inverse。

 

四元数的叉乘:

[w1, n1]*[w2, n2] = [w1w2-n1·n2  w1n2+w2n1+n2*n1]

 

叉乘代表的是旋转的累加。

 

假设有一个标准点p(x, y, z)=[0, (x, y, z)],绕着n旋转θ,即q=[cos(θ/2), sin(θ/2)n],可以得到p’=qpq-1

 

但是这里带来一个问题,假设p’=b(apa-1)b-1 = (ba)p(ba)-1,这边的ba因为向量部分叉乘后的结果是相反的,导致内部向量变成ab的形式了,这样就不能继续对p进行变换了,因为顺序发生了改变。

 

为了解决以上问题,我们把标准公式改为下面的形式:

[w1, n1]*[w2, n2] = [w1w2-n1·n2  w1n2+w2n1+n1*n2]

 

则p’的结果也会发生变化:

p’=q-1pq

 

我们可以看到Unity中的实现就是如此:

 

对应Unity中的方法是Quaternion.operator*。

 

四元数的差:

角位移d=a-1b,a和b是两个方位,以上公式根据两个方位算出需要经过的角位移。

 

对应Unity中的方法是Quaternion. FromToRotation。

 

四元数的点乘:

q1·q2=w1w2+x1x2+y1y2+z1z2

 

跟两个向量做点乘效果一模一样,所代表的是两个四元数的相似性。结果是1,则两个四元数相同;结果是0,则如果一个四元数一个轴旋转90度,另一个四元数旋转270度。(得出的结果可能是-1,但是跟1的结论是一样的,所以一般得到结果之后我们会取绝对值)

 

对应Unity中的方法是Quaternion. Dot;还有判断两个四元数是否使用了该方法:

 

四元数的构造方法:

Quaternion.Euler(Vector3)  以欧拉角创建四元数

 

Quaternion.AxisAngle(Vector3,float)  相对于某个方向旋转某个角度的四元数

 

Quaternion.FromToRotation(Vector3,Vector3)  起始方向到结束方向的四元数

 

Quaternion.LookRotation(Vector3)  朝向为正方向,旋转轴为上方向,旋转到想要方向的四元数

 

没有讲到的部分:

四元数的对数、指数和标量乘在游戏中较少使用,这边不花精力去研究了。

 

还有个非常重要的方法:插值。关于这部分,我想单独起一篇文章来说明。

以上是关于Unity3D 四元数的常用方法的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D 四元数的理解

Unity3D 控制物体旋转详解 —— 自身绕轴旋转缓慢旋转鼠标控制旋转欧拉数和四元数的关系

四元数quaternion

如何在Unity中获得2个四元数的相对旋转

unity--------------------四元数的旋转与原理

如何缩放四元数的旋转