旋转式正方体和正四面体.doc_第1页
旋转式正方体和正四面体.doc_第2页
旋转式正方体和正四面体.doc_第3页
旋转式正方体和正四面体.doc_第4页
旋转式正方体和正四面体.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

一、设计目的设计一个程序使得运行后生成一个旋转的正方体和一个可旋转的正四面体,旋转过程中伴随着颜色的变化。二、算法描述运用多个glVertex3f函数赋予颜色,以及运用多个选择语句,实现消息转变。根据题目要求,分别选择正方体和正四面体,分别作左上右下旋转和水平逆时针(从上方看)旋转。正方体的六个面采用不同的颜色,正四面体的三个可见面则采用多色分布镶嵌。程序要运用多个函数有:GLvoid ReSizeGLScene(GLsizei width, GLsizei height)(调整和初始化GL窗口);int InitGL(GLvoid)(初始化);int DrawGLScene(GLvoid)(GL场景绘制);GLvoid KillGLWindow(GLvoid)(选择正确方式选择窗口或关闭窗口);AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);(调整窗口大小来创建合适的窗口);int WINAPI WinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance,LPSTRlpCmdLine, intnCmdShow)(主函数)三、程序代码#include /需要用到的各个头文件#include #include #include HDChDC=NULL;HGLRChRC=NULL;HWNDhWnd=NULL;HINSTANCEhInstance;boolkeys256;boolactive=TRUE;boolfullscreen=TRUE;GLfloatrtri;GLfloatrquad;LRESULTCALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);GLvoid ReSizeGLScene(GLsizei width, GLsizei height)/调整和初始化GL窗口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();int InitGL(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);return TRUE;int DrawGLScene(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);glVertex3f( 1.0f,-1.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);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;return TRUE;GLvoid KillGLWindow(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)MessageBox(NULL,Release Rendering Context Failed.,SHUTDOWN ERROR,MB_OK | MB_ICONINFORMATION);hRC=NULL;if (hDC & !ReleaseDC(hWnd,hDC)MessageBox(NULL,Release Device Context Failed.,SHUTDOWN ERROR,MB_OK | MB_ICONINFORMATION);hDC=NULL;if (hWnd & !DestroyWindow(hWnd)MessageBox(NULL,Could Not Release hWnd.,SHUTDOWN ERROR,MB_OK | MB_ICONINFORMATION);hWnd=NULL;if (!UnregisterClass(OpenGL,hInstance)MessageBox(NULL,Could Not Unregister Class.,SHUTDOWN ERROR,MB_OK | MB_ICONINFORMATION);hInstance=NULL;BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)/创建绘图窗口GLuintPixelFormat;WNDCLASSwc;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.cbClsExtra= 0;wc.cbWndExtra= 0;wc.hInstance= hInstance;wc.hIcon= LoadIcon(NULL, IDI_WINLOGO);wc.hCursor= LoadCursor(NULL, IDC_ARROW);wc.hbrBackground= NULL;wc.lpszMenuName= NULL;wc.lpszClassName= OpenGL;if (!RegisterClass(&wc)MessageBox(NULL,Failed To Register The Window Class.,ERROR,MB_OK|MB_ICONEXCLAMATION);return FALSE;if (fullscreen)DEVMODE dmScreenSettings;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,The Requested Fullscreen Mode Is Not Supported BynYour Video Card. Use Windowed Mode Instead?,NeHe GL,MB_YESNO|MB_ICONEXCLAMATION)=IDYES)fullscreen=FALSE;elseMessageBox(NULL,Program Will Now Close.,ERROR,MB_OK|MB_ICONSTOP);return FALSE;if (fullscreen)dwExStyle=WS_EX_APPWINDOW;dwStyle=WS_POPUP;ShowCursor(FALSE);elsedwExStyle=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 Creation Error.,ERROR,MB_OK|MB_ICONEXCLAMATION);return FALSE;staticPIXELFORMATDESCRIPTOR pfd=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,0,0, 0, 0;if (!(hDC=GetDC(hWnd)KillGLWindow();MessageBox(NULL,Cant Create A GL Device Context.,ERROR,MB_OK|MB_ICONEXCLAMATION);return FALSE;if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)KillGLWindow();MessageBox(NULL,Cant Find A Suitable PixelFormat.,ERROR,MB_OK|MB_ICONEXCLAMATION);return FALSE;if(!SetPixelFormat(hDC,PixelFormat,&pfd)KillGLWindow();MessageBox(NULL,Cant Set The PixelFormat.,ERROR,MB_OK|MB_ICONEXCLAMATION);return FALSE;if (!(hRC=wglCreateContext(hDC)KillGLWindow();MessageBox(NULL,Cant Create A GL Rendering Context.,ERROR,MB_OK|MB_ICONEXCLAMATION);return FALSE;if(!wglMakeCurrent(hDC,hRC)KillGLWindow();MessageBox(NULL,Cant Activate The GL Rendering Context.,ERROR,MB_OK|MB_ICONEXCLAMATION);return FALSE;ShowWindow(hWnd,SW_SHOW);SetForegroundWindow(hWnd);SetFocus(hWnd);ReSizeGLScene(width, height);if (!InitGL()KillGLWindow();MessageBox(NULL,Initialization Failed.,ERROR,MB_OK|MB_ICONEXCLAMATION);return FALSE;return TRUE;LRESULT CALLBACK WndProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)switch (uMsg)case WM_ACTIVATE:/监视窗口激活消息if (LOWORD(wParam) != WA_INACTIVE) & !(BOOL)HIWORD(wParam)active=TRUE;elseactive=FALSE;return 0;case WM_SYSCOMMAND:switch (wParam)case SC_SCREENSAVE:case SC_MONITORPOWER:return 0;break;case WM_CLOSE:PostQuitMessage(0);return 0;case WM_KEYDOWN:keyswParam = TRUE;return 0;case WM_KEYUP:keyswParam = FALSE;return 0;case WM_SIZE:ReSizeGLScene(LOWORD(lParam),HIWORD(lParam); return 0;return DefWindowProc(hWnd,uMsg,wParam,lParam);int WINAPI WinMain(HINSTANCEhIns

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论