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

Posted timeobjserver

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了坐标变换,空间变换的本质相关的知识,希望对你有一定的参考价值。

坐标变换或空间变换,本质是相对坐标的变化,绝对坐标没变。

世界空间有两个物体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也就是常说的视图矩阵,由此可以看出,视图矩阵不是相机变换的专利,而是所有物体都具有的一种旋转加平移的变换。

这也就是U3D中 Transform.lookAt的原理,就是说每个物体都有一个视图变换矩阵,包括相机,灯光。这样我们就明白了什么是【变换到灯光空间】这个难以理解的概念

以上是关于坐标变换,空间变换的本质的主要内容,如果未能解决你的问题,请参考以下文章

OpenGLES 透视变换与屏幕UV坐标

OpenGL入门(四)-- OpenGL坐标系与坐标变换

OpenGL里的坐标系统以及其变换

OpenCV中的透视变换介绍

PostScript语言教程(坐标变换)

使用OpenCV透视变换技术实现坐标变换实践