Ogre中的四元數Quaternion類

2021-06-16 03:58:08 字數 4251 閱讀 3156

四元數最早是為了擴充套件複數應用而產生與發展起來的。然而,人們發現四元數也可以應用在計算機圖形學上,作為表現旋轉的可選擇方法之一。

普通的複數形式可以寫成

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...