OpenGL: 模型视图矩阵变换
2014-02-25 16:37
309 查看
对于学习OpenGL,或者其他的API,基础的矩阵变换是最重要的。矩阵变换是重中之重。下面就拿红皮书上的最简单的demo:cube.c来说。调用函数 glMatrixMode (GL_MODELVIEW);指定修改模型视图矩阵,以后调用glLoadIdentity (); 将当前的矩阵置为单位矩阵,有利于后面的运算。下面我们假设将对创建的模型glutWireCube (1.0); 进行平移,缩放,旋转(就绕x轴吧),按照OpenGL提供的语句只需要调用
/article/1342269.html
//将模型移动到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);三种实现最终的效果一样。
/article/1342269.html
相关文章推荐
- Linux Find 命令使用
- Shell脚本调试技术
- linux stat命令、inode内容--ctime,mtime,atime的区别
- 使用 Shell 对进程资源进行监控
- Apache Hadoop生态系统
- 【OpenCV】森林火灾检测-2
- 【OpenCV】森林火灾检测-1
- Linpus Linux 安装QQ 2013详解
- UVa 11450 Wedding shopping (DP)
- AOP事物处理中的传播行为详解
- linux下opencv安装和配置
- 在Eclipse中运行Tomcat6源代码,保证正确的classpath
- POJ-1521/ZOJ-1117/Entropy
- CentOS系统主机名与IP地址、网关、DNS服务的配置
- linux点滴
- hadoop使用lzo压缩文件笔记 (cdh3u0)
- linux和windows下mysql密码怎样清空!
- windows server 2008 下安装openmeetings 2.2.0
- 针对nginx、haproxy、lvs 的优缺点分析
- 针对nginx、haproxy、lvs 的优缺点分析