您的位置:首页 > 运维架构

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

2012-03-24 09:37 141 查看
在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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: