座標變換,空間變換的本質

座標變換或空間變換,本質是相對座標的變化,絕對座標沒變。spa

世界空間有兩個物體A,B。將A變換到B的座標空間意思是:將A從世界空間變換到B的局部座標空間,也就是在B的局部座標系中從新表示A的座標(也就是求出A在B座標系中的相對座標)orm

作法很簡單:遊戲

1A - 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

1A - 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各軸對齊

相關文章
相關標籤/搜索