OpenGL 使用列主序存儲 4×4 矩陣:
m[0] m[4] m[8] m[12] ← 第 0 列
m[1] m[5] m[9] m[13] ← 第 1 列
m[2] m[6] m[10] m[14] ← 第 2 列
m[3] m[7] m[11] m[15] ← 第 3 列
對應數學矩陣(行主序寫法):
| m0 m4 m8 m12 |
| m1 m5 m9 m13 |
| m2 m6 m10 m14 |
| m3 m7 m11 m15 |
glGetFloatv(GL_MODELVIEW_MATRIX, m) 獲取的矩陣:
(m[0], m[1], m[2]) —— **第 0 列前三個分量**(m[4], m[5], m[6]) —— **第 1 列前三個分量**(m[8], m[9], m[10]) —— **第 2 列前三個分量**(m[12], m[13], m[14]) —— **第 3 列前三個分量**這與列主序一致:基向量存儲在列中。
列主序矩陣 M 作用於列向量 v = (x,y,z,w)ᵀ:
v' = M * v
x' = m0*x + m4*y + m8*z + m12*w
y' = m1*x + m5*y + m9*z + m13*w
z' = m2*x + m6*y + m10*z + m14*w
w' = m3*x + m7*y + m11*z + m15*w
**注意係數索引**:m0,m4,m8,m12 是第一行(數學意義),但內存中是第 0 列。
設物體局部坐標系原點在世界坐標系為 (Ox, Oy, Oz)。
局部點 (x,y,z,1) 變換到世界:
x' = X軸·x + Y軸·y + Z軸·z + 原點
對比矩陣乘法,得:
m[12] = Ox
m[13] = Oy
m[14] = Oz
**直接等於原點坐標**,而非負的點積。之前推導出現負號是因為混淆了「物體→世界」與「世界→物體」(視圖矩陣)的方向。
| 模型矩陣 | 視圖矩陣 | |
|---|---|---|
| 意義 | 局部 → 世界 | 世界 → 相機 |
| 平移分量 | 物體世界坐標 | 相機世界坐標的負點積 |
| 基向量 | 物體局部軸在世界方向 | 世界軸在相機方向 |