3D數學讀書筆記 四元數

2021-09-06 15:53:27 字數 4512 閱讀 7808

什麼是四元數

複數是由實數加上虛數單位i 組成,當中

i²  = -1

相似地,四元數都是由實數加上三個元素 i、j、k 組成,並且它們有例如以下的關係:

i² = j² = k² = ijk = -1

每乙個四元數都是 1、i、j 和 k 的線性組合,即是四元數一般可表示為a + bi + cj + dk。

關於四元數的歷史

四元數是由哈密頓在2023年愛爾蘭發現的。當時他正研究擴充套件複數到更高的維次(複數可視為平面上的點)。他不能做到三維空間的樣例,但四維則造出四元數。依據哈密頓記述,他於10月16日跟他的妻子在都柏林的皇家運河(royal canal)上散步時突然想到

i² = j² = k² = ijk = -1

方程解。之後哈密頓立馬將此方程刻在附近布魯穆橋(brougham bridge,現稱為金雀花橋 broom bridge)。

不僅僅如此,哈密頓還創造了向量的內外積(大神就是大神,創造力旺盛啊-_-!)。他亦把四元數描繪成乙個有序的四重實數:乙個標量(a)和向量(bi + cj + dk)的組合。若兩個標量部為零的四元數相乘,所得的標量部便是原來的兩個向量部的標量積的負值,而向量部則為向量積的值,但它們的重要性仍有待發掘。

四元數的記法

乙個四元數包括乙個標量分量和乙個3d向量分量。常常記標量分量為w,記向量分量為單一的v或分開的x,y,z。兩種記法分別例如以下:

[w,v]

[w,(x,y,z)]

四元數的性質

(當年計算機圖形學考的就是這題。。嗚嗚嗚~~)

四元數不像實數或複數那樣,它的乘法是不可交換的,比如

i j = k, , j i = -k ;

j k = i  , k j = -i ;

k i = j  , i k = -j .

四元數是除法環的乙個樣例。除了沒有乘法的交換律外,除法環與域是相類的。特別地,乘法的結合律仍舊存在、非零元素仍有唯一的逆元素。

負四元數

四元數能求負。做法非常直接:將每乙個分量都變負

-q = - [ w ( x y z ) ] = [ -w ( -x -y -z ) ]

= - [ w v ] = [ -w -v ]

ps:q 和 - q代表的實際角位移是同樣的,因此,3d中的隨意角位移都有兩中不同的四元數表示方法,它們互相為負。(由於繞某個軸旋轉360°物體相當於沒有旋轉)

單位四元數

幾何上,存在兩個單位四元數,它們代表沒有角位移:[ 1, 0 ] 和 [ -1, 0 ] 

數學上,實際僅僅有乙個單位四元數[ 1 , 0 ] 用隨意四元數q乘以單位四元數,結果仍是q。數學上覺得[ -1 , 0]不是正在的單位四元數。

四元數的模、共軛和逆

四元數的模的記法求法公式:

四元數的共軛記作 q*,可通過讓四元數的向量部分變負來獲得。

四元數的逆記作,定義為四元數的共軛除以它的模

。四元數的乘法

(叉乘)

四元數叉乘滿足結合律,但不滿足交換律。

(ab)c=a(bc)

ab≠ba

四元數乘積的模等於模的

||pq|| = ||p|| ||q||

四元數的「差」

四元數的「差」被定義為乙個方位到還有乙個方位的角位移。換句話說,給定方位a和b,就能計算a旋轉到b的角位移d。

四元數點乘

對於單位四元數a和b,有-1 ≤ a·b ≤ 1。通常我們僅僅關心a·b的絕對值,由於a·b=-(a·-b),所以b和-b代表同樣的角位移。

四元數點乘的幾何解釋類似於向量點乘的幾何解釋。四元數點乘a·b的絕對值越大,a和b代表的角位移越相似。

四元數的對數、指數和標量乘運算

四元數求冪

對四元數求冪在3d程式設計中很實用,由於它能夠從角位移中抽取一部分,比如四元數q代表乙個角位移,如今想得到代表1/3這個角位移的四元數,能夠計算q^1/3

四元數數冪的求法

在實際3d轉換中我們使用這個的**進行抽取角位移的部分

// 四元數(輸入、輸出)

float w,x,y,z;

// 指數(輸入)

float zhishu;

// 為了避免除零,我們這裡做乙個推斷,由於第乙個變數時cos,所以這裡是.9999f

if (fabs(w) < .9999f)

使用程式前應先進行單位四元數的檢查,由於w=±1會導致temp的計算中出現除零的現象,假設檢測出是單位四元數,直接返回原四元數就可以。

四元數插值

當今3d數學中四元數存在的理由是由於一種叫做slerp的運算,它是球面線性插值的縮寫(spherical linear interpolation)。slerp運算很實用,由於它能夠在兩個四元數間平滑插值。slerp運算避免了尤拉角插值的全部問題

slerp是一種三元運算,這意味著它有三個運算元。前兩個運算元是兩個四元數,將在它們中間插值。設這兩個開始結束的四元數分別為q0和q1.差值引數設為變數 t,t 在0到1之間變化。slerp函式:slerp(q0,q1,t)    將返回q0和q1之間的插值方位。

// 兩個輸入四元數

float w0,x0,y0,z0;

float w1,x1,y1,z1;

// 差值變數

float t;

// 輸出四元數

float w,x,y,z;

// 用點乘計算兩個四元數夾角的cos值

float cosjiao = w0*w1 + x0*x1 + y0*y1 + z0*z1;

// 假設點乘為負,則反轉乙個四元數以取得短的4d弧

if (cosjiao < 0.0f)

// 檢查防止除零

float k0, k1;

if (cosjiao > 0.9999f) else

// 插入值

w = w0*k0 + w1*k1;

x = x0*k0 + x1*k1;

y = y0*k0 + y1*k1;

z = z0*k0 + z1*k1;

嘿嘿,四元數這個地方確實有點難度。。只是3d總體都不太簡單,全部好好加油!—end—參考文獻: (1)《3d math primer for graphics and game development》

(2)  維基百科                   

(3) 《計算機圖形學》

3D數學四元數

向量的叉乘 外積 叉積 a ax,ay,az b bx,by,bz a x b c aybz azby,axbz azbx,axby aybx 兩個向量叉乘的幾何意義 得到乙個新的向量,c向量,c向量同時垂直於a向量和b向量。垂直於a向量和b向量所組成的平面,我們也把c向量叫做那個平面的法向量。向量...

3D數學讀書筆記 矩陣高階

終於要學習矩陣的平移了,通過平移可以處理很多問題,包括非座標軸基準的變換問題,不同座標系轉換問題。嘿嘿!行列式 其實行列式就是一種計算法則 在任意矩陣中都存在乙個標量,稱作該方陣的行列式。方陣m的行列式記作 m 或 det m 非方陣矩陣的行列式是未定義的。2 2階矩陣行列式的定義 3 3階矩陣行列...

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

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