Unity3D 四元數的理解

2021-09-24 01:48:18 字數 1519 閱讀 5300

環境:unity2018.3 語言:c#

複數

首先我來考慮複數軸i,i的定義為i^2=-1。

按照旋轉的角度來理解的話,從1變換到-1,1實際上是旋轉了180度到了-1。那麼旋轉90度呢?這個時候實際上就旋轉到了複數軸上了,我們便用i來表示這個軸。

在2維空間中事情比較簡單。

設點p為(x, y),以複數的概念來看即為x+yi。如果旋轉θ度,則引入另乙個複數q=(cosθ, sinθ)。兩者相乘得到旋轉之後的點:

p』= pq = (x+yi)(cosθ +isinθ)

沒有三元數

在3維空間中簡單的增加乙個維度並不能達到想要的效果:

j軸垂直於實數軸,那麼肯定有j^2=-1,問題是ij的結果是什麼?

我們很容易想到是-1,但是如果ij=-1,結合i^2=-1,說明i=j,實際上j這個新軸是不存在的。

四元數

這個時候我們就需要假設乙個新的軸k,使得ij=k,同時k^2=-1。

得到i^2=j^2=k^2=-1。

我們可以想象i、j、k之間相互垂直組成3維空間,而實數跟他們分別垂直,可以想象出是單獨拿出來的一條線。

ij=k,ji=-k;

jk=i,kj=-i;

ki=j,ik=-j.

我們得到了以上結論,注意實數軸和複數軸的轉換跟複數空間中的不一樣,因為1*i直接到了複數空間的i軸,而不是乙個新軸。

這個結論其實很有意思,類似於我們以前學到的叉乘,同時可以用右手定則確定兩個虛軸相乘的結果。

最終我們得到由3個虛部組成的四元數[w, (x, y, z)]為 w + xi + yj + zk。

從軸角對的角度來看,一次旋轉實際上可以表示為乙個軸n和旋轉角度θ組成,四元數可由該軸角對來表示為[cos(θ/2) sin(θ/2)n]。

即[cos(θ/2) sin(θ/2)nx sin(θ/2)ny sin(θ/2)nz]。

對比

四元數很難理解,但是我們為什麼要用它呢?因為相比於其他兩種方式,有無可替代的優勢。

旋轉矩陣,計算機圖形學中,我們一直在學習矩陣,最方便解決旋轉的方式當然就是矩陣,並且矩陣的逆就是反角位移。

缺點是占用空間大,用了9個數;並且旋轉矩陣是病態的,有效數字只有3個,但卻需要6個數字去限制它們,很容易出現計算、取樣不精確的情況下,產生非法的旋轉矩陣。

第二種方式是尤拉角,尤拉角非常直觀,甚至如果我們的遊戲只需要乙個到兩個軸,完全可以使用尤拉角來處理問題。

但是尤拉角最大的問題是在插值的時候,可能會以我們相反的方向繞一圈進行插值;然後就是萬向死鎖,這個不做展開,只需要知道有這麼乙個底層問題。

四元數相比而言,最大的優勢就是能提供平滑的插值,同時能快速連線多個四元數,很輕鬆的求出四元數的逆。

工程上**寫了許久,很累,學習最多的還是溝通和**風格,技術上的進步比較少,所以最近想著把數學渲染什麼的過一遍。

Unity 3D 矩陣和四元數的研究

版本 unity 5.4.1 語言 c 2017年了,使用unity也有一段時間了,略有心得吧,基本上要求一些功能可以拼拼湊湊地做出來,算是入門了吧。不過很多遊戲上使用的技術還沒有接觸過,比如protobuf 熱更新 shader之類,今年的一開始接觸一下遊戲中常用的技術,然後shader方面好好入...

unity3d四元數和旋轉矩陣

quaternion中存放了x,y,z,w四個資料成員,可以用下標來進行訪問,對應的下標分別是0,1,2,3。主要介紹幾個函式 1 根據兩個向量計算出旋轉量,計算出來的旋轉量為從fromdirection旋轉到todirection的旋轉量 static quaternion fromtorotat...

unity3d四元數和旋轉矩陣

quaternion中存放了x,y,z,w四個資料成員,可以用下標來進行訪問,對應的下標分別是0,1,2,3。主要介紹幾個函式 1 根據兩個向量計算出旋轉量,計算出來的旋轉量為從fromdirection旋轉到todirection的旋轉量 static quaternion fromtorotat...