这次介绍的都是一些比较枯燥的概念.在现实生活中都非常真实,为了避免枯燥,我们还是讲点大家都经历过的事情
拍照:
接下来针对不同的景,你会做出不同的动作
比如拍杭州西湖:那么你会横放你的照相机进行全景拍摄
但是换做拍雷峰塔的,你想拍全景的就必须把照相机竖起来
比如你的头可以左右移动,也可以上下移动
以上讲的就是视图变换,即模型(参照物)位置不变,但视图在发生变化.
假设现在不拍景色,而是拍人,即参照物可以移动变化.但视图没有变化
即这时照相机的位置,拍摄的角度都已经固定了.
但可能会让模型(人)发生一些变化
比如位置的移动(包括左右,上下,前后)
缩放(人是无法缩放的,所以其可能做的动作是蹲下,站在一个假山上使得自己更高(也不会飞))
旋转(大部分人只会左右旋转,艺术家则会翻跟斗),所以这时候你应该拿一块大的橡皮泥来做参照物
下面还是来看代码吧
#include <GL/glut.h> #include <stdlib.h> void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); } void display(void) { glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glLoadIdentity (); /* clear the matrix */ /* viewing transformation */ gluLookAt (1.0, 1.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glutWireCube (1.0); glFlush (); } void reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); glMatrixMode (GL_MODELVIEW); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; }
当设置对象矩阵时,会把当前矩阵(可能是OpenGL内部一个全局的变量)与当前的矩阵相乘,为了清除这个变量,需要先调用glLoadIdentity 方法,当然在组合变换的时候则不需要此方法.但当参照物发生变化时,则需要调用此方法
glMatrixMode方法用于修改的是选择模型视图矩阵还是投影矩阵
这里的模型则是使用glutWireCube 画了一个立方体
请下载http://www.xmission.com/~nate/tutors.html此处的示例教程,改变参数来理解视图变换和模型变换