研究生计算机图形学课程室内场景OpenGL实验报告.docx
- 文档编号:7831599
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:14
- 大小:19.80KB
研究生计算机图形学课程室内场景OpenGL实验报告.docx
《研究生计算机图形学课程室内场景OpenGL实验报告.docx》由会员分享,可在线阅读,更多相关《研究生计算机图形学课程室内场景OpenGL实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
研究生计算机图形学课程室内场景OpenGL实验报告
《高级计算机图形学》实验报告
姓名:
学号:
班级:
【实验报告要求】
实验名称:
高级计算机图形学室内场景
实验目的:
掌握使用OpenGL生成真实感复杂对象的方法,进一步熟练掌握构造实体几何表示法、扫描表示法、八叉树法、BSP树法等建模方法。
实验要求:
要求利用OpenGL生成一个真实感的复杂对象及其周围场景,并显示观测点变化时的几何变换,要具备在一个纹理复杂的场景中漫游功能。
要求使用到光线跟踪算法、纹理映射技术以及实时绘制技术。
一、实验效果图
图1:
正面效果图
图2:
背面效果图
图4:
背面效果图
图4:
室内场景细节效果图
图5:
场景角度转换效果图
二、源文件数据代码:
共6个文件,其实现代码如下:
1、
#include""
#include""
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
END_MESSAGE_MAP()
2、
#include""
#include""
#include""
#include""
#include""
#include""
255.0f255.0f255.0f1.5f1.0f
intWinWidth,WinHeigth;
unsignedshortintcomp=32;
unsignedshortinttemp,texture_mapping=FALSE,
land_fogging=TRUE,flat_shading=TRUE;
floatangle,Near,ex,ey,ez,cx,cy,cz;
staticGLfloatspeed=0;
#defineFORWARD1
#defineUP2
#defineTURNLEFT3
#defineLOOKUP5
intoldmx=0,oldmy=0,mb;
0.8f400.0f500.0f0.75f0.75f1.0f1.0f1.0f500.0f0.0f1.0f0.0f5.0f1.0fvoidCRenderView:
:
MoveEye(inttype,GLfloatamount,intupdate)
{
GLfloata;
switch(type){
caseFORWARD:
a=sqrt((cx-ex)*(cx-ex)+(cz-ez)*(cz-ez));
ex=(amount*(cx-ex)+a*ex)/a;
ez=(amount*(cz-ez)+a*ez)/a;
cx=(amount*(cx-ex)+a*cx)/a;
cz=(amount*(cz-ez)+a*cz)/a;
break;
caseTURNLEFT:
cx=(cx-ex)*(float)cos(amount/360.0f)+(cz-ez)*(float)sin(amount/360.0f)+ex;
cz=(cz-ez)*(float)cos(amount/360.0f)-(cx-ex)*(float)sin(amount/360.0f)+ez;
break;
caseUP:
ey+=amount;
break;
caseLOOKUP:
cy+=amount;
break;
}
if(update){
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(ex,ey,ez,cx,cy,cz,0.0f,1.0f,0.0f);
}
}
TEXTURE_2D**TextureList;
OBJECT*ObjectList;/*ObjectList[0]:
isolatedsurfaces*/
INT4SObjectNum;
chargEnergyFile[30];
charsLookAtFN[100];
charImageName[30];
voidCRenderView:
:
ReadData()
{
inti,j,l;
FILE*fp;
charstemp[100];
POINT3D*plist;
INT4UnAllVertexNum;
INT4U*pchlist;
strcpy(gEnergyFile,"");
fp=fopen(gEnergyFile,"r");
if(fp==NULL)
{
printf("\nCannotopenenergydatafile:
%s\n",gEnergyFile);
exit(0);
}
fseek(fp,0,SEEK_SET);
/******readtexturelist******/
fscanf(fp,"%s",stemp);
while(strcmp(stemp,"texnum")!
=0)fscanf(fp,"%s",stemp);
fscanf(fp,"%d",&texnum);
TextureList=(TEXTURE_2D**)malloc(sizeof(TEXTURE_2D)*(texnum+1));
for(i=1;i<=texnum;i++)
{
TextureList[i]=(TEXTURE_2D*)malloc(sizeof(TEXTURE_2D));
fscanf(fp,"%s%s",TextureList[i]->fname,stemp);
if(strcmp(stemp,"REPEAT_TEXTURE")==0)
TextureList[i]->type=1;
elseif(strcmp(stemp,"CLAMP_TEXTURE")==0)
TextureList[i]->type=0;
}
/******Readobjectlist******/
fscanf(fp,"%s",stemp);
while(strcmp(stemp,"ObjectNum")!
=0)fscanf(fp,"%s",stemp);
fscanf(fp,"%ld",&ObjectNum);
ObjectList=(OBJECT*)malloc(sizeof(OBJECT)*ObjectNum);
for(i=0;i { fscanf(fp,"%s",stemp); while(strcmp(stemp,"SurfaceNum")! =0)fscanf(fp,"%s",stemp); fscanf(fp,"%ld",&(ObjectList[i].SurfNum)); ObjectList[i].surflist=(SURFACE*)malloc(sizeof(SURFACE)*ObjectList[i].SurfNum); for(j=0;j { /******Readsurfaceinfor******/ fscanf(fp,"%s",stemp); while(strcmp(stemp,"TextureId")! =0)fscanf(fp,"%s",stemp); fscanf(fp,"%d",&(ObjectList[i].surflist[j].texId)); fscanf(fp,"%s",stemp); while(strcmp(stemp,"pointnum")! =0)fscanf(fp,"%s",stemp); fscanf(fp,"%d",&(ObjectList[i].surflist[j].pointn)); fscanf(fp,"%s",stemp); while(strcmp(stemp,"triangle")! =0)fscanf(fp,"%s",stemp); fscanf(fp,"%d",&(ObjectList[i].surflist[j].triangle)); fscanf(fp,"%s",stemp); while(strcmp(stemp,"quadrangle")! =0)fscanf(fp,"%s",stemp); fscanf(fp,"%d",&(ObjectList[i].surflist[j].quadric)); /******Readpointlist******/ ObjectList[i].surflist[j].pointlist=(POINT3D*)malloc(sizeof(POINT3D)* ObjectList[i].surflist[j].pointn); plist=ObjectList[i].surflist[j].pointlist; for(l=0;l fscanf(fp,"%f%f%f%f%f%f%f%f", &(plist[l].r),&(plist[l].g),&(plist[l].b), &(plist[l].u),&(plist[l].v), &(plist[l].x),&(plist[l].y),&(plist[l].z)); /******Readpatchlist******/ nAllVertexNum=ObjectList[i].surflist[j].triangle*3+ ObjectList[i].surflist[j].quadric*4; ObjectList[i].surflist[j].patchlist=(INT4U*)malloc(sizeof(INT4U)*nAllVertexNum); pchlist=ObjectList[i].surflist[j].patchlist; for(l=0;l fscanf(fp,"%ld",&(pchlist[l])); } } fclose(fp); } voidCRenderView: : InitLookAt() { FILE*fp; strcpy(sLookAtFN,""); fp=fopen(sLookAtFN,"rb"); if(fp==NULL) { ex=ey=ez=1.0f; cx=cy=cz=0.0f; Near=0.1f; angle=30.0f; } elsefscanf(fp,"%f%f%f%f%f%f%f%f",&angle,&Near,&ex,&ey,&ez,&cx,&cy,&cz); fclose(fp); } voidCRenderView: : InitRenderWin() { glShadeModel(GL_SMOOTH); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluPerspective(angle,(float)WinWidth/(float)WinHeigth,Near,; gluLookAt(ex,ey,ez,cx,cy,cz,,,; } voidCRenderView: : Render(void) { inti,j,k,l,m,TexIndex; POINT3D*plist; INT4U*pchlist; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_ACCUM_BUFFER_BIT); for(i=0;i for(j=0;j { TexIndex=ObjectList[i].surflist[j].texId; if(TexIndex>0) InitTex(TexIndex); plist=ObjectList[i].surflist[j].pointlist; pchlist=ObjectList[i].surflist[j].patchlist; l=0; for(k=0;k { glBegin(GL_TRIANGLES); for(m=0;m<3;m++) { glColor3f(plist[pchlist[l]].r, plist[pchlist[l]].g, plist[pchlist[l]].b); glTexCoord2f(plist[pchlist[l]].u, plist[pchlist[l]].v); glVertex3f(plist[pchlist[l]].x, plist[pchlist[l]].y, plist[pchlist[l]].z); l++; }/*m*/ glEnd(); }/*k*/ for(k=0;k { glBegin(GL_QUADS); for(m=0;m<4;m++) { glColor3f(plist[pchlist[l]].r, plist[pchlist[l]].g, plist[pchlist[l]].b); glTexCoord2f(plist[pchlist[l]].u, plist[pchlist[l]].v); glVertex3f(plist[pchlist[l]].x, plist[pchlist[l]].y, plist[pchlist[l]].z); l++; }/*m*/ glEnd(); }/*k*/ glFlush(); CloseTex(); } } voidCRenderView: : freelist() { inti,j; for(i=0;i { for(j=0;j { free(ObjectList[i].surflist[j].pointlist); free(ObjectList[i].surflist[j].patchlist); } free(ObjectList[i].surflist); } free(ObjectList); for(i=1;i<=texnum;i++) free(TextureList[i]); free(TextureList); } externTEXTURE_2D**TextureList; /********************************/ /*function: OpenTexImage*/ /********************************/ unsignedchar*CRenderView: : OpenTexImage(INT2UTexIndex,INT2U*rslx,INT2U*rsly) { unsignedchar*image; FILE*fp; INT2Usrcx,srcy; INT4Ui,j; charImageName[30]; unsignedchar*SImageData; intrc; intwidth,height; strcpy(ImageName,TextureList[TexIndex]->fname); /*loadaimage*/ fp=fopen(ImageName,"rb"); if(! fp)return0; fseek(fp,18L,0); rc=fread(&width,sizeof(long),1,fp); rc=fread(&height,sizeof(long),1,fp); *rslx=srcx=width;*rsly=srcy=height; fseek(fp,54L,0); image=(unsignedchar*)malloc(width*height*3); rc=fread(image,width*height*3,1,fp); fclose(fp); SImageData=(unsignedchar*)malloc(srcx*srcy*3); for(i=0;i for(j=0;j (unsignedchar)*(SImageData+i*srcx*3+j*3+0)=(unsignedchar)*(image+i*srcx*3+j*3+2); (unsignedchar)*(SImageData+i*srcx*3+j*3+1)=(unsignedchar)*(image+i*srcx*3+j*3+1); (unsignedchar)*(SImageData+i*srcx*3+j*3+2)=(unsignedchar)*(image+i*srcx*3+j*3+0); } } free(image); printf("%s: %ld=%ld\n",ImageName,srcx*srcy*3,i*j*3); return(SImageData); } /********************************/ /*function: InitTex*/ /********************************/ voidCRenderView: : InitTex(intTexIndex) { INT2UTextType; unsignedchar*ImageData; staticintOldIndex=-1; if(TexIndex<=0)return; if(TexIndex==OldIndex) { glEnable(GL_TEXTURE_2D); return; } ImageData=ImageDatas[TexIndex-1]; TextType=TextureList[TexIndex]->type; glPixelStorei(GL_UNPACK_ALIGNMENT,1); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); if(TextType==CLAMP_TEXTURE) { glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); } else { glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); } glTexImage2D(GL_TEXTURE_2D,0,3,rslxs[TexIndex-1],rslys[TexIndex-1], 0,GL_RGB,GL_UNSIGNED_BYTE,ImageData); glEnable(GL_TEXTURE_2D); OldIndex=TexIndex; } /********************************/ /*function: CloseTex*/ /********************************/ voidCRenderView: : CloseTex() { glDisable(GL_TEXTURE_2D); } voidCRenderView: : LoadAllTexture() { inti; for(i=0;i ImageDatas[i]=OpenTexImage(i+1,&rslxs[i],&rslys[i]); } voidCRenderView: : Fre
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 研究生 计算机 图形学 课程 室内 场景 OpenGL 实验 报告