杭州电子科技大学《实时三维图形绘制》OpenGL大作业实验报告Word文件下载.docx
- 文档编号:19582996
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:18
- 大小:641.71KB
杭州电子科技大学《实时三维图形绘制》OpenGL大作业实验报告Word文件下载.docx
《杭州电子科技大学《实时三维图形绘制》OpenGL大作业实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《杭州电子科技大学《实时三维图形绘制》OpenGL大作业实验报告Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
/**改变窗口的显示设置*/
boolChangeScreenSetting();
/**当窗口大小改变时,通知OpenGL调整大小*/
voidReshapeGL();
/**SwapBuffers(DoubleBuffering)*/
voidSwapBuffers(){:
:
SwapBuffers(m_hDC);
}
/**设置窗口左上角的位置*/
voidSetPosX(intx);
voidSetPosX(unsignedshortx){SetPosX((signedshort)x);
}
voidSetPosY(inty);
voidSetPosY(unsignedshorty){SetPosY((signedshort)y);
/**返回窗口的大小*/
intGetWidth();
intGetHeight();
/**设置窗口的大小*/
voidSetWidth(intwidth);
voidSetHeight(intheight);
/**返回窗口左上角的位置*/
intGetPosX();
intGetPosY();
/**设置窗口的颜色位深*/
voidSetHiColor(){m_BitsPerPixel=16;
}
voidSetTrueColor(){m_BitsPerPixel=32;
/**重载运算符,可以让GL_Windowm_Window声明后的m_Window作为窗口句柄使用*/
operatorHWND(){returnm_hWnd;
private:
HWNDm_hWnd;
/**<
窗口句柄*/
HDCm_hDC;
/**<
设备描述表*/
HGLRCm_hRC;
OpenGL渲染描述表*/
intm_WindowPosX;
/**<
窗口的左上角的X位置*/
intm_WindowPosY;
窗口的左上角的Y位置*/
intm_WindowWidth;
/**<
窗口的宽度*/
intm_WindowHeight;
窗口的高度*/
intm_ScreenWidth;
全屏的宽度*/
intm_ScreenHeight;
全屏的高度*/
intm_BitsPerPixel;
颜色位深*/
boolm_IsFullScreen;
是否全屏*/
};
(2)键盘类Keys的设计
定义键盘类Keys对我们的按键信息进行记录,用于程序达到交互的目的。
/**定义键盘类*/
classKeys
Keys(){Clear();
/**清空所有的按键信息*/
voidClear(){ZeroMemory(&
m_KeyDown,sizeof(m_KeyDown));
/**判断某个键是否按下*/
boolIsPressed(unsignedintkey){return(key<
MAX_KEYS)
(m_KeyDown[key]==true):
false;
/**设置某个键被按下*/
voidSetPressed(unsignedintkey){if(key<
MAX_KEYS)m_KeyDown[key]=true;
/**设置某个键被释放*/
voidSetReleased(unsignedintkey){if(key<
MAX_KEYS)m_KeyDown[key]=false;
staticconstunsignedintMAX_KEYS=256;
boolm_KeyDown[MAX_KEYS];
/**<
保存256个按键的状态*/
(3)应用程序类GLApplication的设计
类GLApplication为我们的应用程序提供统一的接口,当我们实现不同的程序时不用再从头开始,只要实现其对应的接口方法即可。
/**基本的程序类,继承它用来创建OpenGL程序*/
classGLApplication
/**创建一个全局的Create函数,这个函数必须被继承类实现*/
staticGLApplication*Create(constchar*class_name);
/**<
创建你自己的子类*/
/**虚析构函数*/
virtual~GLApplication(){};
protected:
/**下面的函数必须被继承类实现,完成基本的OpenGL渲染过程*/
virtualboolInit()=0;
OpenGL的初始化*/
virtualvoidUninit()=0;
OpenGL的卸载*/
virtualvoidUpdate(DWORDmilliseconds)=0;
/**<
执行OpenGL程序的更新*/
virtualvoidDraw()=0;
绘制OpenGL场景*/
/**通用的函数*/
voidToggleFullscreen();
/**<
切换全屏/窗口模式*/
voidTerminateApplication();
结束程序*/
voidResizeDraw(boolenable){m_ResizeDraw=enable;
}/**<
设置在窗口改变大小的时候,可以绘制*/
Keysm_Keys;
按键类*/
GLApplication(constchar*class_name);
/**程序的主循环*/
friendintWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow);
intMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow);
/**消息处理回调函数*/
friendLRESULTCALLBACKWindowProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam);
LRESULTMessage(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam);
staticconstUINTWM_TOGGLEFULLSCREEN=(WM_USER+1);
自定义消息,在切换窗口模式的时候发送*/
GLWindowm_Window;
Window类*/
constchar*m_ClassName;
程序名*/
boolm_IsProgramLooping;
程序循环标记,如果为false,则退出程序*/
boolm_CreateFullScreen;
/**<
若为true,则创建全屏模式*/
boolm_IsVisible;
/**<
窗口是否可见*/
boolm_ResizeDraw;
是否在改变大小时,调用了绘制函数*/
DWORDm_LastTickCount;
上一次计时器的值*/
2、纹理贴图
(1)BMP位图文件的载入
BMP格式是windows采用的常见的图像文件存储格式。
定义位图类CBMPLoader,实现位图文件的载入。
/**位图载入类*/
classCBMPLoader
public:
CBMPLoader();
~CBMPLoader();
boolLoadBitmap(constchar*filename);
装载一个bmp文件*/
voidFreeImage();
释放图像数据*/
boolLoad(constchar*fileName);
载入位图并创建纹理*/
unsignedintID;
生成纹理的ID号*/
intimageWidth;
/**<
图像宽度*/
intimageHeight;
图像高度*/
unsignedchar*image;
指向图像数据的指针*/
(2)绘制场景并纹理贴图
绘制正方体和球体,并贴图。
/**绘制球体*/
voidSnowDemo:
DrawSphere()
glPushMatrix();
glTranslatef,,;
glRotatef(rot,,,;
/**指定纹理*/
glBindTexture(GL_TEXTURE_2D,;
GLUquadricObj*sphere=gluNewQuadric();
gluQuadricOrientation(sphere,GLU_OUTSIDE);
gluQuadricNormals(sphere,GLU_SMOOTH);
gluQuadricTexture(sphere,GL_TRUE);
gluSphere(sphere,,50,50);
gluDeleteQuadric(sphere);
glPopMatrix();
}
/**绘制立方体*/
DrawBox()
/**设置材质属性*/
GLfloatmat_ambient[]={,,,};
GLfloatmat_diffuse[]={,,,};
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
/**绘制六个面*/
D);
glBegin(GL_QUADS);
glNormal3f,,;
指定法线指向观察者*/
glTexCoord2f,;
glVertex3f,,;
glEnd();
指定法线背向观察者*/
指定法线向上*/
指定法线朝下*/
指定法线朝右*/
指定法线朝左*/
3、位图字体
(1)位图字体类
显示位图字体需要用到OpenGL显示列表和绘制位图字符的相关知识。
定义字体类GLFont.
/**定义字体类*/
classGLFont
/**构造函数和析构函数*/
GLFont();
~GLFont();
oad("
"
)||!
texture[1].Load("
texture[2].Load("
texture[3].Load("
texture[4].Load("
texture[5].Load("
))/**<
载入位图文件*/
{
MessageBox(NULL,"
装载位图文件失败!
"
错误"
MB_OK);
如果载入失败则弹出对话框*/
returnfalse;
if(!
("
))
/**启用纹理映射*/
glEnable(GL_TEXTURE_2D);
returntrue;
/**初始化OpenGL*/
boolSnowDemo:
Init()
/**用户自定义的初始化过程*/
glClearColor,,,;
glClearDepth;
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
ResizeDraw(true);
/**载入纹理*/
LoadTexture())
载入纹理失败!
/**初始化字体*/
if(!
())
MessageBox(NULL,"
初始化字体失败!
"
MB_OK);
/**初始化雪花实例*/
(400))
雪花系统初始化失败!
exit(-1);
/**用户自定义的卸载函数*/
Uninit()
/**程序更新函数*/
Update(DWORDmilliseconds)
if(VK_ESCAPE)==true)/**<
按ESC退出*/
TerminateApplication();
if(VK_SPACE)==true)/**<
按空格键开始旋转*/
rot+=milliseconds/;
cnt1+=milliseconds/;
更新计数器值*/
cnt2+=milliseconds/;
更新计数器值*/
gl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实时三维图形绘制 杭州 电子科技大学 实时 三维 图形 绘制 OpenGL 作业 实验 报告