计算机图形学大作业报告(灯光纹理映射).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;iglColor3f(1,1,0);glBegin(type);
for(inti=0;iglutSwapBuffers();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]=(xwidth/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;ivert[i][1]=vert[i+1][1];
}
n--;
}else{
vert[v][0]=(xwidth/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”后,下方的光照效果发生变化,截图如下:
使用鼠标实现图像方向的变化,截图如下:
使用鼠标实现图像大小的变化,截图如下:
放大:
缩小:
三、心得
通过对本次大作业试验