從四元數轉換到矩陣
為了將角位移從四元數轉換到矩陣形式,可以利用旋轉矩陣,它能計算繞任意軸的旋**
這個矩陣是用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元素 所...