1、大作业报告实验课程名称:计算机图形学学 生 姓 名 : 班级: 学院(系): 学生学号: 指 导 教 师: 成绩: 23一、目的这次大作业是作为这学期的最后的一个考核,所以必须要用到所有的本学期学过的知识, 比如 怎样画出三维图形,怎样在图像上在图像上添加纹理光照,怎样使用鼠标和键盘进行人机交互等。二、主要功能模块设计1 矩阵运算模块的设计:功能描述:程序启动后,这部分功能模块会为整个应用程序提供算法支持,具体是矩阵直接的相互运算,在 2D 向 3D 转化过程中会起到很重要的作用。代码设计:float vv(float * v1, float * v2)return v10 * v20 + v
2、11 * v21 + v12 * v22;void vxv(float * n, float * v1, float * v2) n0 = v11 * v22 - v12 * v21;n1 = v12 * v20 - v10 * v22;n2 = v10 * v21 - v11 * v20;void loadIdentity(Matrix m)Matrix identity = 1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0;for(int i = 0;i 4; i+) for(int j = 0;j 4; j+)
3、mij = identityij;void preMultiply(Matrix p, Matrix m)int i , j;Matrix t;for( i = 0; i 4; i +) for( j = 0; j 4; j+)tij = pi0 * m0j + pi1 * m1j + pi2 * m2j + pi3* m3j;for( i = 0; i 4; i +) for( j = 0; j 4; j +)mij = tij;2 显示图形模块的设计:功能描述:该模块主要为所要画的图形进行描述,是绘制图形的主要函数,通过调用这个功能模块就能画出用于显示给用户的图形。代码设计:/2D图形的d
4、isplay函数void display()glClear(GL_COLOR_BUFFER_BIT);if(n = 1 & type =GL_LINE_STRIP) glBegin(GL_POINTS); glVertex2iv(vert0); glColor3f(0,0.5,0.5);glVertex2i(width-vert00-1,vert01);glEnd();glColor3f(0,0.5,0.5); glBegin(GL_LINES);glVertex2i(width/2,0); glVertex2i(width/2,height-1);glEnd();glBegin(type);
5、for(int i = 0;in;i+) glVertex2i(width-verti0-1,verti1); glEnd();glColor3f(1,1,0); glBegin(type);for(int i = 0;in;i+) glVertex2iv(verti); glEnd();glutSwapBuffers(); initQMesh(); glutSetWindow(winid); glutPostRedisplay();/3D图形的显示函数void modelDisplay()glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);g
6、lPushMatrix(); float M16;for(int r = 0; r 4; r+) for(int c = 0; c 4; c+) M4 * c + r = CRMrc; glMultMatrixf(M);glScalef(zoom,zoom,zoom); drawQMesh(); glPopMatrix(); glPushMatrix();glLightfv(GL_LIGHT0,GL_AMBIENT,amb); glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); glPopMatrix();glutSwapBuffers();3
7、键盘敲击模块功能描述:该功能主要为两个窗体添加键盘敲击事件,在 2D 窗体中主要添加了反走样效果,清除所画的图,点线转化功能,对于 3D 窗体主要添加了投影方式的变换,光源移动的功能代码设计:/2D 绘制窗体的键盘敲击处理函数void keyboard(unsigned char key, int x,int y) switch(key)case a: antialiasing = ! antialiasing;/反走样效果if(antialiasing) glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH);elseglDisable(GL_BLEND);
8、 glDisable(GL_LINE_SMOOTH);break;case c: n = 0;break;/清除界面功能case l: type = GL_LINE_STRIP;break; /绘制线功能case v: type = GL_POINTS;break;/绘制点功能glutPostRedisplay();/3D 显示窗体的键盘敲击事件处理函数:void modelKeyboard(unsigned char key, int x, int y) switch (key) case o:glMatrixMode(GL_PROJECTION);/正投影glLoadIdentity();
9、 glOrtho(-4,4,-4,4,6,14);glMatrixMode(GL_MODELVIEW); break;case p:glMatrixMode(GL_PROJECTION);/侧投影,不过是默认的glLoadIdentity();gluPerspective(45.0,1.0,6.0,14.0); glMatrixMode(GL_MODELVIEW);break;case m:lightPosition0 = lightPosition0 - 0.5; /光源移动break;case n:lightPosition1 = lightPosition1 - 0.5;break;ca
10、se z:lightPosition2 = lightPosition2 - 0.5; break;case k:glDisable(GL_FOG); break;glutPostRedisplay();4 鼠标点击模块功能描述:该功能模块主要实现了对两个窗体鼠标事件的处理,对于 3D 窗体实现了鼠标左键旋转,由键放大缩小的效果,2D 窗体实现了左键画点,右键可以对已经存在的点改变它的位置。代码设计:/3D 窗体的鼠标事件void modelMouse(int button,int state,int x,int y) switch (button)case GLUT_LEFT_BUTTON:
11、if(state = GLUT_DOWN ) cx = x;cy = h - 1 - y; dx = dy = 0;left_button_down = true;elseleft_button_down = false; break;case GLUT_RIGHT_BUTTON:if(state = GLUT_DOWN) cx = x;cy = h - 1 - y; right_button_down = true;elseright_button_down = false; break;/2D 窗体鼠标事件void mouse(int button, int state, int x ,i
12、nt y) y = height - 1 - y;switch(button)case GLUT_LEFT_BUTTON:if(state = GLUT_DOWN & ! rubberbanding ) v = n+;vertv0 = (x = width) ? width - 1 : x; vertv1 = (y = height) ? height -1 : y; rubberbanding = true;glutPostRedisplay();else rubberbanding = false; break;case GLUT_RIGHT_BUTTON:if(state = GLUT_
13、DOWN & ! rubberbanding & (v = findVertex(x,y) != -1) if(glutGetModifiers() = GLUT_ACTIVE_CTRL) for (int i = v; i n-1; i+) vertv0 = verti+10;verti1 = verti+11;n-;elsevertv0 = (x = width) ? width - 1 : x; vertv1 = (y = height) ? height -1 : y; rubberbanding = true;glutPostRedisplay();else rubberbanding = false; break;功能截图:利用鼠标在界面上画出原来的图,截图如下:按住“Z”后,上方的光照变化,截图如下:按住“Y”后,下方的光照效果发生变化,截图如下:使用鼠标实现图像方向的变化,截图如下:使用鼠标实现图像大小的变化,截图如下:放大:缩小:三、心得通过对本次大作业试验
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1