遊戲引擎架構----數學基礎

1. 點和矢量
座標:笛卡爾座標:多個相互垂直的軸構成的,笛卡爾基矢量
          圓柱座標系
          球座標系
左右手座標系:大拇指、食指、中指分別是x,y,z軸
矢量和點的區別:矢量相對於某個已知點的便宜,一個矢量可以移到三維空間中的任何位置,都是同一個矢量。點是絕對的,矢量是相對的
矢量運算:和標量的乘法
          加法(應用:顯示歐拉法求位置)、減法
          矢量的分量積(component-wise product)/阿達馬積(Hadamard product):非統一縮放
          模
          點積:符合交換律,分配率,投影。判定是否共線、反向、垂直,計算點距離平面的距離(點+平面點 * 平面ss法線)
          叉積:模:平行四邊形的面積。反交換律,分配率。笛卡爾軸的正旋方向,繞z軸從x到y,繞x軸從y到z,繞y軸從z到x(注意按照y軸是倒轉的),求法矢量
線性插值:LERP(linear interpolation),加權平均,權重分別爲1-x和x

2. 矩陣
標準正交矩陣:行和列都爲單位矢量
仿射矩陣:4*4的變換矩陣,能維持之前變換前後的平行以及相對距離比
          最接近矢量的矩陣會最先進行變換
單位矩陣(identity matrix)
逆矩陣(inverse matrix)所有仿射矩陣都有逆矩陣
轉置矩陣(transpose matrix)標準正交矩陣的逆矩陣和轉置矩陣一樣
齊次座標(homogeneous coordinates):爲了讓矩陣能表示平移等等,在原先的維度上增加一維,通常稱爲w。如4*4的矩陣能表示平移,旋轉,縮放。表示爲[ U 0 \ t 1 ],U是3*3的旋轉矩陣,t是3*1的平移矩陣
          由於矢量沒有位移,因此矩陣變換方向矢量時,要忽略平移效果,所以w分量爲0
           點有位移,因此w分量爲1
           [v w][U 0 \ t 1] = [vU + wt w]    
          四維齊次座標變成三維座標的方法是把x y z 分量除以w分量。矢量的w爲0,所以三維空間上的純方向矢量在四維中是位於無窮遠的點
平移矩陣:[I 0 \ t 1],逆矩陣:對t求反
旋轉矩陣:[R 0 \ 0 1],逆矩陣:轉置。因爲把角度求反就是兩個正弦求反,餘弦不變
縮放矩陣:[S 0 \ 0 1],S是對角陣。逆矩陣:求倒數
座標空間:
     一組座標軸代表一個參考系
     模型空間:局部空間
     世界空間
     觀察空間:攝像機空間。原點在攝像機的焦點處
     基的變更:Mc->p:子空間到父空間的轉換矩陣,[子空間x軸的單位基矢量在父空間的座標 \ 子空間y軸的單位基矢量在父空間的座標 \ 子空間z軸的單位基矢量在父空間的座標 \ 子座標系相對於父座標系的平移],若子軸有縮放,則基矢量的單位長度也會有相應的縮放係數。
     基變更矩陣也能抽取出子空間的x,y,z朝向
     通過基變更矩陣變換座標,也可反過來認爲是反方向的變換座標系
     法矢量是使用Mc->p的逆轉置矩陣變換的

3. 四元數
q = [qx qy qz qw], 可看做三維矢量加上第四維的標量座標。矢量部分是旋轉單位軸乘以旋轉半角的正弦,標量部分是旋轉半角的餘弦
乘法:
          pq:先旋轉Q再旋轉P
          四元數[0 0 0 1]是零旋轉
          代表三維旋轉的四元數是單位長度的,四元數的逆也符合矩陣積的逆的特性,即(pq)-1 = q-1 p-1
旋轉矢量:v = [v 0]
               v’ = qvq-1
四元數和旋轉矩陣是可以相互轉換的
線性插值:
          LERP:normalize((1-x)a + xb),問題:旋轉並非以恆定的角速度進行,兩端較慢中間較快
          SLERP(spherical linear interpolation):球面線性插值normalize(sin((1-x)theta) / sin(theta) * a + sin((x*theta) / sin(theta) * b)。theta來自兩個四元數的夾角,可以用四維點積求得cos(theta) = p.q

4. 各種旋轉的表示
歐拉角:按照三個主軸旋轉。偏航角(yaw),俯仰角(pitch),滾動角(roll)
          問題:不能輕易插值,萬向節死鎖(旋轉90度是,一個主軸會與另一個完全對其,這樣兩個旋轉以及完全等效),先繞那根軸後繞那根軸結果不同
3*3矩陣:問題:不直觀,不易插值,需要大量存儲空間
軸角:旋轉軸和按軸旋轉的角度[a theta]
          問題:不能簡單的插值
四元數
旋轉自由度:
          自由度DOF(degree of freedom):自由物體在平移上有三個自由度(x,y,z),在旋轉上也有三個自由度(繞x,y,z軸)
          Ndof = N參數 - N約束

5. 仿射矩陣的表示
SQT變換:縮放scale,四元數quaternion,平移translation。體積小,易插值
對偶四元數:四個分量不是實數,是對偶數。

6. 線
     直線:點+方向。
     射線:約束(t>=0)
     線段:約束(t>=0, t<=L)
7. 球:中點+半徑
8. 平面:點+法線。Ax+By+Cz+D = 0。[A B C]歸一化後是法線。d = D/length([A B C])是平面到原點的距離。原點位於平面正面的時候d是正數,否則d是負數。也可用四元數表示[a b c d],法線是a b c, d的定義如上。使用逆轉置矩陣施於這個四元數上,可得到新的空間的平面。
9. 軸對齊包圍盒AABB(axis aligned bounding box)
10. 定向包圍盒OBB(oriented bounding box)將點變換成OBB的對齊座標空間,再用AABB的相交測試法
11. 平截頭體(frustum):將點通過透視投影變換至齊次裁剪空間後,使用AABB相交測試法測試是否在內部

12. SIMD:單指令多數據single instruction multiple data。現代微處理器能用一個指令並行的對多個數據執行數學運算。
     SSE:單指令多數據流擴展streaming SIMD extensions。最常用的爲32爲浮點數打包模式
     SSE寄存器可存4個32位float,可以將兩個SSE寄存器的內容做運算,一次可以運行四個數的結果。
     __m128就是C中的這種格式。需要保證是16字節對其的,動態分配的結構需要由程序員負責對齊。
     __asm內聯彙編
     應用:矢量*矩陣:矢量的每個分量分別和矩陣的行相乘,最後相加

13. 隨機數
線性同餘法
梅森旋轉閥
Xor shift(僞隨機數產生器之母)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章