1、2 模型视图变换模型视图矩阵是一个4*4的矩阵,用于指定场景的视图变换和几何变换。在进行模型视图矩阵操作前,必须调用函数glMatrixMode(GL_MODELVIEW)指定变换只能影响模型试图矩阵。主要有以下两种方法。121、直接定义矩阵利用函数 void glLoadMartrixfd(const TYPE *m);将m所指定的矩阵置为当前矩阵堆栈的栈顶矩阵。 122、利用高级矩阵函数 平移矩阵函数:void glTranslatedf(TYPE x,TYPE y,TYPE z); 用当前矩阵乘以平移矩阵。 旋转矩阵函数 void glRotatedf(TYPE angle,TYPE x
2、,TYPW y,TYPE z); 缩放矩阵函数 void glScaledf(TYPE x,TYPE y,TYPE z); 如不需要效果积累可调用重置矩阵函数void glLoadIdentity(void); 该函数将单位矩阵置为当前变换矩阵。3 投影变换有两种投影方式,不管调用哪种,必须调用glMAtrixMode(GL_PROJECTION);指定当前处理的矩阵是投影变换矩阵。131、正投影 它的有限观察空间是一个长方体,无论物体距离相机多远,投影后的物体大小尺寸不变。正投影函数有两个:void glOrtho(GLdouble left,GLdouble right,GLdouble
3、botton,GLdouble top,GLdouble near,GLdouble far); void gluOrtho2D(GLdouble left,GLdouble right,GLdoubl botton,GLdouble top); 1.3.2、透视投影特点是距离视点近的物体大,距离视点远的物体小,远到极点即为消失。透视投影函数也有两个: void glFrustum(GLdouble left,GLdouble Right,GLdouble botton, void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zN
4、ear,GLdouble zFar);2) 程序调试、测试与运行结果分析1 太阳、地球和月亮的运动模型2 小球的自由落体运动4、 附录(1)太阳、地球和月亮的运动模型#include static int day = 200;void display() glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(75,1,1,400000); glMatrixMode(GL_M
5、ODELVIEW); gluLookAt(0,-200000,200000, 0,0,0, 0,0,1); glColor3f(1,0,0);/sun glutSolidSphere(69600,20,20); glColor3f(0,0,1); glRotatef(day,0,0,-1); glTranslatef(150000,0,0);/earth glutSolidSphere(15945,20,20); glColor3f(1,1,0); glRotatef(day/30.0*360 - day, 0,0,-1); glTranslatef(38000,0,0);/moon glut
6、SolidSphere(4345,20,20); glutSwapBuffers();void timer(int p) day +; if(day 360)day = 0; glutTimerFunc(50,timer,0); glutPostRedisplay();int main(int argc,char *argv) glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutCreateWindow(earth,moon,sun); glutInitWindowSize(400,400); glutD
7、isplayFunc(display); glutMainLoop(); return 0;(2)小球的自由落体运动#includestdlib.hstdio.htime.hmath.h#define PI 3.1415926double move=20.0;int i=0;int down=1;int count=1;double timeSpan=0; /下降到底所需时间double movey=0.0;double duration=0.0; /持续时间double length=0.0;clock_t start,end;void init(void) printf( init GLf
8、loat mat_specular=220.220,220.0,220.0,220.0; GLfloat mat_shininess=70.0; GLfloat light_position=0.0, 0.0, 0.0, -2.0; /r-l u-d f-b GLfloat ambientLight = 0.2f, 0.2f, 0.2f, 1.0f ; GLfloat diffuseLight = 0.6f, 0.6f, 0.6f, 1.0f ; GLfloat specular = 1.0f, 1.0f, 1.0f, 1.0f; glClearColor(0.3,0.8,0.8,0.0);
9、/bgc glColor3ub(23, 17, 215); glShadeModel(GL_SMOOTH); glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular); glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess); glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight); glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight); glLightfv(GL_LIGHT0,GL_SPECULAR,specular); glLightfv(
10、GL_LIGHT0,GL_POSITION,light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); /启用深度测试void reshape(int w,int h) reshape glViewport(0,0,(GLsizei)w,(GLsizei)h); if(w19.932) move=20; down=1; printf(%i,down); start=clock(); display();void MoveSphereDown() if(count=1) count=0; end=clock(); duration =
11、 (double)(end - start) /CLOCKS_PER_SEC; length=5*duration*duration; if(move-20) timeSpan=duration; /记下下降所经历的时间 move=-20; down=0; /向上运动void TimerFunc2(int value) if(i=0) /left GLfloat light_position=2.0,0.0,0.0,0.0; glLightfv(GL_LIGHT0,GL_POSITION,light_position); if(i=1) /left-up GLfloat light_posit
12、ion=2.0,2.0,0.0,0.0; if(i=2) /up GLfloat light_position=0.0,2.0,0.0,0.0; if(i=3) /up-right GLfloat light_position=-2.0,2.0,0.0,0.0; if(i=4) /right GLfloat light_position=-2.0,0.0,0.0,0.0; if(i=5) /right-down GLfloat light_position=-2.0,-2.0,0.0,0.0; if(i=6) /down GLfloat light_position=0.0,-2.0,0.0,
13、0.0; if(i=7) /down-left GLfloat light_position=2.0,-2.0,0.0,0.0; i=(+i)%8; printf(,i); glutTimerFunc(60,TimerFunc2,1);void TimerFunc1(int value) if(down=1) MoveSphereDown(); if(down=0) MoveSphereUp(); glutTimerFunc(10,TimerFunc1,0);int main(int argc,char *argv) glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(400,740); glutInitWindowPosition(300,20);小球自由落体运动 init(); glutDisplayFunc(initDisplay); glutReshapeFunc(reshape); glutTimerFunc(1400,TimerFunc1,0); /毫秒 glutTimerFunc(400,TimerFunc2,1);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1