3D中的方位和角位移(7)

2021-04-29 21:13:34 字數 3085 閱讀 4101

從四元數轉換到矩陣

為了將角位移從四元數轉換到矩陣形式,可以利用旋轉矩陣,它能計算繞任意軸的旋**

這個矩陣是用n和θ表示的,但四元數的分量是:

w = cos(θ/2)

x =nx sin(θ/2)

y =ny sin(θ/2)

z =nz sin(θ/2)

讓我們看看能否將矩陣變形以代入w、x、y、z,矩陣的9個元素都必須這樣做。幸運的是,這個矩陣的結構非常好,一旦解出對角線上的乙個元素,其他元素就能用同樣的方法求出。同樣,非對角線元素之間也是彼此類似的。

考慮矩陣對角線上的元素,我們將完整地解出m11

,m22

和m33解法與之類似:

m11 =nx

2(1 - cosθ) + cosθ

我們將從上式的變形開始,變形方法看起來像是在繞圈子,但你馬上就能理解這樣做的目的:

現在需要消去cosθ項,而代之以包含cosθ/2或sinθ/2的項,因為四元數的元素都是用它們表示的,像以前那樣,設α=θ/2,先用α寫出cos的倍角公式,再代入θ:

上式是正確的,但它和其他的標準形式不同,即:

m11 = 1 - 2y2 - 2z2

實際上,還有其他的形式存在。最著名的乙個形式是m11 = w2 + x2 - y2- z2,因為w2 + x2 + y2 + z2 = 1,所以這三種形式是等價的。現在回過頭來看看能不能直接匯出其他標準形式,第一步,n是單位向量,nx

2+ny

2 +nz

2 = 1,則1 -nx

2 =ny

2 +nz2。

m11 = 1 - (1 -nx

2)(2sin2(θ/2))

= 1 - (ny

2 +nz

2)(2sin2(θ/2))

= 1 - 2ny

2sin2(θ/2) - 2nz

2sin2(θ/2)

= 1 - 2y2 - 2z2

元素m22

和m33

可以用同樣的方法求得。

讓我們來看看非對角線元素,它們比對角線元素簡單一些,以m12

為例子:

m12 =nxny(1 - cosθ) +nzsinθ

其他非對角線元素可用同樣的方法匯出。

最後,給出從四元素構造的完整旋轉矩陣,如公式10.23所示:

從矩陣轉換到四元數

為了從旋轉矩陣中抽出相應的四元數,可以直接利用公式 10.23,檢查對角線元素的和(也稱作矩陣的軌跡)得到:

通過使軌跡中三個元素中的兩個為負,可以用類似的方法求得其他三個元素:

不幸的是,這種方法並不總是能正確工作,因為平方根的結果總是正值。(更加準確地說,沒有選擇正根還是負根的依據。)但是,q和-q代表相同的方位,我們能任意選擇用非負根作為4個分量中的乙個並仍能得到正確的四元數,只是不能對四元數的所有4個數都用這種方法。

另乙個技巧是檢查相對於對角線的對稱位置上元素的和與差:

那麼應選用四種方法中的哪個呢?似乎最簡單的策略是總是先計算同乙個分量,如w,然後再計算x、y、z。這伴隨著問題,如果w=0,除法就沒有定義;如果w非常小,將會出現數值不穩定。shoemake建議先判斷w、x、y、z中哪個最大(不用做平方根運算),根據上面的表,用矩陣對角線計算該元素,再用它計算其他三個。

下面的**用一種非常直接的方式實現了這個方法。

listing 10.4: converting a rotation matrix to a quaternion

// input matrix:

float

m11,m12,m13;

float

m21,m22,m23;

float

m31,m32,m33;

// output quaternion

float

w,x,y,z;

// determine which of w, x, y, or z has the largest absolute value

float

fourwsquaredminus1 = m11 + m22 + m33;

float

fourxsquaredminus1 = m11 – m22 – m33;

float

fourysquaredminus1 = m22 – m11 – m33;

float

fourzsquaredminus1 = m33 – m11 – m22;

int biggestindex = 0;

float

fourbiggestsquaredminus1 = fourwsquaredminus1;

if (fourxsquaredminus1 > fourbiggestsquaredminus1) 

if (fourysquaredminus1 > fourbiggestsquaredminus1) 

if (fourzsquaredminus1 > fourbiggestsquaredminus1) 

// perform square root and division

float

biggestval = sqrt(fourbiggestsquaredminus1 + 1.0f) * 0.5f;

float

mult = 0.25f / biggestval;

switch

(biggestindex) 

3D數學基礎 3D中的方位與角位移 3

先來看下下面的總結表 不同的方位表示方法適用於不同的情況,下面是一些選擇的建議 設矩陣儲存在下面這些變數中 float m11,m12,m13 float m21,m22,m23 float m31,m32,m33 以弧度形式計算尤拉角並儲存在以下變數中 360 2 弧度 float h,p,b 從...

3D數學讀書筆記 3D中的方位與角位移

方位和角位移的基本概念 什麼是方位 角位移?直觀的說,我們知道,物體的 方位 主要描述物體的朝向,然而,方向 和 方位 並不完全一樣。向量有 方向 但沒有 方位 區別在於,當乙個向量指向特定方向時,可以讓向量自轉,但向量卻不會發生任何變化,因為向量的屬性只有大小,而沒有厚度和寬度。然而,當乙個物體朝...

css3的3D位移效果講解

lang en charset utf 8 3d位移的demotitle perspective 定義3d元素距離檢視的距離 以畫素為單位 當給乙個元素定義perspective屬性的時候,其 子元素 就獲得了乙個透視效果,元素本身並沒有 設定人眼到螢幕平面的距離,只影響3d元素,不影響2d元素 所...