旋转式正方体和正周围体_第1页
旋转式正方体和正周围体_第2页
旋转式正方体和正周围体_第3页
旋转式正方体和正周围体_第4页
旋转式正方体和正周围体_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论