坐标变换或空间变换,本质是相对坐标的变化,绝对坐标没变。
世界空间有两个物体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各轴对齐