理解OpenGL中的模型视图矩阵变换
2011-05-05 20:29
363 查看
对于学习OpenGL,或者其他的API,基础的矩阵变换是最重要的。矩阵变换是重中之重。
下面就拿红皮书上的最简单的demo:cube.c来说。
调用函数 glMatrixMode (GL_MODELVIEW);指定修改模型视图矩阵,以后调用glLoadIdentity (); 将当前的矩阵置为单位矩阵,有利于后面的运算。
下面我们假设将对创建的模型glutWireCube (1.0); 进行平移,缩放,旋转(就绕x轴吧),
按照OpenGL提供的语句只需要调用
//将模型移动到z轴的-5.0位置,此时相机位于原点,
//与gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);的效果一样,
//移动的相对性.
glTranslated(0.0, 0.0, -5.0);
glScaled(1.0, 2.0, 1.0);
glRotated(20., 1.0, 0.0, 0.0); //x为旋转轴其实在OpenGL内部的实现就是将相应的变换矩阵与当前的矩阵(已经被glLoadIdentity置为了单位矩阵)相乘,所以下面我们就利用OpenGL提供的函数:glMultMatrixf(const GLFloat* m )实现相同的效果。此时必须注意:在OpenGL中矩阵是列优先或者说列主序指定的矩阵,所以是行优先表示下的转置矩阵。
至于这些矩阵怎么得出来的,随便打开一本计算机图形学的书籍,里面都会有齐次坐标和矩阵变换的讲解。
下面是用矩阵实现的代码,可以测试,效果一样。
//注意OpenGL里面的矩阵是:转置矩阵
float TransMatrix[16]=...{
1., 0., 0., 0.,
0., 1., 0., 0.,
0., 0., 1., 0.,
0., 0., -5., 1.0
};
glMultMatrixf(TransMatrix);
float ScaleMatrix[16]=...{
1., 0., 0., 0.,
0., 2., 0., 0.,
0., 0., 1., 0.,
0., 0., 0., 1.0
};
glMultMatrixf(ScaleMatrix);
float RotateMatrix[16]=...{
1., 0., 0., 0.,
0., cos(20.), sin(20.), 0.,
0., -sin(20.), cos(20.), 0.,
0., 0., 0., 1.0
};
glMultMatrixf(RotateMatrix);上面用的是三个矩阵, 其实一个矩阵就一步就实现,就是先计算上面的三个矩阵的乘积,经过计算的矩阵如下:
float FinalMatrix[16]=...{
1.000000, 0.000000, 0.000000, 0.000000,
0.000000, 0.816164, 0.912945, 0.000000,
0.000000, -1.825891, 0.408082, 0.000000,
0.000000, 0.000000, -5.000000, 1.000000
};
glMultMatrixf(FinalMatrix);三种实现最终的效果一样。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dizuo/archive/2008/04/17/2302364.aspx
下面就拿红皮书上的最简单的demo:cube.c来说。
调用函数 glMatrixMode (GL_MODELVIEW);指定修改模型视图矩阵,以后调用glLoadIdentity (); 将当前的矩阵置为单位矩阵,有利于后面的运算。
下面我们假设将对创建的模型glutWireCube (1.0); 进行平移,缩放,旋转(就绕x轴吧),
按照OpenGL提供的语句只需要调用
//将模型移动到z轴的-5.0位置,此时相机位于原点,
//与gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);的效果一样,
//移动的相对性.
glTranslated(0.0, 0.0, -5.0);
glScaled(1.0, 2.0, 1.0);
glRotated(20., 1.0, 0.0, 0.0); //x为旋转轴其实在OpenGL内部的实现就是将相应的变换矩阵与当前的矩阵(已经被glLoadIdentity置为了单位矩阵)相乘,所以下面我们就利用OpenGL提供的函数:glMultMatrixf(const GLFloat* m )实现相同的效果。此时必须注意:在OpenGL中矩阵是列优先或者说列主序指定的矩阵,所以是行优先表示下的转置矩阵。
至于这些矩阵怎么得出来的,随便打开一本计算机图形学的书籍,里面都会有齐次坐标和矩阵变换的讲解。
下面是用矩阵实现的代码,可以测试,效果一样。
//注意OpenGL里面的矩阵是:转置矩阵
float TransMatrix[16]=...{
1., 0., 0., 0.,
0., 1., 0., 0.,
0., 0., 1., 0.,
0., 0., -5., 1.0
};
glMultMatrixf(TransMatrix);
float ScaleMatrix[16]=...{
1., 0., 0., 0.,
0., 2., 0., 0.,
0., 0., 1., 0.,
0., 0., 0., 1.0
};
glMultMatrixf(ScaleMatrix);
float RotateMatrix[16]=...{
1., 0., 0., 0.,
0., cos(20.), sin(20.), 0.,
0., -sin(20.), cos(20.), 0.,
0., 0., 0., 1.0
};
glMultMatrixf(RotateMatrix);上面用的是三个矩阵, 其实一个矩阵就一步就实现,就是先计算上面的三个矩阵的乘积,经过计算的矩阵如下:
float FinalMatrix[16]=...{
1.000000, 0.000000, 0.000000, 0.000000,
0.000000, 0.816164, 0.912945, 0.000000,
0.000000, -1.825891, 0.408082, 0.000000,
0.000000, 0.000000, -5.000000, 1.000000
};
glMultMatrixf(FinalMatrix);三种实现最终的效果一样。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dizuo/archive/2008/04/17/2302364.aspx
相关文章推荐
- OpenGL(五) 三维变换之模型视图矩阵
- 简单理解OpenGL模型视图变换
- OpenGL中glMatrixMode()函数以及视图变换,模型变换,投影变换,视口变换的理解
- 关于OpenGL中模型视图投影视口变换的理解
- OpenGL: 模型视图矩阵变换
- opengl入门系列2- 模型视图矩阵变换
- OpenGL(五) 三维变换之模型视图矩阵
- OpenGL 入门教程 模型视图投影矩阵 变换光线
- OpenGL模型视图变换、投影变换、视口变换(转载)
- OpenGL--3D世界(视图变换,模型变换,投影变换,视口变换)
- (转)模型视图变换时,法线向量要乘模型视图矩阵的逆转置矩阵
- 小白学opengl之 获取模型视图矩阵和投影矩阵
- OpenGL的视图变换、模型变换、投影变换、视口变换
- OpenGL矩阵推导——模型视图变化
- OpenGL模型视图变换、投影变换、视口变换
- OpenGL--3D世界(视图变换,模型变换,投影变换,视口变换)
- OpenGL取景变换(视图变换)矩阵推导
- OpenGL模型视图变换、投影变换、视口变换
- 【LWJGL2 WIKI】【现代OpenGL篇】用投影、视图、模型矩阵画方形
- OpenGL模型视图变换、投影变换、视口变换