四元數最早是為了擴充套件複數應用而產生與發展起來的。然而,人們發現四元數也可以應用在計算機圖形學上,作為表現旋轉的可選擇方法之一。
普通的複數形式可以寫成
xi+y
,其中x
是虛部,
y是實部。不可思議的是
i的平方等於
-1,那個
-1的平方根就像你應該知道的那樣,其並不存在。因此取名叫「虛數
」。假如xi + y
是乙個複數,那麼我們可認為四元數是一組很特別的複數。四元數不只乙個虛部,而是有三個。四元數的形式可寫成
xi + yj + zk + w
,在這裡i、
j、k的平方都等於
-1。從現在起,讓我們忘記四元數中平方根的形式,其就可寫成這樣
[w,(x y z)]
。四元數可用來表現所有形式的旋轉。正如你所看到,四元數僅需要四個浮點數,所以它只是給對應的矩陣新增了第四個數而已。這個屬性可有助於將你許多的旋轉處理儲存到檔案中去(例如關鍵幀動畫)。但你如何獲取源於
[w,(x y z)]
的旋轉呢?
答案在這,你首先需要計算你的四元數的模。四元數的模與向量的有點相似。它可做
sqrt(w2 + x2 + y2 + z2)
的計算。假如平均值為
1,你就得到所謂的單位四元數(正象單位向量)。唯一的是四元數需要表現旋轉,因此你必須對現有的四元數進行歸一化。
四元數並不天生就具有旋轉的特性,因此你還要做一些轉換四元數或其它的一些必要工作。你可將儲存空間的四元數轉換為尤拉角或軸
/角的表示法,及轉換為可供
opengl
使用的矩陣。我們平常描述某個點饒某個軸旋轉往往是用軸
/角形式描述,例如:點p饒
a軸旋轉
θ 度。那麼描述這個旋轉的四元數就定義為:
q = (c
,s xa
,s ya
,s za
)。其中
s = sin(θ/2)
,c = cos(θ/2)
。a
θ
零四元數
quaternion quaternion::zero(0.0,0.0,0.0,0.0);
單位四元數
quaternion quaternion::identity(1.0,0.0,0.0,0.0);
帶四個引數的建構函式,為w,
x,y,
z賦值。
quaternion::quaternion (real fw, real fx, real fy, real fz)
拷貝建構函式
quaternion::quaternion (const quaternion& rkq) 由
3*3旋轉矩陣生成四元數,引數是旋轉矩陣。
void quaternion::fromrotationmatrix (const matrix3& krot)
將四元數轉換為旋轉矩陣,引數是回傳引數,接收得到的旋轉矩陣。
void quaternion::torotationmatrix (matrix3& krot) const
從角、軸生成四元數,引數為角和軸,即饒什麼軸旋轉多少度。
void quaternion::fromangleaxis (const real& ***ngle,
由四元數生成軸、角表示法的角和軸。引數是引用引數,回傳用途。
void quaternion::toangleaxis (real& ***ngle, vector3& rkaxis) const 由
3個向量表達的旋轉矩陣生成四元數,引數是指標指向的多個向量表達的旋轉矩陣(一般為3個)
void quaternion::fromaxes (const vector3* akaxis) 由
3個向量表達的旋轉矩陣生成四元數
void fromaxes (const vector3& xaxis, const vector3& yaxis, const vector3& zaxis);
由四元數生成旋轉矩陣,該矩陣由指標指向的多個(
3個)向量表達。
void toaxes (vector3* akaxis) const;
由四元數生成旋轉矩陣,該矩陣由
3個向量表達。
void toaxes (vector3& xaxis, vector3& yaxis, vector3& zaxis); 過載
=操作符
quaternion& operator= (const quaternion& rkq); 過載
+操作符
quaternion operator+ (const quaternion& rkq) const; 過載
-操作符
quaternion operator- (const quaternion& rkq) const; 過載
*操作符,四元數
*四元數。
quaternion operator* (const quaternion& rkq) const; 過載
*操作符,四元數
*標量。
quaternion operator* (real fscalar) const; 過載
*操作符,四元數
*四元數。過載為友員方式。
friend quaternion operator* (real fscalar, const quaternion& rkq);
過載負號操作符
quaternion operator- () const; 過載
==操作符
bool operator== (const quaternion& rhs) const;
四元數點乘
real dot (const quaternion& rkq) const;
四元數求模
real norm () const;
四元數求倒數,要求本四元數非0
quaternion inverse () const;
單位四元數求倒數,要求本四元數為單位四元數。
求四元數的指數,即
e的四元數次方
quaternion exp () const; 以
e為底求四元數的對數
quaternion log () const;
用四元數旋轉向量(似乎
nvidia
的sdk
才支援)。
vector3 operator* (const vector3& rkvector) const;
靜態成員函式,球面線性插值。引數ft為
0-1的時間因子。
static quaternion slerp (real ft, const quaternion& rkp, const quaternion& rkq);
靜態成員函式,帶干擾因子的球面線性插值。引數ft為
0-1的時間因子。
static quaternion slerpextraspins (real ft, const quaternion& rkp, const quaternion& rkq,
int iextraspins);
靜態成員函式,目前不清楚用途。
static void intermediate (const quaternion& rkq0,
const quaternion& rkq1, const quaternion& rkq2,
quaternion& rka, quaternion& rkb);
靜態成員函式,樣條插值(二次插值)。目的是在已知樣條形狀的情況下,通過插值得到平滑的目的線條。ft為
0-1的時間因子。
rkp和
rkq為樣條的起點和終點,而
rka和為
rkb插值過程中的某一線段的起點和終點(控制點連線)。p
q a
b p
q a
b 對ab
段插值對新的
ab段插值
static quaternion squad (real ft, const quaternion& rkp,
const quaternion& rka, const quaternion& rkb,
const quaternion& rkq);
過載輸出流操作符。
inline _ogreexport friend std::ostream& operator <<
( std::ostream& o, const quaternion& q )
四元數乘法 剛體旋轉中的四元數
四元數博大精深,用途之一圖形學中的三維旋轉。單純從應用角度考慮,四元數可以以如下方式應用於旋轉。旋轉示意圖 假定我們有乙個經過原點的旋轉軸 其中 則,3d旋轉可以通過四元數乘法來表示 1 其中,為單位四元數,等價於 和 分別為 的共軛和逆。對於單位四元數而言 根據式 1 結合四元數的乘法,可以完成一...
關於Ogre四元數類的一些解釋
靜態資料成員 quaternion quaternion zre 0.0,0.0,0.0,0.0 零四元數 quaternion quaternion identity 1.0,0.0,0.0,0.0 單位四元數 建構函式 ogre quaternion quaternion real fw 1.0...
Unity中四元數quaternion的學習筆記
筆記來自 遊戲引擎架構 jason gregory著 第二版,4.4四元數,page144。3 3矩陣可以表示三位中的任何旋轉,但是他又三個問題。1.9個浮點型表述只有三個自由度的旋轉顯得多餘。2.矩陣乘法過於複雜對於計算機來說,我們需要運算更快的旋轉方法。3.不能平滑插值。如此,我們有quater...