首页 > 代码库 > 视图矩阵的推导-opengl应用

视图矩阵的推导-opengl应用

把物体从世界坐标系转化到视点坐标系的矩阵称为视图矩阵。

     下面我们先看下opengl视图矩阵的推导过程:

     假设视点或camera的局部坐标系为UVN,UVN分别指向右方、上方和后方从而构成右手坐标系,视点则处于局部坐标系的原点位置。

     就如opengl的函数OpenGL的gluLookAt(eyex, eyey, eyez, lookatx, lookaty, lookatz, upx, upy, upz)一样,给定视点、观察点、以及up向量,现在我们来求得视图矩阵。

 

1、首先我们来求得N = eye – lookat,并把N归一化。

2、up和N差积得到U, U= up X N,归一化U。

3、然后N和U差积得到V

   

image

 

 

      假设视点坐标系初始和世界坐标系重合,它先进行一个旋转变化,然后再进行一个平移,得到现在是视点位置和方位。则此时进行的矩阵变化为image,其中T是平移变化,R是旋转变化,而相机变换是相机本身变换的逆变换。

image

T的逆矩阵为:

image

     当相机变换进行完Inverse Translation这一步之后,相机的原点和世界原点就重合了,也就是处理完了关于平移的变换。

     我们要把一个世界坐标系点K(Kx, Ky, Kz),表示成(U,V,P)坐标系的点(假设此时,已经经过平移操作,摄像机在世界坐标系的原点),则其公式为:

Lx = Kx * Ux + Ky * Uy + Kz * Uz;

Ly = Kx * Vx + Ky * Vy + Kz * Vz;

Lz = Kx * Px + Ky * Py + Kz * Pz

则转化矩阵为(opengl使用列向量,右乘)

image

则完整的公式为:image

 

      以上是opengl的视图矩阵,对于d3d,由于使用行向量,左乘,以及左手坐标系,所以视图稍有不同,在D3D11教程中,曾加做过推导:

http://www.cnblogs.com/mikewolf2002/archive/2012/03/11/2390669.html

http://www.cnblogs.com/mikewolf2002/archive/2012/11/25/2787636.html