應論壇網友需求,整理 3D 圖形程式設計核心數學理論。內容偏理論,後續將補實例講解。歡迎指正補充。
將二維平面座標擴展至三維空間。點 (x,y,z) 齊次座標為 (nx,ny,nz,n) (n≠0),標準化為 (x,y,z,1)。三維變換使用 4x4 矩陣。
| 座標系 | 定義 |
|---|---|
| 螢幕座標系 | 相對顯示器原點的 2D 座標 |
| 本地座標系 | 相對物件原點的 3D 座標 |
| 世界座標系 | 相對 3D 世界原點的座標 |
| 觀察/視點座標系 | 世界座標系變換,觀察者位於原點 |
V = P2 - P1 = (x2-x1, y2-y1, z2-z1)V1+V2 = (V1x+V2x, V1y+V2y, V1z+V2z)aV = (aVx, aVy, aVz)V1·V2 = V1x*V2x + V1y*V2y + V1z*V2zV1×V2 = (V1y*V2z - V1z*V2y,
V1z*V2x - V1x*V2z,
V1x*V2y - V1y*V2x)
= |Ux Uy Uz|
|V1x V1y V1z|
|V2x V2y V2z|
註:Ux,Uy,Uz 為 x,y,z 軸單位向量。程式設計中常用叉積計算法向量。
矩陣為數值矩形陣列。方陣:行列數相同。行向量 [x y z],列向量 [x;y;z]。
(AB)ij = Σ Aik * Bkj(不交換)[x' y' z' 1] = [x y z 1] × |1 0 0 0|
|0 1 0 0|
|0 0 1 0|
|tx ty tz 1|
[x' y' z' 1] = [x y z 1] × |sx 0 0 0|
|0 sy 0 0|
|0 0 sz 0|
|0 0 0 1|
|1 0 0 0| |0 cosα sinα 0| |0 -sinα cosα 0| |0 0 0 1|
|cosα 0 -sinα 0| |0 1 0 0| |sinα 0 cosα 0| |0 0 0 1|
|cosα sinα 0 0| |-sinα cosα 0 0| |0 0 1 0| |0 0 0 1|
| 平面 | 矩陣 |
|---|---|
| XY 平面 | diag(1, 1, 1, 1) — z 不變 (原文可能筆誤,標準為 diag(1,1,-1,1)) |
| YZ 平面 | diag(-1, 1, 1, 1) |
| ZX 平面 | diag(1, -1, 1, 1) |
改變物體形狀。相對 X 軸:
|1 0 0 0| |shY 1 0 0| |shZ 0 1 0| |0 0 0 1|
Y、Z 軸同理,對角線為 1,對應位置放剪切因子。
將 n 維點轉換為 中心到平面距離有限,投影線發散。平行線若不平行投影平面,會匯聚於滅點。主滅點數 = 與投影平面相交座標軸數 (1~3),分為一點/二點/三點透視。二點透視真實感強,廣用於建築、工程、廣告。 中心在無窮遠,投影線平行。分類: 以上為 3D 程式設計常用核心數學。遺漏部分請查線性代數教材。有基礎者實踐輕鬆;無基礎者建議先閱 OpenGL 入門書上手較快。格式問題請見諒。
透視投影
平行投影
(Xd,Yd,Zd)。總結