版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为Word版,下载可任意编辑——旋转式正方体和正周围体
一、设计目的
设计一个程序使得运行后生成一个旋转的正方体和一个可旋转的正周边体,旋转过程中伴随着颜色的变化。
二、算法描述
运用多个glVertex3f函数赋予颜色,以及运用多个选择语句,实现消息转变。根据题目要求,分别选择正方体和正周边体,分别作左上右下旋转和水平逆时针(从上方看)旋转。正方体的六个面采用不同的颜色,正周边体的三个可见面则采用多色分布镶嵌。程序要运用多个函数有:
GLvoidReSizeGLScene(GLsizeiwidth,GLsizeiheight)(调整和初始化GL窗口);intInitGL(GLvoid)(初始化);
intDrawGLScene(GLvoid)(GL场景绘制);
GLvoidKillGLWindow(GLvoid)(选择正确方式选择窗口或关闭窗口);AdjustWindowRectEx(WindowRect,dwStyle,FALSE,dwExStyle);(调整窗口大小来创立适合的窗口);intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)(主函数)
三、程序代码
#includewindows.h#includegl\gl.h
#includegl\glu.h#includegl\glaux.h
HDC
//需要用到的各个头文件
hDC=NULL;
HGLRCHWND
hRC=NULL;hWnd=NULL;
HINSTANCEhInstance;boolkeys[256];boolactive=TRUE;
GLfloatrtri;GLfloatrquad;
boolfullscreen=TRUE;
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
//调整和初始化GL窗口
GLvoidReSizeGLScene(GLsizeiwidth,GLsizeiheight){
if(height==0){
height=1;
}
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}
intInitGL(GLvoid){}
//初始化
glShadeModel(GL_SMOOTH);glClearColor(0.0f,0.0f,0.0f,0.5f);glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);returnTRUE;
intDrawGLScene(GLvoid){
//GL场景绘制
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glLoadIdentity();glTranslatef(-1.5f,0.0f,-6.0f);glRotatef(rtri,0.0f,1.0f,0.0f);glBegin(GL_TRIANGLES);glColor3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glColor3f(0.0f,0.0f,1.0f);
glVertex3f(1.0f,-1.0f,1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,0.0f,1.0f);
glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);
glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,1.0f);glEnd();glLoadIdentity();glTranslatef(1.5f,0.0f,-7.0f);glRotatef(rquad,1.0f,1.0f,1.0f);glBegin(GL_QUADS);
glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,1.0f,-1.0f);glVertex3f(-1.0f,1.0f,-1.0f);glVertex3f(-1.0f,1.0f,1.0f);
glVertex3f(1.0f,1.0f,1.0f);glColor3f(1.0f,0.5f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);glVertex3f(-1.0f,-1.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(1.0f,1.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);glVertex3f(-1.0f,-1.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glColor3f(1.0f,1.0f,0.0f);
glVertex3f(1.0f,-1.0f,-1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glVertex3f(-1.0f,1.0f,-1.0f);glVertex3f(1.0f,1.0f,-1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);glVertex3f(-1.0f,1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,1.0f);glColor3f(1.0f,0.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);glVertex3f(1.0f,1.0f,1.0f);
glVertex3f(1.0f,-1.0f,1.0f);glVertex3f(1.0f,-1.0f,-1.0f);
glEnd();rtri+=0.2f;
rquad-=0.15f;returnTRUE;
}
GLvoidKillGLWindow(GLvoid){
//选择正确方式选择窗口或关闭窗口
if(fullscreen){ChangeDisplaySettings(NULL,0);}
ShowCursor(TRUE);
if(hRC){if(!wglMakeCurrent(NULL,NULL))
{
MessageBox(NULL,Release
Of
DC
And
RC
Failed.,SHUTDOWN
ERROR,MB_OK|MB_ICONINFORMATION);}
if(!wglDeleteContext(hRC)){
Context
Failed.,SHUTDOWN
MessageBox(NULL,ReleaseRenderingERROR,MB_OK|MB_ICONINFORMATION);
}
if(hDC!ReleaseDC(hWnd,hDC)){
MessageBox(NULL,Release
Device
}
hRC=NULL;
Context
Failed.,SHUTDOWN
ERROR,MB_OK|MB_ICONINFORMATION);hDC=NULL;}
if(hWnd!DestroyWindow(hWnd)){MessageBox(NULL,CouldNotReleasehWnd.,SHUTDOWNERROR,MB_OK|MB_ICONINFORMATION);
}
if(!UnregisterClass(OpenGL,hInstance)){
hWnd=NULL;
MessageBox(NULL,CouldNotUnregisterClass.,SHUTDOWNERROR,MB_OK|MB_ICONINFORMATION);}
BOOLCreateGLWindow(char*title,intwidth,intheight,intbits,boolfullscreenflag)//创立绘图窗口{
GLuint
PixelFormat;
WNDCLASSwc;}
hInstance=NULL;
DWORDdwExStyle;DWORDdwStyle;RECTWindowRect;WindowRect.left=(long)0;
WindowRect.right=(long)width;WindowRect.top=(long)0;WindowRect.bottom=(long)height;fullscreen=fullscreenflag;hInstance
=GetModuleHandle(NULL);
wc.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC;wc.lpfnWndProc=(WNDPROC)WndProc;wc.cbClsExtrawc.cbWndExtrawc.hInstancewc.hIconwc.hCursor
=0;=0;
=hInstance;
=LoadIcon(NULL,IDI_WINLOGO);=LoadCursor(NULL,IDC_ARROW);
=NULL;
wc.hbrBackground=NULL;wc.lpszMenuName
wc.lpszClassName=OpenGL;if(!RegisterClass(wc))
The
Window
MessageBox(NULL,FailedToRegisterClass.,ERROR,MB_OK|MB_ICONEXCLAMATION);returnFALSE;}
if(fullscreen){
DEVMODEdmScreenSettings;
memset(dmScreenSettings,0,sizeof(dmScreenSettings));dmScreenSettings.dmSize=sizeof(dmScreenSettings);dmScreenSettings.dmPelsWidth=width;dmScreenSettings.dmPelsHeight=height;dmScreenSettings.dmBitsPerPel=bits;
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
if
(ChangeDisplaySettings(dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{
if(MessageBox(NULL,TheRequestedFullscreenModeIsNotSupportedBy\nYourVideoCard.UseWindowedModeInstead?,NeHeGL,MB_YESNO|MB_ICONEXCLAMATION)==IDYES){
}
fullscreen=FALSE;
else{
Will
Now
MessageBox(NULL,Program
Close.,ERROR,MB_OK|MB_ICONSTOP);
if(fullscreen){
}
}
}
returnFALSE;
dwExStyle=WS_EX_APPWINDOW;dwStyle=WS_POPUP;
ShowCursor(FALSE);}else
dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE;dwStyle=WS_OVERLAPPEDWINDOW;
}AdjustWindowRectEx(WindowRect,dwStyle,FALSE,dwExStyle);//调整窗口大小来创立适合的窗口if(!(hWnd=CreateWindowEx(dwExStyle,OpenGL,
title,
dwStyle|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,
0,0,
WindowRect.right-WindowRect.left,WindowRect.bottom-WindowRect.top,NULL,NULL,hInstance,
NULL)))
{
KillGLWindow();MessageBox(NULL,Window
Error.,ERROR,MB_OK|MB_ICONEXCLAMATION);returnFALSE;}staticPIXELFORMATDESCRIPTORpfd=
{sizeof(PIXELFORMATDESCRIPTOR),1,PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,PFD_TYPE_RGBA,
bits,0,0,0,0,0,0,0,0,0,0,0,0,0,
16,
0,0,
PFD_MAIN_PLANE,
Creation
0,0,0,0};
if(!(hDC=GetDC(hWnd))){KillGLWindow();
MessageBox(NULL,Can't
Create
A
Context.,ERROR,MB_OK|MB_ICONEXCLAMATION);returnFALSE;}
if(!(PixelFormat=ChoosePixelFormat(hDC,pfd))){
KillGLWindow();
MessageBox(NULL,Can'tFindPixelFormat.,ERROR,MB_OK|MB_ICONEXCLAMATION);returnFALSE;
}
if(!SetPixelFormat(hDC,PixelFormat,pfd))
{
KillGLWindow();
MessageBox(NULL,Can'tSetPixelFormat.,ERROR,MB_OK|MB_ICONEXCLAMATION);returnFALSE;}if(!(hRC=wglCreateContext(hDC)))
{
KillGLWindow();MessageBox(NULL,Can'tCreateAContext.,ERROR,MB_OK|MB_ICONEXCLAMATION);returnFALSE;
}
if(!wglMakeCurrent(hDC,hRC))
{KillGLWindow();
MessageBox(NULL,Can'tActivate
The
Context.,ERROR,MB_OK|MB_ICONEXCLAMATION);
returnFALSE;
}
ShowWindow(hWnd,SW_SHOW);SetForegroundWindow(hWnd);
SetFocus(hWnd);
ReSizeGLScene(width,height);
if(!InitGL())
GL
Device
A
Suitable
The
GLRendering
GLRendering
{
KillGLWindow();MessageBox(NULL,Initialization
Failed.,ERROR,MB_OK|MB_ICONEXCLAMATION);returnFALSE;}
LRESULTCALLBACKWndProc({
HWNDhWnd,
}
returnTRUE;
UINTuMsg,WPARAMwParam,LPARAM
lParam)
switch(uMsg){caseWM_ACTIVATE:
{}
//监视窗口激活消息
if((LOWORD(wParam)!=WA_INACTIVE)!((BOOL)HIWORD(wParam)))
active=TRUE;
elseactive=FALSE;return0;
caseWM_SYSCOMMAND:{
switch(wParam){caseSC_SCREENSAVE:
caseSC_MONITORPOWER:return0;
}
break;
}
caseWM_CLOSE:{}
PostQuitMessage(0);return0;
caseWM_KEYDOWN:{
keys[wParam]=TRUE;return0;
}
}
caseWM_KEYUP:{keys[wParam]=FALSE;return0;}
caseWM_SIZE:{}
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));return0;
returnDefWindowProc(hWnd,uMsg,wParam,lParam);
intWINAPIWinMain(HINSTANCEhInstance,{
LPSTRint
HINSTANCEhPrevInstance,
lpCmdLine,nCmdShow)
MSGBOOLmsg;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年秋新冀少版生物七年级上册课件 第一章 藻类、植物和动物 2.1.1 藻类
- 2024年秋新华师大版七年级上册数学课件 第2章 整式及其加减 2.2代数式的值
- 巴士音乐节暨移动频道五周年庆活动招商方案1026
- 公园活动进场协议书模板
- 商铺漏水赔偿协议书模板
- 三丶旅游市场细分
- 杠杆类工具的研究
- 药理降血糖药
- TQGCML 4465-2024 鸡胚破壳锤规范
- 《 锥形件一次冲压成形极限条件研究》
- 专业技术人员年度考核情况登记表
- 课件:深刻认识和把握新质生产力推进我国经济高质量发展
- 糖尿病病理学课件
- 电动汽车驱动电机课件
- 小学语文常见的说明方法(四年级下册第二单元)
- 【川教版】《生命.生态.安全》五年级上册第9课《我健康吗》课件
- 食品生产手册
- 有毒有害物质生产、储存和废弃物处理
- 硬盘测试报告
- 三方比价方案
- 北京海淀十一学校2024届语文八年级第二学期期末统考模拟试题含解析
评论
0/150
提交评论