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

上传人:b****1 文档编号:262417 上传时间:2022-10-08 格式:DOCX 页数:23 大小:81.56KB
下载 相关 举报
计算机图形学大作业报告(灯光纹理映射).docx_第1页
第1页 / 共23页
计算机图形学大作业报告(灯光纹理映射).docx_第2页
第2页 / 共23页
计算机图形学大作业报告(灯光纹理映射).docx_第3页
第3页 / 共23页
计算机图形学大作业报告(灯光纹理映射).docx_第4页
第4页 / 共23页
计算机图形学大作业报告(灯光纹理映射).docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

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

《计算机图形学大作业报告(灯光纹理映射).docx》由会员分享,可在线阅读,更多相关《计算机图形学大作业报告(灯光纹理映射).docx(23页珍藏版)》请在冰豆网上搜索。

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

大 作 业 报 告

实验课程名称:

计算机图形学

学生姓名:

班 级:

学 院(系):

学生学号:

指导教师:

成 绩:

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”后,下方的光照效果发生变化,截图如下:

使用鼠标实现图像方向的变化,截图如下:

使用鼠标实现图像大小的变化,截图如下:

放大:

缩小:

三、心得

通过对本次大作业试验

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1