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


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

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

做法很簡單:

1A - 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兩上步驟合為一個矩陣,推導如下:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM