gluLookAt矩阵推导

转载 2015年07月07日 21:14:20

最近需要自己手动算camera view矩阵,但是推导的结果跟OpenGL官方文档不一样,又因为我的浏览器没法完美看MathML,所以我一直以为OpenGL的官方文档http://www.opengl.org/sdk/docs/man/xhtml/gluLookAt.xml错了,今天才发现原来最终结果是一样的,困扰了我好久的一个问题终于解决了。

 

这里我准备从基变换的角度来推导这个矩阵。首先考虑2D的简单情况。现在的问题是,将空间从规范基(canonical basis)转换到照相机的基。

规范基是{(1, 0)^T, (0, 1)^T}, 照相机的基是{u, v},对于任意一个向量(s, t)^T,它的坐标在规范基下是(s, t)^T,也就是

(s, t)^T = s * (1, 0)^T + t * (0, 1)^T

如果可以将(0, 1)和(1, 0)用{u, v}表示,那么我们也可以求得(s, t)^T在另一组基下的坐标。

假设

(1, 0)^T = a * u + b * v

(0, 1)^T = c * u + d * v

那么带入上面的式子

(s, t)^T = s * (au + bv) + t * (cu + dv) = (as + ct) * u + (bs + dt) * v

坐标是(as + ct, bs + dt)^T, 也可以写成

(a c  * (s 

 b d)     t)

也就是说只要对原空间坐标(s, t)做一个矩阵变换就可以得到新的坐标。 

 

我们将两组基之间的转换写成矩阵的形式

(1 0  = (u v) (a c

 0 1)             b d)

那么

(a c  = (u v)^-1

 b d) 

M = (u v 0 

       0 0 1)^-1

那么,从规范基转换到任意一组基(u, v),只需要一个变换矩阵M(任意两组基之间的转换可以修改上述推导得到)。

由于照相机空间的原点也不在原来空间的原点,我们还需要做一个平移。假设照相机的位置在p, 那么

M_view = M * translationMatrix(-p) 

这样我们先将将照相机放在原点,然后再进行基的转换。

可以验证,

M_view =  (u v p 

                0 0 1)^-1

 

实际上,当{u, v}是一组正交基时,M是一个转动(rotation) 矩阵,即可得到

(u v 0        = (u v 0

 0 0 1)^-1      0 0 1)^T

这样

M_view = (u v 0      * (I -p

               0 0 1)^T     0 1)

这个推导可以拓展到三维空间中,因此

M_view = (u v w 0      * (I -p

               0 0 0 1)^T     0 1) 

也就是在gluLookAt文档中的矩阵。 

相关文章推荐

Opengl---gluLookAt函数详解

下面的一段摘自百度百科: 视点转换 函数原型 void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,...
  • IvanLJF
  • IvanLJF
  • 2013年04月06日 19:03
  • 26666

gluLookAt和gluPerspective原理

gluLookAt设定了眼睛位置eye,观察点center,观察者方向up。 gluPerspective设定了沿y轴的视野范围fovy(视景体上下两平面的夹角),屏幕的水平/竖直比例aspect,...

视图模型转换矩阵的推导也是关于gluLookAt函数即视图转换矩阵的推导及代码实现

关于gluLookAt函数即视图转换矩阵的推导及代码实现 视图模型转换矩阵的推导也是关于gluLookAt函数即视图转换矩阵的推导及代码实现   gluLookAt函数提供给用户完成模式变换(mo...

OpenGL(六) gluLookAt和gluPerspective函数解析

在调用gluLookAt和gluPerspective函数之前一般要先调用一下glLoadIdentity函数,先说一下这个函数是做什么的。 glLoadIdentity glLo...
  • dcrmg
  • dcrmg
  • 2016年11月09日 23:38
  • 2288

详解MVP矩阵之ViewMatrix

ViewMatrix用于直接将World坐标系下的坐标转换到Camera坐标系下。已知相机的坐标系,还有相机在世界空间下的坐标.就可以求出ViewMatrix,下面进行具体推导。令UVN为相机坐标系下...

OpenGL 矩阵变换(讲的太好了~!)

Overview 几何数据——顶点位置,和标准向量(normal vectors),在OpenGL 管道raterization 处理过程之前可通过顶点操作(Vertex Operation)和基本...

Sutherland-Hodgeman多边形裁剪(转载)

Sutherland-Hodgeman多边形裁剪   Sutherland-Hodgman算法也叫逐边裁剪法,该算法是萨瑟兰德(I.E.Sutherland)和霍德曼(Hodgman)在1974年提...

视图模型转换矩阵的推导也是关于gluLookAt函数即视图转换矩阵的推导及代码实现

关于gluLookAt函数即视图转换矩阵的推导及代码实现 视图模型转换矩阵的推导也是关于gluLookAt函数即视图转换矩阵的推导及代码实现   gluLookAt函数提供给用户完成模式变换(mo...

低秩矩阵恢复推导

  • 2017年09月17日 21:22
  • 118KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:gluLookAt矩阵推导
举报原因:
原因补充:

(最多只允许输入30个字)