四元數簡介


在我之前,網上各個博客各大網站都有很多關於四元數的介紹與講解!但我總結了一下接三個字:看不懂!

說實話!

這真的是實話!

舉個例子:

      1.  旋轉,應該是三種坐標變換——縮放、旋轉和平移,中最復雜的一種了。大家應該都聽過,有一種旋轉的表示方法叫四元數。按照我們的習慣,我們更加熟悉的是另外兩種旋轉的表示方法——矩陣旋轉和歐拉旋轉。矩陣旋轉使用了一個4*4大小的矩陣來表示繞任意軸旋轉的變換矩陣,而歐拉選擇則是按照一定的坐標軸順序(例如先x、再y、最后z)、每個軸旋轉一定角度來變換坐標或向量,它實際上是一系列坐標軸旋轉的組合。

 

那么,四元數又是什么呢?簡單來說,四元數本質上是一種高階復數(聽不懂了吧。。。),是一個四維空間,相對於復數的二維空間。我們高中的時候應該都學過復數,一個復數由實部和虛部組成,即x = a + bi,i是虛數單位,如果你還記得的話應該知道i^2 = -1。而四元數其實和我們學到的這種是類似的,不同的是,它的虛部包含了三個虛數單位,i、j、k,即一個四元數可以表示為x = a + bi + cj + dk。那么,它和旋轉為什么會有關系呢?

怎么樣,看得懂嗎?反正小編是被現實胖揍一頓!

那么,今天我們要怎么來介紹這個四元數呢?

我們來最簡單暴力的!

                                                                                                                         

重新定義一下這個怪物四元數!

Quaternion(四元數)用於計算和表示Unity旋轉。它們計算緊湊高效,不受萬向節死鎖的困擾,並且可以很方便快速地進行球面插值。

 Unity內部使用四元數來表示所有的旋轉。

注意重點:

1,不受萬向節死鎖的困擾。

2,方便快速地進行球面插值。

3, Unity內部使用四元數來表示所有的旋轉。

好了,現在你得重定義應該是這樣的:

 定義:Quaternion(四元數)用於計算和表示Unity旋轉。

就像當初數學老師告訴你∏(pai)用來表示圓周率一樣!

你有探究過∏(pai)是怎么算出來的嗎?

但是你們是不是都知道怎么利用圓周率計算圓的面積呢?

類似的,對於初學者的我們,最重要的是現在要學會和記住四元數的使用方法。

我們來簡單介紹一下:

1,四元數,顧名思義他有四個參數(x,y,z,w).(與三維坐標(x,y,z)相比,多了一個w參數!也是四元數最神秘的一個參數!)

2,xyzw的取值范圍是[-1,1]。

3,初始值: (0,0,0,1)。

4,沿着y軸旋轉:

180°(0,1,0,0) 

360°(0,0,0,-1)

540°(0,-1,0,0) 

              720°(0,0,0,1)
5,沿着x軸旋轉:

                                            180°(-1,0,0,0) 

                                            360°(0,0,0,-1)

                                            540°(1,0,0,0) 

                                            720°(0,0,0,1)
6,無旋轉的寫法是Quaternion.identify。

我們來介紹幾個常用的方法(可以當作數學公式記憶):

  • Quaternion.LookRotation創建一個旋轉,沿着forward(z軸)並且頭部沿着upwards(y軸)的約束注視。也就是建立一個旋轉,使z軸朝向view y軸朝向up。

  • Quaternion.Angle返回a和b兩向量之間的角度。

  • Quaternion.Euler返回一個旋轉角度,繞z軸旋轉z度,繞x軸旋轉x度,繞y軸旋轉y度(像這樣的順序)。

  • Quaternion.Slerp球形插值,通過t值from向to之間插值。參數取值范圍[0,1]。

  • Quaternion.FromToRotation從fromDirection到toDirection創建一個旋轉。

  • Quaternion.identity同一性旋轉(只讀)。

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)

上邊這段有背景色的話基本上用不到,學有余力的同學可以深入研究一下!!

我們暫時能用到的四元數運算有兩個:

1,四元數*四元數=四元數

例如:

quaternion * quaternion ,  q = t * p; 這是將一個點先進行t 操作旋轉,然后進行p操作旋轉.

2,四元數*三維向量=三維向量(特別注意:一定要是四元數在前,三維向量在后的乘法)。

例如 :

Quaternion * Vector3

t : Quaternion 

p : Vector3

q:Vector3

q = t * p; 這是將點p 進性t 操作旋轉;

特別注意:四元數*三維向量得到的是三維向量經四元數旋轉操作后的三維向量。結果是一個三維向量!

關於四元數我們就先介紹這么多吧!有想深入了解的同學可以參看以下網站:

http://blog.csdn.net/candycat1992/article/details/41254799

https://www.cnblogs.com/driftingclouds/p/6626183.html

我們要用到坦克炮台旋轉的知識點是:

Quaternion.Slerp球形插值,通過t值from向to之間插值。參數取值范圍[0,1]。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM