坐标变换,空间变换的本质

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

相关文章
相关标签/搜索