坐标变换,空间变换的本质
坐標變換或空間變換,本質是相對坐標的變化,絕對坐標沒變。
世界空間有兩個物體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?
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
= A * view
其中view也就是常說的視圖矩陣,由此可以看出,視圖矩陣不是相機變換的專利,而是所有物體都具有的一種旋轉加平移的變換。
這也就是U3D中 Transform.lookAt的原理,就是說每個物體都有一個視圖變換矩陣,包括相機,燈光。這樣我們就明白了什么是【變換到燈光空間】這個難以理解的概念
總結
以上是生活随笔為你收集整理的坐标变换,空间变换的本质的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++返回栈上的数组(局部变量)问题探索
- 下一篇: 文本编辑器格式测试