座標變換或空間變換,本質是相對座標的變化,絕對座標沒變。spa
世界空間有兩個物體A,B。將A變換到B的座標空間意思是:將A從世界空間變換到B的局部座標空間,也就是在B的局部座標系中從新表示A的座標(也就是求出A在B座標系中的相對座標)orm
作法很簡單:遊戲
1,A - B 獲得一個向量 V,開發
2,把V分解(投影)到B的局部座標的各軸上,通常用單位向量的點乘實現,由於點乘表示投影,即 x = dot(V, X), y=dot(V, Y), z=dot(V, Z),X,Y,Z是B座標系的三個軸form
獲得的結果就是A在B的局部座標系中的座標,物體A也就變換到了物體B的局部座標系中,簡稱爲A變換到了B的空間中。原理
在遊戲引擎開發中最經常使用的幾種變換:渲染
例1,渲染管線中爲了渲染物體,將物體變換到相機空間map
例2,渲染陰影貼圖shadow map時,將相機變換到燈光空間view
原理如此,由上能夠推導出一個變換矩陣,直接將1,2兩上步驟合爲一個矩陣,推導以下:vi
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各軸對齊