坐標變換或空間變換,本質是相對坐標的變化,絕對坐標沒變。
世界空間有兩個物體A,B。將A變換到B的坐標空間意思是:將A從世界空間變換到B的局部坐標空間,也就是在B的局部坐標系中重新表示A的坐標(也就是求出A在B坐標系中的相對坐標)
做法很簡單:
1,A - B 得到一個向量 V,
2,把V分解(投影)到B的局部坐標的各軸上,一般用單位向量的點乘實現,因為點乘表示投影,即 x = dot(V, X), y=dot(V, Y), z=dot(V, Z),X,Y,Z是B坐標系的三個軸
得到的結果就是A在B的局部坐標系中的坐標,物體A也就變換到了物體B的局部坐標系中,簡稱為A變換到了B的空間中。
在游戲引擎開發中最常用的幾種變換:
例1,渲染管線中為了渲染物體,將物體變換到相機空間
例2,渲染陰影貼圖shadow map時,將相機變換到燈光空間
原理如此,由上可以推導出一個變換矩陣,直接將1,2兩上步驟合為一個矩陣,推導如下:
1, A - B 得到向量V用矩陣表示就是 A乘以一個平移矩陣m,其中m[3][0]=B.x, m[3][1]=B.y, m[3][2B.z,如下
A - B = A * m,其中m為:
m = 1 0 0 0
0 1 0 0
0 0 1 0
B.x B.y B.z 1
2,將向量 V 分解(投影)到 B的局部坐標系的各軸上(X, Y, Z三個軸坐標基分別right, up, look向量)
x = dot(V, right)
y = dot(V, up)
z = dot(V, look)
那么表示成向量與矩陣的乘法就是如下:
V * right.x up.x look.x 0 = V * m1
right.y up.y look.y 0
right.z up.z look.z 0
0 0 0 1
將1,2兩步合起來:
A * m * m1 =
A* 1 0 0 0 * right.x up.x look.x 0 = A * right.x up.x look.x 0 = A * view
0 1 0 0 right.y up.y look.y 0 right.y up.y look.y 0
0 0 1 0 right.z up.z look.z 0 right.z up.z look.z 0
B.x B.y B.z 1 0 0 0 1 dot(B, right) dot(B, up) dot(B, look) 1
其中view也就是常說的視圖矩陣,由此可以看出:
1,視圖矩陣不是相機變換的專利,而是所有物體都具有的一種旋轉加平移的變換。
這也就是U3D中 Transform.lookAt的原理,就是說每個物體都有一個視圖變換矩陣,包括相機,燈光。這樣我們就明白了什么是【變換到燈光空間】這個難以理解的概念
2,將物體由世界坐標系W變換到某坐標C = 物體跟隨C先移到W的原點,再旋轉與W各軸對齊