图形学场景设计.docx

上传人:b****0 文档编号:9917732 上传时间:2023-05-22 格式:DOCX 页数:16 大小:557.83KB
下载 相关 举报
图形学场景设计.docx_第1页
第1页 / 共16页
图形学场景设计.docx_第2页
第2页 / 共16页
图形学场景设计.docx_第3页
第3页 / 共16页
图形学场景设计.docx_第4页
第4页 / 共16页
图形学场景设计.docx_第5页
第5页 / 共16页
图形学场景设计.docx_第6页
第6页 / 共16页
图形学场景设计.docx_第7页
第7页 / 共16页
图形学场景设计.docx_第8页
第8页 / 共16页
图形学场景设计.docx_第9页
第9页 / 共16页
图形学场景设计.docx_第10页
第10页 / 共16页
图形学场景设计.docx_第11页
第11页 / 共16页
图形学场景设计.docx_第12页
第12页 / 共16页
图形学场景设计.docx_第13页
第13页 / 共16页
图形学场景设计.docx_第14页
第14页 / 共16页
图形学场景设计.docx_第15页
第15页 / 共16页
图形学场景设计.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

图形学场景设计.docx

《图形学场景设计.docx》由会员分享,可在线阅读,更多相关《图形学场景设计.docx(16页珍藏版)》请在冰点文库上搜索。

图形学场景设计.docx

图形学场景设计

 

计算机图形学课程设计报告

 

题目自然场景设计

院(系、部)

专业班级

学号

姓名

成绩

 

1设计目的与要求

1.1设计题目

自然场景设计

1.2设计目的

以小组合作的方式绘制一个自然场景,给绘制的实体添加纹理光照效果,进一步巩固所学知识,提高团队合作能力

1.3设计要求

(1)采用真实感图形学技术设计一个自然场景

(2)模拟出水、云、山体等至少三种景物

(3)实现场景的漫游

(4)对设计出的图像进行光照处理

(5)将图片的纹理贴附到物体表面

2总体设计

2.1功能简介

创建一个900*600的Windows窗口,在窗口中显示冰箱、电灯、茶壶三个实体,根据电灯位置在地面上绘制个实体的投影;为茶壶添加纹理;利用键盘的方向键控制冰箱旋转,实现场景漫游

2.2功能模块图

 

2.3软件各模块功能介绍

2.3.1冰箱和茶壶的绘制

由四边形拼接出冰箱,通过平移旋转函数放置到指定位置,同时实现茶壶的绘制,在茶壶上添加纹理效果,通过平移旋转变换放置到冰箱上面

2.3.2顶灯的绘制

绘制出一个带灯罩的电灯,并且将光源放置在灯泡的位置

2.3.3设置光照

设置光照的各种参数,为场景添加光照效果,让实体具有立体效果

2.3.4纹理图片生成

用数组存储一幅自己设计的纹理图片,方便实体添加纹理效果时的调用

2.3.5影子生成

根据需求为场景中的实体添加阴影效果,使得场景效果更加逼真

2.3.6法向量设置

为场景设置法向量,确保实体在不同的角度都能被看到

3详细设计及关键代码

3.1光照模块详细设计

3.1.1光照设置功能

设置光照的各种参数,为场景添加光照效果,让实体具有立体效果

3.1.2光照设置设计

1>设置光照的初值包括:

环境光照强度、漫反射光照强度、镜面反射光照强度、光源位置

2>在实体绘制函数中开启光照效果

3.1.3具体代码实现

GLfloatambientLight[]={0.3f,0.3f,1.3f,1.0f};

GLfloatdiffuseLight[]={0.7f,0.7f,0.7f,1.0f};

GLfloatspecular[]={1.0f,1.0f,1.0f,1.0f};

GLfloatlightPos[]={346.0f,400.0f,-20.0f,0.0f};

GLfloatspecref[]={1.0f,1.0f,1.0f,1.0f};

voidlight(void)//光照函数

{

GLfloatpoints[3][3]={{-30.0f,-149.0f,-400.0f},

{-30.0f,-149.0f,-420.0f},

{40.0f,-149.0f,-420.0f}};

glEnable(GL_DEPTH_TEST);

glMatrixMode(GL_PROJECTION);

glFrontFace(GL_CCW);//Counterclock-wisepolygonsfaceout

glEnable(GL_CULL_FACE);

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambientLight);

glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuseLight);

glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular);

glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,75);

glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);

glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);

glLightfv(GL_LIGHT0,GL_SPECULAR,specular);

glLightfv(GL_LIGHT0,GL_POSITION,lightPos);

glEnable(GL_LIGHT0);

glEnable(GL_COLOR_MATERIAL);

glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);

glMaterialfv(GL_FRONT,GL_SPECULAR,specref);

glMateriali(GL_FRONT,GL_SHININESS,128);

glClearColor(0.4f,0.3f,0.6f,1.0f);

glDepthFunc(GL_LESS);

glEnable(GL_AUTO_NORMAL);

glEnable(GL_NORMALIZE);

glFrontFace(GL_CW);

}

3.1.4光照设置限制条件

光源位置设置必须在预先设置好的空间中

3.2纹理模块设置

3.2.1纹理设置模块功能

用数组存储一幅自己设计的纹理图片,通过设置对应坐标在指定的实体上添加纹理效果

3.2.2纹理添加模块设计

1>.利用三维数组存储纹理图片中每个点的颜色值,在给实体添加纹理时调用纹理图片生成函数,将三维数组中存储的纹理图案添加到实体上

2>.从文件中读取一张图片,按照需要将纹理图片添加到对应的实体上

3.2.3纹理添加模块数据结构描述

1>.所用数据结构为一个三维数组,用于存储纹理图片的每点颜色值

2>.文件存储纹理图片

3.2.4纹理添加模块具体实现代码

1>.纹理图片自己绘制

voidGet_Mandeldrot_image(void)//生成纹理图片

{

doublemin_a,max_a,min_b,max_b,step_a,step_b,a,b;

intn=64,x,y,k,t;//n=180foraJuliaset

floatscale=255.0/n,width=300,height=400;

for(x=0;x

{

//b=min_b;

for(y=0;y

{k=(x/80+2)%2;

t=(y/50+2)%2;

if(t==0&&k==0)

{

Mandelbrot_image[x][y][0]=255;

Mandelbrot_image[x][y][1]=255;

Mandelbrot_image[x][y][2]=0;

}

else

{

Mandelbrot_image[x][y][0]=255;

Mandelbrot_image[x][y][1]=0;

Mandelbrot_image[x][y][2]=255;

}

}

}

}

给实体添加纹理

glPushAttrib(GL_ALL_ATTRIB_BITS);

glGenTextures(1,&Texture);

glBindTexture(GL_TEXTURE_2D,Texture);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);

Get_Mandeldrot_image();

glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,300,400,0,GL_RGB,GL_UNSIGNED_BYTE,Mandelbrot_image);

glEnable(GL_TEXTURE_2D);

glMatrixMode(GL_TEXTURE);

glMatrixMode(GL_MODELVIEW);

glColor3f(1.0,1.0,0.00);

//glRotatef(90,1.0f,0.0f,0.0f);

glTranslated(0.0f,118.0f,-40.0f);

glutSolidTeapot(15);//绘制茶壶

glPopAttrib();

2>.纹理图片由文件读入

AUX_RGBImageRec*LoadBMP(char*Filename)//载入位图图象

{

FILE*File=NULL;//文件句柄

if(!

Filename)

{

returnNULL;

}

File=fopen(Filename,"abc");

if(File)

{

fclose(File);

returnauxDIBImageLoadA(Filename);

}

returnNULL;}

intLoadGLTextures()

{

intStatus=FALSE;

AUX_RGBImageRec*TextureImage[1];

memset(TextureImage,0,sizeof(void*)*1);

if(TextureImage[0]=LoadBMP("menu.bmp"))

{

Status=TRUE;

glGenTextures(1,&texture[0]);

glBindTexture(GL_TEXTURE_2D,texture[0]);

//生成纹理

glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,

TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,

TextureImage[0]->data);

glTexParameteri

(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);//线形滤波

glTexParameteri

(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//线形滤波

}

if(TextureImage[0]){

if(TextureImage[0]->data)

{

free(TextureImage[0]->data);}

free(TextureImage[0]);

}

returnStatus;//返回Status

}

3.2.5纹理添加模块限制条件

纹理图片添加时应注意比例

3.3法向量设置模块

3.3.1法向量设置模块功能

为场景设置法向量,确保实体在不同的角度都能被看到

3.3.2法向量设置模块设计

首先用两个点算出一个向量,用同样的方法计算出另外一个向量,对求的的两个向量做笛卡尔积求出平面的法向量

3.3.2法向量设置模块数据结构

利用数组存储每个点的坐标值

3.3.4法向量设置模块具体实现代码

voidcalcNormal(floatv[3][3],floatout[3])

{

floatv1[3],v2[3];

staticconstintx=0;

staticconstinty=1;

staticconstintz=2;

//Calculatetwovectorsfromthethreepoints

v1[x]=v[0][x]-v[1][x];

v1[y]=v[0][y]-v[1][y];

v1[z]=v[0][z]-v[1][z];

v2[x]=v[1][x]-v[2][x];

v2[y]=v[1][y]-v[2][y];

v2[z]=v[1][z]-v[2][z];

//Takethecrossproductofthetwovectorstoget

//thenormalvectorwhichwillbestoredinout

out[x]=v1[y]*v2[z]-v1[z]*v2[y];

out[y]=v1[z]*v2[x]-v1[x]*v2[z];

out[z]=v1[x]*v2[y]-v1[y]*v2[x];

//Normalizethevector(shortenlengthtoone)

ReduceToUnit(out);

}

3.4影子生成模块详细设计

3.4.1影子生成模块功能

根据需求为场景中的实体添加阴影效果,使得场景效果更加逼真

3.4.2影子生成模块设计

将所需要添加阴影效果的实体与投影面做求交运算,得到一个边界,将这个区域填充为黑色实现阴影效果

3.4.3影子生成模块具体实现代码

voidDrawJet(BOOLbShadow)

{

floatnormal[3];//Storeageforcalculatedsurfacenormal

//NoseCone/////////////////////////////

//Setmaterialcolor,noteweonlyhavetosettoblack

//fortheshadowonce

if(!

bShadow)

glColor3ub(0,255,200);

Else

设置填充颜色为黑色

glColor3ub(0,0,0);

实体各点坐标

}

3.5顶灯绘制模块

3.5.1顶灯绘制模块功能

绘制出一个带灯罩的电灯,并且将光源放置在灯泡的位置

3.5.2顶灯绘制模块设计

1>.灯泡的绘制

调用OpenGL库函数glutSolidSphere()绘制一个球并为其添加颜色

2>.灯罩绘制和电线绘制

调用OpenGl库函数glBegin(GL_QUADS)绘制一个独立填充四边形为其设置颜色,通过平移变换放置到合适位置,电线绘制与灯罩绘制方法类似

3.5.3顶灯绘制模块具体实现代码

voiddraw_lamp()//绘制电灯

{

glColor3f(.0f,.0f,.0f);

glBegin(GL_QUADS);//电线

glVertex3f(345,500,-200);

glVertex3f(347,500,-200);

glVertex3f(347,380,-200);

glVertex3f(345,380,-200);

glEnd();

glColor3f(.0f,1.0f,.0f);//灯罩

//glBegin(GL_TRIANGLES);

glBegin(GL_QUADS);

glVertex3f(347,380,-200);

glVertex3f(367,360,-200);

glVertex3f(325,360,-200);

glVertex3f(345,380,-200);

glEnd();

glColor3f(2.0f,2.0f,.0f);//灯泡

glTranslated(346.0f,362.0f,-200.0f);

glScalef(0.4,0.4,0.4);

glutSolidSphere(25.0f,10,10);

}

3.5.4顶灯绘制模块限制条件

绘制实体时应该注意绘制的先后顺序,最先绘制的实体将遮挡后面绘制的实体

3.6冰箱和茶壶绘制模块

3.6.1冰箱茶壶绘制模块功能

由四边形拼接出冰箱,通过平移旋转函数放置到指定位置,同时实现茶壶的绘制,在茶壶上添加纹理效果,通过平移旋转变换放置到冰箱上面

3.6.2冰箱茶壶绘制模块设计

1>.冰箱绘制

调用OpenGL库函数glBegin(GL_QUADS)根据设计要求绘制独立填充四边形,由多个四边形组合成冰箱

2>.茶壶绘制

调用OpenGL库函数glutSolidTeapot();绘制一个茶壶,通过平移旋转变换放置到指定位置

3.6.3冰箱茶壶绘制模块具体实现代码

绘制冰箱

voiddraw_refrigerator()//绘制冰箱

{

glPushMatrix();

glColor3f(0.0f,1.0f,0.0f);

glTranslated(210.0f,230.0f,-40.0f);

glScalef(0.6,0.6,0.6);

glRotatef(yRot,0.0f,1.0f,0.0f);

glutSolidTeapot(12);//绘制茶壶

glPopMatrix();

glPushMatrix();

glColor3f(.0f,.0f,.0f);

glBegin(GL_LINES);

glVertex3f(210.0f,230.0f,-40.0f);

glVertex3f(165,200,-50);

glVertex3f(210.0f,230.0f,-40.0f);

glVertex3f(215,200,-50);

glVertex3f(210.0f,230.0f,-40.0f);

glVertex3f(190,210,-90);

glVertex3f(210.0f,230.0f,-40.0f);

glVertex3f(240,210,-90);

glEnd();

glColor3f(.0f,.0f,.0f);

glBegin(GL_QUADS);

glVertex3f(165,100,-50);

glVertex3f(165,102,-50);

glVertex3f(215,102,-50);

glVertex3f(215,100,-50);

glEnd();

glColor3f(.0f,.0f,.0f);

glBegin(GL_QUADS);

glVertex3f(165,130,-50);

glVertex3f(165,132,-50);

glVertex3f(215,132,-50);

glVertex3f(215,130,-50);

glEnd();

glColor3f(2.0f,2.0f,2.0f);

glBegin(GL_QUADS);

glVertex3f(185,180,-50);

glVertex3f(190,180,-50);

glVertex3f(190,165,-50);

glVertex3f(185,165,-50);

glEnd();

glColor3f(0.5f,0.5f,1.0f);

glBegin(GL_QUADS);

glVertex3f(165,30,-50);

glVertex3f(165,200,-50);

glVertex3f(215,200,-50);

glVertex3f(215,30,-50);

glEnd();

glColor3f(1.0f,1.0f,1.0f);

glBegin(GL_QUADS);

glVertex3f(165,200,-50);

glVertex3f(190,210,-50);

glVertex3f(240,210,-50);

glVertex3f(215,200,-50);

glEnd();

glBegin(GL_QUADS);

glVertex3f(240,210,-50);

glVertex3f(240,50,-50);

glVertex3f(215,30,-50);

glVertex3f(215,200,-50);

glEnd();

glPopMatrix();

}

3.6.4冰箱茶壶绘制模块限制条件

绘制四边形时四个顶点的先后顺序需要根据法向量的方向设置

3.7场景顶视图

 

4程序生成界面图形

5参考文献

[1]杨钦,徐永安,翟红英.计算机图形学[M].北京:

清华大学出版社,2005,03

(1):

70-173

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

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

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2