1、Xopengl立方体的简单三维交互式几何变换实验报告 代码资料立方体的简单三维交互式几何变换立方体的简单三维交互式几何变换。功能:键盘的方向键实现立方体的上下左右平移;A键,S键分别实现向前,向后旋转;J键,K键分别实现放大,缩小;C键退出。程序模块:1.重绘回调函数,在窗口首次创建或用户改变窗口尺寸时被调用。void reshape(int w, int h) glViewport(0, 0, w, h);/ 指定视口的位置和大小 glMatrixMode(GL_PROJECTION); glLoadIdentity(); /glFrustum(-1.0, 1.0, -1.0, 1.0, 3
2、.1, 10.0); /gluPerspective(45,1,0.1,10.0);glOrtho(-2.0, 2.0, -2.0, 2.0, 2.0, 10.0);2.绘制一个立方体。void DrawBox() glBegin(GL_QUADS); /前面 glColor3f(1,0,0); glVertex3f(-1.0f, -1.0f, 1.0f); / 四边形的左下 glVertex3f( 1.0f, -1.0f, 1.0f); / 四边形的右下 glVertex3f( 1.0f, 1.0f, 1.0f); / 四边形的右上 glVertex3f(-1.0f, 1.0f, 1.0f)
3、; / 四边形的左上 / 后面 glColor3f(0,1,0); glVertex3f(-1.0f, -1.0f, -1.0f); / 四边形的右下 glVertex3f(-1.0f, 1.0f, -1.0f); / 四边形的右上 glVertex3f( 1.0f, 1.0f, -1.0f); / 四边形的左上 glVertex3f( 1.0f, -1.0f, -1.0f); / 四边形的左下 / 顶面 glColor3f(0,0,1); glVertex3f(-1.0f, 1.0f, -1.0f); / 四边形的左上 glVertex3f(-1.0f, 1.0f, 1.0f); / 四边形
4、的左下 glVertex3f( 1.0f, 1.0f, 1.0f); / 四边形的右下 glVertex3f( 1.0f, 1.0f, -1.0f); / 四边形的右上 / 底面 glColor3f(1,1,0); glVertex3f(-1.0f, -1.0f, -1.0f); / 四边形的右上 glVertex3f( 1.0f, -1.0f, -1.0f); / 四边形的左上 glVertex3f( 1.0f, -1.0f, 1.0f); / 四边形的左下 glVertex3f(-1.0f, -1.0f, 1.0f); / 四边形的右下 / 右面 glColor3f(0,1,1); glV
5、ertex3f( 1.0f, -1.0f, -1.0f); / 四边形的右下 glVertex3f( 1.0f, 1.0f, -1.0f); / 四边形的右上 glVertex3f( 1.0f, 1.0f, 1.0f); / 四边形的左上 glVertex3f( 1.0f, -1.0f, 1.0f); / 四边形的左下 / 左面 glColor3f(1,0,1); glVertex3f(-1.0f, -1.0f, -1.0f); / 四边形的左下 glVertex3f(-1.0f, -1.0f, 1.0f); / 四边形的右下 glVertex3f(-1.0f, 1.0f, 1.0f); /
6、四边形的右上 glVertex3f(-1.0f, 1.0f, -1.0f); / 四边形的左上 glEnd();3该模块设置屏幕颜色和深度缓存,设置立方体的平移,缩放,旋转变换。void display() glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); /清空颜色和深度缓存 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /gluLookAt(2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glTranslatef(0.0f+tx,0.0f+ty,-4.
7、0f);/平移变换 glScalef(1+sf,1+sf,1+sf); /缩放变换 glRotatef(ratX, 1.0f, 0.0f, 0.0f);/绕X轴的旋转变换 glRotatef(ratY, 0.0f, 1.0f, 0.0f);/绕Y轴的旋转变换 glRotatef(ratZ, 0.0f, 0.0f, 1.0f);/绕Z轴的旋转变换 DrawBox(); glFlush(); glutSwapBuffers(); 4.该模块为设置深度缓存和启动深度测试模式。void init() glClearColor (1.0, 1.0, 1.0, 1.0); glEnable(GL_DEPT
8、H_TEST); /启动深度测试模式5.该模块为设置键盘的交互式操作。void myKeyboard(unsigned char key, int x, int y) if(key = a | key = A) ratX += 2; ratY += 2; ratZ += 2;if(key = s | key = S) ratX -= 2; ratY -= 2; ratZ -= 2;if(key = j | key = J) sf+=0.1;if(key = k | key = K) sf-=0.1; if(key = c | key = C) exit(0);glutPostRedisplay
9、(); /重新调用绘制函数6.该模块为设置键盘方向键的交互式操作。void myspecialKeyboard(int key,int x,int y) if(key = GLUT_KEY_UP ) ty+=0.1; if(key = GLUT_KEY_DOWN) ty-=0.1;if(key =GLUT_KEY_LEFT) tx-=0.1;if(key=GLUT_KEY_RIGHT) tx+=0.1;glutPostRedisplay();7.主函数模块,实现设置显示模式(窗口大小,位置),调用函数操作。int main(int argc, char* argv) glutInit(&arg
10、c,argv); / 初始 GLUT. glutInitDisplayMode (GLUT_DEPTH |GLUT_DOUBLE | GLUT_RGB); /设定显示模式 glutInitWindowSize(400,400); / 设定窗口大小 glutInitWindowPosition(50,100); / 设定窗口位置 glutCreateWindow(立方体的简单三维交互式几何变换); / 用前面指定参数创建 glutReshapeFunc(reshape); /指定重绘回调函数 glutDisplayFunc(display); / 进行一些初始化工作 glutKeyboardFu
11、nc( myKeyboard); /指定键盘回调函数 glutSpecialFunc(myspecialKeyboard); /指定键盘回调函数 init(); glutMainLoop();/ 进入无穷循环,等待事件处理功能截图:立方体的平移:上平移下平移:左平移:右平移:放大:缩小:旋转:源程序:#include #include #include float ratX = 60;float ratY = 60;float ratZ = 60;float tx=0;float ty=0;float sf=0;void DrawBox() glBegin(GL_QUADS); /前面 glC
12、olor3f(1,0,0); glVertex3f(-1.0f, -1.0f, 1.0f); / 四边形的左下 glVertex3f( 1.0f, -1.0f, 1.0f); / 四边形的右下 glVertex3f( 1.0f, 1.0f, 1.0f); / 四边形的右上 glVertex3f(-1.0f, 1.0f, 1.0f); / 四边形的左上 / 后面 glColor3f(0,1,0); glVertex3f(-1.0f, -1.0f, -1.0f); / 四边形的右下 glVertex3f(-1.0f, 1.0f, -1.0f); / 四边形的右上 glVertex3f( 1.0f,
13、 1.0f, -1.0f); / 四边形的左上 glVertex3f( 1.0f, -1.0f, -1.0f); / 四边形的左下 / 顶面 glColor3f(0,0,1); glVertex3f(-1.0f, 1.0f, -1.0f); / 四边形的左上 glVertex3f(-1.0f, 1.0f, 1.0f); / 四边形的左下 glVertex3f( 1.0f, 1.0f, 1.0f); / 四边形的右下 glVertex3f( 1.0f, 1.0f, -1.0f); / 四边形的右上 / 底面 glColor3f(1,1,0); glVertex3f(-1.0f, -1.0f, -
14、1.0f); / 四边形的右上 glVertex3f( 1.0f, -1.0f, -1.0f); / 四边形的左上 glVertex3f( 1.0f, -1.0f, 1.0f); / 四边形的左下 glVertex3f(-1.0f, -1.0f, 1.0f); / 四边形的右下 / 右面 glColor3f(0,1,1); glVertex3f( 1.0f, -1.0f, -1.0f); / 四边形的右下 glVertex3f( 1.0f, 1.0f, -1.0f); / 四边形的右上 glVertex3f( 1.0f, 1.0f, 1.0f); / 四边形的左上 glVertex3f( 1.
15、0f, -1.0f, 1.0f); / 四边形的左下 / 左面 glColor3f(1,0,1); glVertex3f(-1.0f, -1.0f, -1.0f); / 四边形的左下 glVertex3f(-1.0f, -1.0f, 1.0f); / 四边形的右下 glVertex3f(-1.0f, 1.0f, 1.0f); / 四边形的右上 glVertex3f(-1.0f, 1.0f, -1.0f); / 四边形的左上 glEnd(); void display() glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); /清空颜色和深度缓存 g
16、lMatrixMode(GL_MODELVIEW); glLoadIdentity(); /gluLookAt(2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glTranslatef(0.0f+tx,0.0f+ty,-4.0f);/平移变换 glScalef(1+sf,1+sf,1+sf); /缩放变换 glRotatef(ratX, 1.0f, 0.0f, 0.0f);/绕X轴的旋转变换 glRotatef(ratY, 0.0f, 1.0f, 0.0f);/绕Y轴的旋转变换 glRotatef(ratZ, 0.0f, 0.0f, 1.0f);/绕
17、Z轴的旋转变换 DrawBox(); glFlush(); glutSwapBuffers(); void reshape(int w, int h) /重绘回调函数,在窗口首次创建或用户改变窗口尺寸时被调用 glViewport(0, 0, w, h);/ 指定视口的位置和大小 glMatrixMode(GL_PROJECTION); glLoadIdentity(); /glFrustum(-1.0, 1.0, -1.0, 1.0, 3.1, 10.0); /gluPerspective(45,1,0.1,10.0);glOrtho(-2.0, 2.0, -2.0, 2.0, 2.0, 1
18、0.0);void init() glClearColor (1.0, 1.0, 1.0, 1.0); glEnable(GL_DEPTH_TEST); /启动深度测试模式void myKeyboard(unsigned char key, int x, int y) if(key = a | key = A) ratX += 2; ratY += 2; ratZ += 2;if(key = s | key = S) ratX -= 2; ratY -= 2; ratZ -= 2;if(key = j | key = J) sf+=0.1;if(key = k | key = K) sf-=0
19、.1; if(key = c | key = C) exit(0);glutPostRedisplay(); /重新调用绘制函数void myspecialKeyboard(int key,int x,int y) if(key = GLUT_KEY_UP ) ty+=0.1; if(key = GLUT_KEY_DOWN) ty-=0.1;if(key =GLUT_KEY_LEFT) tx-=0.1;if(key=GLUT_KEY_RIGHT) tx+=0.1;glutPostRedisplay();int main(int argc, char* argv) glutInit(&argc,
20、argv); / 初始 GLUT. glutInitDisplayMode (GLUT_DEPTH |GLUT_DOUBLE | GLUT_RGB); /设定显示模式 glutInitWindowSize(400,400); / 设定窗口大小 glutInitWindowPosition(50,100); / 设定窗口位置 glutCreateWindow(立方体的简单三维交互式几何变换); / 用前面指定参数创建 glutReshapeFunc(reshape); /指定重绘回调函数 glutDisplayFunc(display); / 进行一些初始化工作 glutKeyboardFunc( myKeyboard); /指定键盘回调函数 glutSpecialFunc(myspecialKeyboard); /指定键盘回调函数 init(); glutMainLoop();/ 进入无穷循环,等待事件处理
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1