关于OpenGL模型视图矩阵的研究

原创 2012年03月24日 09:37:21

在OpenGL中,矩阵的逻辑形式:
在模型视图矩阵中使用列向量来表示转换后的坐标系,
使用右乘列向量来完成对点的变换。
在OpenGL中,矩阵的物理形式:

使用连续的储存单元储存一列,(即v[0],v[1],v[2]表示m11,m21,m31)



我们可以“错误”地认为OpenGL矩阵的逻辑形式为行向量,并且“错误”地认为物理方式为连续单元保存一行。

这样经过两次错误地认为,可以使我们使用行向量来分析问题,并可以直接用于OpenGL。

以下分析都是使用错误地认为。



在OpenGL中的变换函数:
glTranslatef()
glRotatef()

glScalef()

先调用的变换操作反而后变换,
即使用与函数对应的变换矩阵右乘已存在的变换矩阵(模型视图矩阵)(这里已经在使用错误的假设来分析问题了),

这样做是必须的,且非常的有意义。


模型试图矩阵到底是什么?

实际上模型视图矩阵是模型矩阵和视图矩阵相乘得到的单一矩阵(M*V),

我们说gluLookAt()会影响视图矩阵,其实也就是影响模型视图矩阵。

函数gluLookAt()大致原理:


/*
// 返回一个 "lookat" 四维矩阵 通过当前摄像机的位置(pos)、目标(target)、up 
// 这个是一个容易理解的函数 
matrix44_t LookAtMatrix44(const vector3_t &camPos, const vector3_t &target, const vector3_t &camUp) 
{
  matrix33_t rot;	//表示一个旋转(正交阵) 

  vector3_t z = camPos - target;
  z.normalize();

  vector3_t x = camUp * z;
  x.normalize(); 
  vector3_t y = z * x;

  rot.assign(x,y,z);	//注意这里是想x,y,z三个向量 
  rot.transpose();	//转置(逆阵) 
  
  matrix44_t temp;	//表示一个位移矩阵
  temp.identity();
  temp.r3 = -camPos;
  return temp * rot;	//先进行位移在进行旋转
}*/

// 优化过的 LookAtMatrix44
matrix44_t LookAtMatrix44(const vector3_t &pos, const vector3_t &target, const vector3_t &up) 
{
	matrix44_t ret;
	
	vector3_t z = pos - target;
	z.normalize();
	
	vector3_t x = up * z;
	x.normalize(); 
	
	vector3_t y = z * x;
	
	ret.identity();			//单位化矩阵
	ret.r0.assign(x.x,y.x,z.x);//ret.r03 = 0.0f;
	ret.r1.assign(x.y,y.y,z.y);//ret.r13 = 0.0f;
	ret.r2.assign(x.z,y.z,z.z);//ret.r23 = 0.0f;
	ret.r3.x = - DotProduct(pos,x);
	ret.r3.y = - DotProduct(pos,y);
	ret.r3.z = - DotProduct(pos,z);
//	ret.m33 = 1.0f;
	
	return ret;
}



理解OpenGL中的模型视图矩阵变换

对于学习OpenGL,或者其他的API,基础的矩阵变换是最重要的。矩阵变换是重中之重。下面就拿红皮书上的最简单的demo:cube.c来说。调用函数 glMatrixMode (GL_MODELVIE...
  • dizuo
  • dizuo
  • 2008年04月17日 22:28
  • 9405

小白学opengl之 获取模型视图矩阵和投影矩阵

#include #include #include #include #include using namespace std; static int shoulder=0,elbow...

OpenGL矩阵推导——模型视图变化(转载需写明作者)

OpenGL矩阵推导——模型视图变化 在三维编程中,模型视图变换是从三维世界到二维屏幕中一个很重要的变换,但是这个变换往往很多人都不太理解,要么是事而非。而这方面的文章不是太少就是讲的太浅没有真正的...

模型矩阵、视图矩阵、投影矩阵

模型视图投影矩阵的作用,就是将顶点从局部坐标系转化到规范立方体(Canonical View Volnme)中。总而言之,模型视图投影矩阵=投影矩阵×视图矩阵×模型矩阵,模型矩阵将顶点从局部坐标系转化...

OpenGL矩阵推导——模型视图变化

OpenGL矩阵推导——模型视图变化 标签: 视图模型变换opengl 2013-10-29 10:56 915人阅读 评论(0) 收藏 举报  分类: 图形学(6) ...

OpenGL: 视图矩阵的推导

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

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

一、OpenGL灯光位置的控制 -- 模型视图矩阵的本质

纠结了很久,终于算是可以完全控制

OpenGL: 模型视图矩阵变换

对于学习OpenGL,或者其他的API,基础的矩阵变换是最重要的。矩阵变换是重中之重。下面就拿红皮书上的最简单的demo:cube.c来说。调用函数 glMatrixMode (GL_MODELVIE...
  • Augusdi
  • Augusdi
  • 2014年02月25日 16:37
  • 3673

OpenGL ES 模型视图矩阵操作

对当前模型视图进行缩放,在OpenGL ES 1.0中可以使用glScale*函数,而在2.0中需要自己设置缩放矩阵。        如,分别使用sx,sy,sz表示在x,y,z轴上的缩放比例,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于OpenGL模型视图矩阵的研究
举报原因:
原因补充:

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