计算机图形学大作业报告(灯光纹理映射).docx
- 文档编号:262417
- 上传时间:2022-10-08
- 格式:DOCX
- 页数:23
- 大小:81.56KB
计算机图形学大作业报告(灯光纹理映射).docx
《计算机图形学大作业报告(灯光纹理映射).docx》由会员分享,可在线阅读,更多相关《计算机图形学大作业报告(灯光纹理映射).docx(23页珍藏版)》请在冰豆网上搜索。
大 作 业 报 告
实验课程名称:
计算机图形学
学生姓名:
班 级:
学 院(系):
学生学号:
指导教师:
成 绩:
23
一、目的
这次大作业是作为这学期的最后的一个考核,所以必须要用到所有的本学期学过的知识,比如怎样画出三维图形,怎样在图像上在图像上添加纹理光照,怎样使用鼠标和键盘进行人机交互等。
二、主要功能模块设计
1矩阵运算模块的设计:
功能描述:
程序启动后,这部分功能模块会为整个应用程序提供算法支持,具体是矩阵直接的相互运算,在2D向3D转化过程中会起到很重要的作用。
代码设计:
floatvv(float*v1,float*v2){
returnv1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2];
}
voidvxv(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];
}
voidloadIdentity(Matrixm){
Matrixidentity={{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(inti=0;i<4;i++)for(intj=0;j<4;j++)
m[i][j]=identity[i][j];
}
voidpreMultiply(Matrixp,Matrixm){
inti,j;
Matrixt;
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函数
voiddisplay(){
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(inti=0;i glColor3f(1,1,0);glBegin(type); for(inti=0;i glutSwapBuffers();initQMesh();glutSetWindow(winid);glutPostRedisplay(); } //3D图形的显示函数voidmodelDisplay(){ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix();floatM[16]; for(intr=0;r<4;r++)for(intc=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绘制窗体的键盘敲击处理函数 voidkeyboard(unsignedcharkey,intx,inty){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显示窗体的键盘敲击事件处理函数: voidmodelKeyboard(unsignedcharkey,intx,inty){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窗体的鼠标事件 voidmodelMouse(intbutton,intstate,intx,inty){switch(button){ caseGLUT_LEFT_BUTTON: if(state==GLUT_DOWN){cx=x; cy=h-1-y;dx=dy=0; left_button_down=true; }else left_button_down=false;break; caseGLUT_RIGHT_BUTTON: if(state==GLUT_DOWN){cx=x; cy=h-1-y;right_button_down=true; }else right_button_down=false;break; } } //2D窗体鼠标事件 voidmouse(intbutton,intstate,intx,inty){y=height-1-y; switch(button){ caseGLUT_LEFT_BUTTON: if(state==GLUT_DOWN&&! rubberbanding){v=n++; vert[v][0]=(x width/2: (x>=width)? width-1: x;vert[v][1]=(y<0)? 0: (y>=height)? height-1: y;rubberbanding=true; glutPostRedisplay(); } elserubberbanding=false;break; caseGLUT_RIGHT_BUTTON: if(state==GLUT_DOWN&&! rubberbanding&&(v=findVertex(x,y))! =-1){ if(glutGetModifiers()==GLUT_ACTIVE_CTRL){for(inti=v;i vert[i][1]=vert[i+1][1]; } n--; }else{ vert[v][0]=(x width/2: (x>=width)? width-1: x;vert[v][1]=(y<0)? 0: (y>=height)? height-1: y;rubberbanding=true; } glutPostRedisplay(); } elserubberbanding=false;break; } } 功能截图: 利用鼠标在界面上画出原来的图,截图如下: 按住“Z”后,上方的光照变化,截图如下: 按住“Y”后,下方的光照效果发生变化,截图如下: 使用鼠标实现图像方向的变化,截图如下: 使用鼠标实现图像大小的变化,截图如下: 放大: 缩小: 三、心得 通过对本次大作业试验
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 作业 报告 灯光 纹理 映射