平民程序 - linghuye's blog

天下风云出我辈,一入江湖岁月催。皇图霸业谈笑中,不胜人生一场醉。提剑跨骑挥鬼雨,白骨如山鸟惊飞。尘事如潮人如水,只笑江湖几人回。

随笔 - 221, 文章 - 0, 评论 - 680, 引用 - 0
数据加载中……

ModelView矩阵的含义和应用

设OpenGL的镜头坐标系的三个轴为(R,U,N),这里的R,U,N的数值表达在世界坐标系上,表达为*行*向量.则OpenGL用gluLookAt建立的ViewMatrix为:
  R
( U ). 即ViewMatrix的第一行为R,第二行为U,第三行为-N.
 -N
假设当前的ModelMatrix为单位矩阵,当我们使用glGetFloatv(GL_MODELVIEW_MATRIX, &mat),即取回ViewMatrix,然后将上述规则与mat进行比对,发现,mat的第一列是R,第二列是U,第三列是-N.

这是因为OpenGL使用该死的列存储方式,而上述规则使用行存储方式表达.行存储或列存储完全是计算机中数组的内存的行优先或列优先的排布问题(怎么会有人习惯列优先存储这种变态的思维),与空间数学概念(如列向量,行向量)无关.

在大多公告板实现的代码,都有glGetFloatv(GL_MODELVIEW_MATRIX, &mat); 然后从各列中解析出R,U,N的步骤,接着用R,U,N作公告板计算.
而当我们使用glGetFloatv(GL_TRANSPOSE_MODELVIEW_MATRIX, &mat),才与上述规则相一致.

在DirectX中D3DXMatrixLookAtLH建立出的ViewMatrix为(R, U, N),这里的R,U,N是列向量,即ViewMatrix的第一列是R,第二列是U,第三列是N.
DirectX没有令人误导的列存储方式,生成的ViewMatrix确实符合这个数学标准.

OpenGL中能直接取到的是ModelViewMatrix,此矩阵将模型坐标从模型坐标系转换到镜头坐标系,ModelViewMatrix的逆矩阵可以将镜头坐标系下的坐标转换到模型坐标系,一个典型的应用是:已知在镜头坐标系下,镜头所在(0, 0, 0)点,则使用上述逆矩阵推算出镜头在模型坐标下的位置.注意要想推算镜头在世界坐标系下的位置,需要使用ViewMatrix的逆矩阵.
如果ModelMatrix为标准矩阵,则模型坐标系和世界坐标系重合,ModelViewMatrix矩阵是纯粹的ViewMatrix.

定理:若有一个以当前坐标系为数值参考,而定义的基(以标准数学形式给出)
      R
则( U ) (R,U,N为行向量)矩阵将当前坐标系的点的坐标数值转换到新基的坐标系下的
      N       点的数值.

posted on 2007-04-29 19:28 linghuye 阅读(4926) 评论(1)  编辑 收藏 引用 所属分类: 3D图形学研究

评论

# re: ModelView矩阵的含义和应用  回复  更多评论   

请问基是什么意思?
2009-04-02 17:50 | ares
只有注册用户登录后才能发表评论。