计算机图形学课程设计.docx
- 文档编号:17221502
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:11
- 大小:142.29KB
计算机图形学课程设计.docx
《计算机图形学课程设计.docx》由会员分享,可在线阅读,更多相关《计算机图形学课程设计.docx(11页珍藏版)》请在冰豆网上搜索。
计算机图形学课程设计
计算机图形学
课程设计报告
班级:
学号:
姓名:
成绩:
一.设计目的与要求
题目二:
纹理映射及光照处理
(1)对一个简单几何模型建模
(2)将图片的纹理贴附到物体表面
(3)对设计出的图像进行明暗(光照)、阴影等处理
(4)给出至少2个视角的图像(抓图)
二.软件功能模块图
三.软件各模块功能介绍
建立简单的几何模型:
选取立方体作为模型建立,同时加入旋转处理;
图形映射处理:
用函数设定从内存中读取纹理图并放到屏幕上的方式,指定内存中每个象素行起始的排列要求。
光线处理:
设置光照参数。
四.程序代码清单(部分)
#include
#include
#include
#include"glut.h"
floatr=0;
GLuinttexture;
BYTE*gltReadBMPBits(constchar*szFileName,int*nWidth,int*nHeight)
{
HANDLEhFileHandle;
BITMAPINFO*pBitmapInfo=NULL;
unsignedlonglInfoSize=0;
unsignedlonglBitSize=0;
BYTE*pBits=NULL;//Bitmapsbits
BITMAPFILEHEADERbitmapHeader;
DWORDdwBytes;
//OpentheBitmapfile
//OpentheBitmapfile
hFileHandle=CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,
NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
//Checkforopenfailure(mostlikelyfiledoesnotexist).
if(hFileHandle==INVALID_HANDLE_VALUE)
returnNULL;
//FileisOpen.Readinbitmapheaderinformation
ReadFile(hFileHandle,&bitmapHeader,sizeof(BITMAPFILEHEADER),
&dwBytes,NULL);
//Checkforacoupleofsimpleerrors
if(dwBytes!
=sizeof(BITMAPFILEHEADER))
returnFALSE;
//Checkformatofbitmapfile
if(bitmapHeader.bfType!
='MB')
returnFALSE;
//Readinbitmapinformationstructure
lInfoSize=bitmapHeader.bfOffBits-sizeof(BITMAPFILEHEADER);
pBitmapInfo=(BITMAPINFO*)malloc(sizeof(BYTE)*lInfoSize);
ReadFile(hFileHandle,pBitmapInfo,lInfoSize,&dwBytes,NULL);
if(dwBytes!
=lInfoSize)
{
free(pBitmapInfo);
CloseHandle(hFileHandle);
returnFALSE;
}
//Savethesizeanddimensionsofthebitmap
*nWidth=pBitmapInfo->bmiHeader.biWidth;
*nHeight=pBitmapInfo->bmiHeader.biHeight;
lBitSize=pBitmapInfo->bmiHeader.biSizeImage;
//Ifthesizeisn'tspecified,calculateitanyway
if(pBitmapInfo->bmiHeader.biBitCount!
=24)
{
free(pBitmapInfo);
returnFALSE;
}
if(lBitSize==0)
lBitSize=(*nWidth*
pBitmapInfo->bmiHeader.biBitCount+7)/8*
abs(*nHeight);
//Allocatespacefortheactualbitmap
free(pBitmapInfo);
pBits=(unsignedchar*)malloc(sizeof(BYTE)*lBitSize);
//Readinthebitmapbits,checkforcorruption
if(!
ReadFile(hFileHandle,pBits,lBitSize,&dwBytes,NULL)||
dwBytes!
=(sizeof(BYTE)*lBitSize))
pBits=NULL;
//Closethebitmapfilenowthatwehaveallthedataweneed
CloseHandle(hFileHandle);
returnpBits;
}
voidInit(void)
{
glClearColor(1.0,1.0,1.0,1.0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
BYTE*pBytes;
intnWidth,nHeight;
glGenTextures(1,&texture);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
pBytes=gltReadBMPBits("a.bmp",&nWidth,&nHeight);
glBindTexture(GL_TEXTURE_2D,texture);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB8,nWidth,nHeight,0,GL_BGR_EXT,GL_UNSIGNED_BYTE,pBytes);
free(pBytes);
}
voiddisplay()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//ClearScreenAndDepthBuffer
//glLoadIdentity();//ResetTheCurrentModelviewMatrix
//glTranslatef(-1.5f,0.0f,-6.0f);//MoveLeft1.5UnitsAndIntoTheScreen6.0
//glRotatef(rtri,0.0f,1.0f,0.0f);//RotateTheTriangleOnTheYaxis(NEW)
glPushMatrix();
glRotatef(r,1.0f,1.0f,1.0f);
glBegin(GL_QUADS);//StartDrawingATriangle
glColor3f(1,1,1);
glTexCoord2f(0.0f,0.0f);
glVertex3f(1.0f,-1.0f,1.0f);
glTexCoord2f(1.0f,0.0f);
glVertex3f(1.0f,-1.0f,1.0f);
glTexCoord2f(1.0f,1.0f);
glVertex3f(1.0f,1.0f,1.0f);
glTexCoord2f(0.0f,1.0f);
glVertex3f(1.0f,1.0f,1.0f);//前面
glColor3f(1,1,1);
glTexCoord2f(0.0f,0.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glTexCoord2f(1.0f,0.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glTexCoord2f(1.0f,1.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glTexCoord2f(0.0f,1.0f);
glVertex3f(1.0f,-1.0f,-1.0f);//后面
glColor3f(1,1,1);
glTexCoord2f(0.0f,0.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
glTexCoord2f(1.0f,0.0f);
glVertex3f(-1.0f,1.0f,1.0f);
glTexCoord2f(1.0f,1.0f);
glVertex3f(1.0f,1.0f,1.0f);
glTexCoord2f(0.0f,1.0f);
glVertex3f(1.0f,1.0f,-1.0f);//顶面
glColor3f(1,1,1);
glTexCoord2f(0.0f,0.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glTexCoord2f(1.0f,0.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glTexCoord2f(1.0f,1.0f);
glVertex3f(1.0f,1.0f,1.0f);
glTexCoord2f(0.0f,1.0f);
glVertex3f(1.0f,-1.0f,1.0f);//右面
glColor3f(1,1,1);
glTexCoord2f(0.0f,0.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glTexCoord2f(1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,1.0f);
glTexCoord2f(1.0f,1.0f);
glVertex3f(-1.0f,1.0f,1.0f);
glTexCoord2f(0.0f,1.0f);
glVertex3f(-1.0f,1.0f,-1.0f);//左面
glColor3f(1,1,1);
glTexCoord2f(0.0f,0.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glTexCoord2f(1.0f,0.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glTexCoord2f(1.0f,1.0f);
glVertex3f(1.0f,-1.0f,1.0f);
glTexCoord2f(0.0f,1.0f);
glVertex3f(-1.0f,-1.0f,1.0f);//底面
glEnd();
glPopMatrix();
//glutWireSphere(0.5,50,50);
GLfloatlight_ambient[]={0.1,1.0,0.0,1.0};
GLfloatlight_diffuse[]={1.0,1.1,0.1,1.0};
GLfloatlight_specular[]={1.0,1.1,0.0,0.0};
GLfloatlight_postion[]={0.0,1.0,1.0,1.0};
glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
glLightfv(GL_LIGHT0,GL_POSITION,light_postion);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glutSolidSphere(0.5,50,50);
glFlush();//刷新函数
}
voidreshape(intw,inth)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);//设置机口
glMatrixMode(GL_PROJECTION);//指定哪一个矩阵是当前矩阵
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glOrtho(-4.0,4.0,-4.0,4.0,-4.0,4.0);
}
voidmouse(intbutton,intstate,intx,inty)
{
switch(button){
caseGLUT_LEFT_BUTTON:
r=r+10;
if(r==360)
r=0;
glutPostRedisplay();
break;
default:
break;
}
}
voidmain()
{
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA|GLUT_DEPTH);
glutInitWindowSize(800,600);
glutInitWindowPosition(50,50);
glutCreateWindow("计算机图形学");
Init();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMainLoop();
}
五.程序生成界面图形(部分)
六.参考文献
[1]计算机图形学基础教程/孙家广,胡事民编著.第2版.清华大学出版社,2009.8
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 课程设计