图形学综合实验.docx
- 文档编号:4301915
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:41
- 大小:4.51MB
图形学综合实验.docx
《图形学综合实验.docx》由会员分享,可在线阅读,更多相关《图形学综合实验.docx(41页珍藏版)》请在冰豆网上搜索。
图形学综合实验
期末时上交的图形学实验报告,虽然只得了良,但用心去做了,供大家参考(实验报告+源程序+图片素材):
数学与计算机科学学院实验报告
计算机图形综合实验
程序名称:
FantasySolarSystem
程序设计者:
***
学号:
***
所在学院、班级:
数学与计算机科学(软件)学院08级综合班
电子邮件:
fzu_xxs2010@
指导教师:
***
完稿日期:
二○一一年六月十四日
Ø实验名称:
太阳系的模拟
Ø实验内容:
1、绘制太阳系8大行星
2、显示行星的运动轨道;
3、实现8大行星、太空等的纹理映射;
4、实现各大行星的公转和自转;
5、设置合适的灯光,模拟太阳、月亮、地球、星星等光照效果;
6、通过控制摄像机的漫游与环视,实现太阳系的漫游;
7、显示各行星的简介资料;
8、利用融合、雾化等方法,增强太空的真实感效果;
9、设计合理、友好的交互界面。
通过鼠标、键盘(包括功能键、组合键)、菜单等,控制各种参数的变化。
比如:
(1)行星的运转速度、运动轨迹显示的开关;
(2)灯光的开启、位置、颜色以及材质;
(3)漫游的方向控制;
(4)雾化、融合效果的控制。
10、其它功能(自定,选做)。
Ø实验环境
1.软件环境:
(1)操作系统:
Windows7
(2)编译器:
MicrosoftVisualStudio2008
2.硬件环境:
(1)主板:
技嘉GA-MA785GT-UT3H
(2)CPU:
AMDAthlon(tm)II×4630Processor
(3)内存:
KingstonDDR3,2G
(4)硬盘:
SATA500G
(5)屏幕分辨率:
1024×768
Ø实验方案与程序设计
1.设置初始化函数init()实现对自转、公转速度的初始,字符显示列表的初始,深度信息的设置,视见体的初始,投影矩阵的设置,以及灯光、纹理、材质的设置。
2.显示回调函数myDisplay()实现对场景的总体绘制:
通过myFog()实现雾化;draw_back_ground()实现背景绘制;draw_path()实现轨道绘制;draw_planet()实现星球的绘制;show_info()则实现了星体信息的显示。
3.通过键盘回调函数、功能键回调函数和右键菜单更改各个参数以实现多种特殊效果,如漫游、星体的单独显示、雾的颜色和浓度的更改、自转和公转的速度设置、灯光的开户关闭和颜色的设置、重置场景以及退出程序等。
4.详细信息见程序代码及注释。
Ø实验结果与分析(包括功能说明、操作说明)
1.通过f键开启和关闭雾化效果;
2.通过l(字母L)键开启和关闭太阳光源;
3.通过r键重置场景;
4.通过q键退出程序;
5.通过数字键0到9实现各星体的单独显示和全部显示;
6.当单独显示某一星体时,可通过w,s键加快或减缓该星体的自转速度,通过a,d键加快或减缓该星体的公转速度;
7.通过z,x,c,v键移动视点的焦点;
8.通过四个方向键和PageUp,PageDown键移动视点的坐标;
9.单击右键弹出右键菜单,各菜单项说明如下:
◆Path:
[showmovingpath]表示显示运动轨迹和坐标轴,[hidemovingpath]表示隐藏运动轨迹和坐标轴
◆Rotation:
[startrotation]表示开启自转,[stoprotation]表示停止自转
◆Revolution:
[startrevolution]表示开启公转,[stoprevolution]表示停止公转
◆FogDensity:
设置雾的浓度,[thin]表示小雾,[medium]表示普通雾,[thick]大雾
◆FogColor:
设置雾的颜色(灰色、红色、蓝色、绿色)
◆SunLightColor:
设置太阳光的颜色,四个可选项依次为白色、红色、绿色、蓝色
Ø实验中遇到的问题及解决方法
1.Q:
生成的可执行文件在其它计算机上不能运行。
S:
首先是犯了一个低级错误,就是生成可执行文件时没将debug改为release;其次在没有安装opengl库文件的机子上,是没有glut32.dll的,所以要将可执行文件和glut32.dll一起拷贝到其它计算机上。
2.Q:
处理纹理的函数auxDIBImageLoadW在生成可执行文件时出错,提示信息为[errorC2664:
“auxDIBImageLoadW”:
不能将参数1从“char*”转换为“LPCWSTR”]。
S:
这是由于VS2008默认使用Unicode字符,LPCWSTR即是Unicode字符的一种。
解决方法为更改工程的属性:
项目->FantasySolarSystem属性…->配置属性->常规,在其中的字符集选项中把“使用Unicode字符集”更改为“未设置”。
3.Q:
在实验室的机子上,星体的贴图无法正常显示,出现时隐时现的情况,同时灯光也随之出错。
S:
视见体的前截面的值设得太小了,将其从0.01改为10,问题解决。
之所以在自己宿舍的计算机上可以显示,可能原因是计算能力相对机房的机子强一些故可处理的精度更高一些。
4.Q:
在加入了键盘回调函数之后,字符无法正常显示。
S:
原因是键盘回调函数本身会将从键盘输入的字符读入程序中,从而使显示字符列表的初始化失败。
解决方案为在键盘事件发生前调用传递空串给显示字符函数进行字符显示列表的初始化。
5.Q:
启用雾化效果时,显示结果为一大片不透明灰色。
S:
最后发现是雾化的起始位置和结束位置问题,将起始和结束位置设为与视见体初始相同,问题解决。
同时雾化效果必须有灯光的配合。
Ø实验心得(自我评价)与建议
这个SolarSystem写得好累,1081行的代码敲得都憔悴了。
实验提交时限又正好赶上考试,所以上交时间有些迟。
虽然有理论课作为基础,但实践时发现各种矩阵之间的相互影响有时搞得程序跑出来的结果莫名其妙,许多次不得不重写所有代码,先后经历了好几个版本的修改。
总结前期失败的原因,主要是程序的结构不够清晰,各功能的实现相互交叉,导致耦合度过高,引起许多隐含错误。
后面学乖了,首先设计整体的框架,抽象出各个相对独立的部件,再在这些部件内实现功能。
同时在启用纹理绘制完对象后立即关闭纹理,以减少潜在的对其它矩阵的影响。
这种方式写出来的代码条理清楚,思路清晰则易于查错,经过注释方面的美化之后,不得不说其实挺漂亮的。
虽然最终实现的效果没有那么炫丽,但在完成实验的过程中学到了许多理论课上所没有的知识。
有时出现的错误自己觉得是毫无道理的,求助Google无果后,自己只能一步一步地调试,一行一行地注释,一个变量一个变量地修改参数,一个位置一个位置地安放函数。
最终的结果是——错误不是没有道理的,而是自己本身考虑事情不够全面。
错误不单是代码方面的,还有自己逻辑上的和系统编译方面等,有些还是openGL自身固有的。
面对Bug调试很久没有解决,有时会相当沮丧,甚至觉得自己根本没有能力解决。
但静下心来认真查资料,问题是会逐渐明朗化的,所以对自己要有信心。
写完这个代码,终于可以脸不红心不跳地说自己已经完成openGL编程入门了。
附录一(源程序):
/*************************************************************************
*File:
FantasySolarSystem.cpp
*Version:
4.0aleph
*Compiler:
VisualStudio2008
*Author:
s0*******5
*E-mail:
fzu_xxs2010@
*Function:
ThisisanOpenGLprogramtoimitatesolarsystem
*Usage:
*#1.Pressthekey'f'toturnonorturnoffthefog
*#2.Pressthekey'l'toturnonorturnoffthesunlight
*#3.Pressthekey'r'toresetthescene
*#4.Pressthekey'q'toexittheprogram.
*#5.Pressthenumberbuttontoshowplanetalone:
*0:
showallplanet
*1:
showSun
*2:
showMercury
*3:
showVenus
*4:
showEarthandMoon
*5:
showMars
*6:
showJupiter
*7:
showSaturn
*8:
showUranus
*9:
showNeptune
*#6.Whenyoushowplanetalone,youcanchangethespeedofrotationandrevolution:
*Press'w'toincreasethespeedofrotation
*Press's'todecreasethespeedofrotation
*Press'd'toincreasethespeedofrevolution
*Press'a'todecreasethespeedofrevolution
*#7.Press'z','x','c'or'v'tomovethefocusofview
*'z'----left'x'----right'c'----up'v'----down
*#8.thepositionofviewpointcanbechangedby:
*up-arrow:
towardsnear
*down-arrow:
towardsfar
*left-arrow:
towardsleft
*right-arrow:
towardsright
*PageUpkey:
towardsupside
*PageDownkey:
towardsdownside
*#9.Clickrightbuttontopopthemainmenu:
*Path:
showpathornot
*Rotation:
startorstoprotation
*Revolution:
startorstoprevolution
*FogDensity:
setthedensityoffog(thin,mediumorthick)
*FogColor:
setthecoloroffog(grey,red,blueorgreen)
*SunLightColor:
setthecolorofsunlight(white,red,greenorblue)
*
*Attention:
Youshouldsetyourprojectdon'tuseUnicodecharacters
*Lastmodify:
2011-6-14
*
**************************************************************************/
/*************************************************************************
*
*HeadFile
*
**************************************************************************/
#include
#include
#include
#include
#include
#include
/*************************************************************************
*
*Macro
*
**************************************************************************/
#pragmacomment(lib,"opengl32.lib")
#pragmacomment(lib,"glu32.lib")
#pragmacomment(lib,"glaux.lib")
#pragmacomment(lib,"GLUT32.LIB")
#defineTRUE1
#defineFALSE0
#definePIE3.1415926
#defineMAXTEXTURE11
#definewidth1024
#defineheight512
#defineMAX_CHAR128
/*************************************************************************
*
*StaticGlobalVar
*
**************************************************************************/
staticGLintshow_back_ground=TRUE;//showthebackgroundbitmap
staticGLuinttexture[MAXTEXTURE];//thearrayoftextures
staticGLintcnt=0;//theindexofthetextures
staticGLuintisFirstCall=TRUE;//firstcallcharacterdisplaylist
staticGLuintlists;//characterdisplaylists
staticGLfloatlookx=0.0,looky=100.0,lookz=300.0;//coordinateofviewport
staticGLfloatlook_x=0.0,look_y=0.0,look_z=0.0;//focuspointofviewport
staticGLintshow_planet=0;//choosetheplanettoshow
staticGLintshow_path=TRUE;//showthepathofplanetmoving
staticGLfloatmyTime,myTime_2;//thecomputersystemtime
staticGLintrotation_speed[9];//adjusttherotationspeedofEarth
staticGLintrevolution_speed[9];//adjusttherevolutionspeedofEarth
staticGLintstop_rotation=FALSE;//stoprotationofplanets
staticGLintstop_revolution=FALSE;//stoprevolutionofplanets
staticGLfloatsun_ambient[]={1.0,0.9,0.9,0.1};//ambientpartofsunlight
staticGLfloatsun_diffuse[]={1.0,0.9,0.9,1.0};//diffusepartofsunlight
staticGLfloatsun_specular[]={1.0,0.9,0.9,1.0};//specularpartofsunlight
staticGLfloatsun_position[]={0.0,0.0,0.0,1.0};//thepositionofsunlight
staticGLfloatglobel_ambient[]={0.3,0.3,0.3,1.0};//globellight
staticGLfloatsun_self_emission[]={0.8,0.8,0.8,1.0};//thesurfacelightofsun
staticGLfloatplanet_ambient[]={0.01,0.01,0.01,1.0};//ambientpartofplanetsurface
staticGLfloatplanet_diffuse[]={0.7,0.7,0.7,1.0};//diffusepartofplanetsurface
staticGLfloatplanet_specular[]={0.5,0.5,0.5,0.5};//specularpartofplanetsurface
staticGLfloatplanet_self_emission[]={0.2,0.2,0.2,1.0};//thesurfacelightofplanetsurface
staticGLfloatplanet_high_light[]={120.0};//highlightscoefficientofplanet
staticGLintsun_light_on=TRUE;//thestateofsunlight
staticGLintset_fog=TRUE;//startfogeffectornot
staticGLfloatfog_density=10.0;//thedensityoffog
staticGLfloatfog_color[4]={0.5f,0.5f,0.5f,1.0f};//thecoloroffog
staticGLUquadricObj*g_text=gluNewQuadric();//achievetexturebyquadricobject
/*************************************************************************
*
*Function
*
**************************************************************************/
/*----------------------------------------*/
/*openbitmapfile*/
/*----------------------------------------*/
AUX_RGBImageRec*LoadImage(char*Filename){
FILE*File=NULL;
if(!
Filename)returnNULL;
File=fopen(Filename,"r");
if(File){
fclose(File);
returnauxDIBImageLoad(Filename);
}
returnNULL;
}
/*----------------------------------------*/
/*loadtextures*/
/*----------------------------------------*/
intLoadGLTextures(char*Filename){
GLintStatus=FALSE;
AUX_RGBImageRec*TextureImage[1];
memset(TextureImage,0,sizeof(void*)*1);
if(TextureImage[0]=LoadImage(Filename)){
Status=TRUE;
glGenTextures(1,&texture[cnt]);
glBindTexture(GL_TEXTURE_2D,texture[cnt++]);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data);
}
if(TextureImage[0]){
if(TextureImage[0]->data){
free(TextureImage[0]->data);
}
free(TextureImage[0]);
}
returnStatus;
}
/*----------------------------------------*/
/*loadthetextureswhichwillbeused*/
/*----------------------------------------*/
intInitTexture()
{
if(!
LoadGLTextures("Image/space.bmp"))
{
pr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形学 综合 实验