当前位置:文档之家› 计算机图形学大作业报告记录(灯光纹理映射)

计算机图形学大作业报告记录(灯光纹理映射)

计算机图形学大作业报告记录(灯光纹理映射)————————————————————————————————作者:————————————————————————————————日期:大作业报告实验课程名称:计算机图形学学生姓名:班级:学院(系):学生学号:指导教师:成绩:一、目的这次大作业是作为这学期的最后的一个考核,所以必须要用到所有的本学期学过的知识,比如怎样画出三维图形,怎样在图像上在图像上添加纹理光照,怎样使用鼠标和键盘进行人机交互等。

二、主要功能模块设计1 矩阵运算模块的设计:功能描述:程序启动后,这部分功能模块会为整个应用程序提供算法支持,具体是矩阵直接的相互运算,在2D向3D转化过程中会起到很重要的作用。

代码设计:float vv(float * v1, float * v2){return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];}void vxv(float * n, float * v1, float * v2){n[0] = v1[1] * v2[2] - v1[2] * v2[1];n[1] = v1[2] * v2[0] - v1[0] * v2[2];n[2] = v1[0] * v2[1] - v1[1] * v2[0];}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++)m[i][j] = identity[i][j];}void preMultiply(Matrix p, Matrix m){int i , j;Matrix t;for( i = 0; i < 4; i ++)for( j = 0; j < 4; j++)t[i][j] = p[i][0] * m[0][j] + p[i][1] * m[1][j] + p[i][2] * m[2][j] + p[i][3] * m[3][j];for( i = 0; i < 4; i ++)for( j = 0; j < 4; j ++)m[i][j] = t[i][j];}2 显示图形模块的设计:功能描述:该模块主要为所要画的图形进行描述,是绘制图形的主要函数,通过调用这个功能模块就能画出用于显示给用户的图形。

代码设计://2D图形的display函数void display(){glClear(GL_COLOR_BUFFER_BIT);if(n == 1 && type ==GL_LINE_STRIP) {glBegin(GL_POINTS);glVertex2iv(vert[0]);glColor3f(0,0.5,0.5);glVertex2i(width-vert[0][0]-1,vert[0][1]);glEnd();}glColor3f(0,0.5,0.5);glBegin(GL_LINES);glVertex2i(width/2,0);glVertex2i(width/2,height-1);glEnd();glBegin(type);for(int i = 0;i<n;i++) glVertex2i(width-vert[i][0]-1,vert[i][1]);glEnd();glColor3f(1,1,0);glBegin(type);for(int i = 0;i<n;i++) glVertex2iv(vert[i]);glEnd();glutSwapBuffers();initQMesh();glutSetWindow(winid);glutPostRedisplay();}//3D图形的显示函数void modelDisplay(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix();float M[16];for(int r = 0; r < 4; r++) for(int c = 0; c < 4; c++) M[4 * c + r] = CRM[r][c];glMultMatrixf(M);glScalef(zoom,zoom,zoom);drawQMesh();glPopMatrix();glPushMatrix();glLightfv(GL_LIGHT0,GL_AMBIENT,amb);glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);glPopMatrix();glutSwapBuffers();}3 键盘敲击模块功能描述:该功能主要为两个窗体添加键盘敲击事件,在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);}else{glDisable(GL_BLEND);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();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':lightPosition[0] = lightPosition[0] - 0.5; //光源移动break;case'n':lightPosition[1] = lightPosition[1] - 0.5;break;case'z':lightPosition[2] = lightPosition[2] - 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: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 ,int y){y = height - 1 - y;switch(button){case GLUT_LEFT_BUTTON:if(state == GLUT_DOWN && ! rubberbanding ){v = n++;vert[v][0] = (x < width/2) ? width/2: (x >= width) ? width - 1 : x;vert[v][1] = (y < 0) ? 0 : (y >= height) ? height -1 : y;rubberbanding = true;glutPostRedisplay();}else rubberbanding = false;break;case GLUT_RIGHT_BUTTON:if(state == GLUT_DOWN && ! rubberbanding && (v = findVertex(x,y)) != -1) {if(glutGetModifiers() == GLUT_ACTIVE_CTRL) {for (int i = v; i< n-1; i++){vert[v][0] = vert[i+1][0];vert[i][1] = vert[i+1][1];}n--;}else{vert[v][0] = (x < width/2) ? width/2 : (x >= width) ? width - 1 : x;vert[v][1] = (y < 0) ? 0 : (y >= height) ? height -1 : y;rubberbanding = true;}glutPostRedisplay();}else rubberbanding = false;break;}}功能截图:利用鼠标在界面上画出原来的图,截图如下:按住“Z”后,上方的光照变化,截图如下:按住“Y”后,下方的光照效果发生变化,截图如下:使用鼠标实现图像方向的变化,截图如下:使用鼠标实现图像大小的变化,截图如下:放大:缩小:三、心得通过对本次大作业试验的编写,更进一步了解了OpenGL的用法,从计算机图形学课程中可能收获最多的并不是图形学的一些基础知识,虽然这些很重要,但是真正有些成就感的还是用OpenGL开发出来的这些程序。

相关主题