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 矩阵变换(讲的太好了~!)

Overview 几何数据——顶点位置,和标准向量(normal vectors),在OpenGL 管道raterization 处理过程之前可通过顶点操作(Vertex Operation)和基本...
  • lyx2007825
  • lyx2007825
  • 2013年04月12日 15:39
  • 84073

OpenGL: 视图矩阵的推导

把物体从世界坐标系转化到视点坐标系的矩阵称为视图矩阵。     下面我们先看下opengl视图矩阵的推导过程:     假设视点或camera的局部坐标系为UVN,UVN分别指向右方、上方和后方从而构...
  • Augusdi
  • Augusdi
  • 2014年03月04日 11:08
  • 6025

右手坐标系下LookAt视图矩阵的推导

link: http://www.cnblogs.com/bluebean/p/5275541.html 右手坐标系下LookAt视图矩阵的推导 基本知识 右手坐标系 右手手掌弯曲,手指方向由...
  • kasteluo
  • kasteluo
  • 2017年06月30日 09:49
  • 224

Opengl---gluLookAt函数详解

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

gluLookAt和gluPerspective原理

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

详解MVP矩阵之ViewMatrix

ViewMatrix用于直接将World坐标系下的坐标转换到Camera坐标系下。已知相机的坐标系,还有相机在世界空间下的坐标.就可以求出ViewMatrix,下面进行具体推导。令UVN为相机坐标系下...
  • qp120291570
  • qp120291570
  • 2016年03月28日 21:15
  • 9522

gluLookAt矩阵、矩阵的转置与求逆矩阵方法

1. gluLookAt矩阵 这次使用opengl es 2.0中,由于里面没有gluLookAt这个函数,参考了网上的一些代码自己封装了一个,经过使用,没发现问题,具体代码如下: void ES...
  • smsmn
  • smsmn
  • 2012年12月04日 15:36
  • 1262

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

关于gluLookAt函数即视图转换矩阵的推导及代码实现 视图模型转换矩阵的推导也是关于gluLookAt函数即视图转换矩阵的推导及代码实现   gluLookAt函数提供给用户完成模式变换(mo...
  • Liuchuang_MFC
  • Liuchuang_MFC
  • 2015年11月06日 23:45
  • 2076

gluLookAt矩阵推导

最近需要自己手动算camera view矩阵,但是推导的结果跟OpenGL官方文档不一样,又因为我的浏览器没法完美看MathML,所以我一直以为OpenGL的官方文档http://www.opengl...
  • pizi0475
  • pizi0475
  • 2015年07月07日 21:14
  • 1058

Opengl---gluLookAt函数详解

下面的一段摘自百度百科: 视点转换 函数原型 void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLd...
  • damotiansheng
  • damotiansheng
  • 2014年12月28日 15:33
  • 1783
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:gluLookAt矩阵推导
举报原因:
原因补充:

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