#include<> #include
计算机图形学实验报告openGL的基本使用1.项目代码:// : 定义控制台应用程序的入口点。
#include""#include<iostream>#include<>#include<gl/>#include<gl/>#include<gl/>using namespace std;//#include"" 编程宝典第8版库函数//#include""GLfloat x=,y=,z=;//用于平移的变量GLfloat i=,j=,k=;//用于缩放的变量int d=1;//用于是否判断旋转的开关GLfloat angle=;//旋转角度的变量void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 创建透视效果视图glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective, , , ;glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt, , , , , , , , ;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 定义4光源,从4个方向入射,第一个是白光,其他为红绿蓝{GLfloat sun_light_position[] = { , , , };GLfloat sun_light_position1[] = { , , , };GLfloat sun_light_position2[] = { , , , };GLfloat sun_light_position3[] = { , , , };GLfloat sun_light_ambient[] = { , , , };GLfloat sun_light_diffuse[] = { , , , };GLfloat sun_light_diffuse1[] = { , , , };GLfloat sun_light_diffuse2[] = { , , , };GLfloat sun_light_diffuse3[] = { , , , };GLfloat sun_light_specular[] = { , , , };glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position);glLightfv(GL_LIGHT0, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_diffuse);glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular);glLightfv(GL_LIGHT1, GL_POSITION, sun_light_position1);glLightfv(GL_LIGHT1, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT1, GL_DIFFUSE, sun_light_diffuse1);glLightfv(GL_LIGHT1, GL_SPECULAR, sun_light_specular);glLightfv(GL_LIGHT2, GL_POSITION, sun_light_position2);glLightfv(GL_LIGHT2, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT2, GL_DIFFUSE, sun_light_diffuse2);glLightfv(GL_LIGHT2, GL_SPECULAR, sun_light_specular);glLightfv(GL_LIGHT3, GL_POSITION, sun_light_position3);glLightfv(GL_LIGHT3, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT3, GL_DIFFUSE, sun_light_diffuse3);glLightfv(GL_LIGHT3, GL_SPECULAR, sun_light_specular);glEnable(GL_LIGHT0);glEnable(GL_LIGHT1);glEnable(GL_LIGHT2);glEnable(GL_LIGHT3);glEnable(GL_LIGHTING);glEnable(GL_DEPTH_TEST);}//绘制坐标轴{glBegin(GL_LINE);//x轴红色glColor3f(1,0,0);glVertex3f(10,0,0);glVertex3f(-10,0,0);//y轴绿色glColor3f(0,1,0);glVertex3f(0,10,0);glVertex3f(0,-10,0);//z轴蓝色glColor3f(0,0,1);glVertex3f(0,0,10);glVertex3f(0,0,-10);glEnd();}// 定义球体的材质并绘制{GLfloat ambient[] = { , , , };//环境颜色GLfloat diffuse[] = { , , , };//散射颜色GLfloat specular[] = { , , , };//镜面反射GLfloat emission[] = { , , , };//发射光颜色GLfloat hininess = ; //反射指数glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, specular);glMaterialfv(GL_FRONT, GL_EMISSION, emission);glMaterialf(GL_FRONT, GL_SHININESS, shininess);glTranslatef(x,y,z);glScalef(i,j,k);if(d==1){glRotatef(angle,,,;glTranslatef,,;}glutSolidSphere, , ;}glutSwapBuffers();}void ChangeSize(GLsizei W,GLsizei H)//当视口改变时改变裁剪部分保证图形观察时不形变{GLfloat aspectRatio;if(H==0)H=1;glViewport(0,0,W,H);//视口设置glMatrixMode(GL_PROJECTION);//重置坐标系统glLoadIdentity();aspectRatio=(GLfloat)W/(GLfloat)H;if(aspectRatio<=1)//裁剪部分设置glOrtho,,aspectRatio,aspectRatio,,;elseglOrtho*aspectRatio,*aspectRatio,,,,;glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void ProcessKeys(unsigned char ch,int a,int b) {if(ch==119)//w{y+=;glutPostRedisplay();}else if(ch==115)//s{y-=;glutPostRedisplay();else if(ch==97)//a{x-=;glutPostRedisplay(); }else if(ch==100)//d{x+=;glutPostRedisplay(); }else if(ch==120)//x{z-=;glutPostRedisplay(); }else if(ch==122)//z{z+=;glutPostRedisplay(); }else if(ch==43)//+i+=;j+=;k+=;glutPostRedisplay();}else if(ch==45)//-{i-=;j-=;k-=;glutPostRedisplay();}else if(ch==32)//空格键{if(d==0)d=1;else d=0;cout<<d<<endl;}//按空格开关旋转}void IdleFunc(){if(d==1){angle+=;if(angle=={angle=;}cout<<angle<<endl;myDisplay();}}int _tmain(int argc, char* argv[]){glutInit(&argc, (char**) argv);glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(100,100);glutInitWindowSize(500,500);glutCreateWindow("Hello OpenGL");glutDisplayFunc(myDisplay);glutReshapeFunc(ChangeSize);glutIdleFunc(IdleFunc);glutKeyboardFunc(ProcessKeys);glutReshapeFunc(ChangeSize);glutMainLoop();return 0;}二.系统总体布局系统流程图:本系统是常规的openGL系统,初始化后先设置视角、投影、光照、材质等因素,绘制基本的图形,再通过函数判断键盘输入进行重复绘制,完成基本的平移,缩放,旋转等操作三.系统设计思路在系统设计最初,本来想直接使用默认视角后直接设置光照和平移旋转等功能,但是发现在默认视角下对物体,特别是正方体的三维效果无法很好地观察,因此采用侧视视角然后在对材质的定义上,由于立方体设置比较麻烦,最后决定画一个球体,然后在平移旋转缩放等功能的演示上,直接演示过于简单,就是一个函数的执行,因此决定采取利用键盘控制移动和缩放及旋转的方式。
具体操作方法为wsadzx分别控制前后左右上下,space控制开始/停止旋转四.感想和心得在本次实验中,对我来说最大的问题是正确地理解视点,投影等概念;在默认状态下视角从Z轴正方向看向负方向,对于很多规则物体不旋转的话无法清楚地看到其三维特征,在调整视角的过程中遇到一些问题。