首页 基于openGl的三维旋转魔方源代码

基于openGl的三维旋转魔方源代码

举报
开通vip

基于openGl的三维旋转魔方源代码基于openGl的三维旋转魔方源代码 基于openGl的三旋魔方源代维维维维维维维维 /* *This Code Was Created By Jeff Molofee 2000 *A HUGE Thanks To Fredric Echols For Cleaning Up *And Optimizing The Base Code, Making It More Flexible! *If You've Found This Code Useful, Please Let Me Know. *Visit My...

基于openGl的三维旋转魔方源代码
基于openGl的三维旋转魔方源代码 基于openGl的三旋魔方源代维维维维维维维维 /* *This Code Was Created By Jeff Molofee 2000 *A HUGE Thanks To Fredric Echols For Cleaning Up *And Optimizing The Base Code, Making It More Flexible! *If You've Found This Code Useful, Please Let Me Know. *Visit My Site At nehe.gamedev.net */ // Header File For Standard Input/Output #include "MoFang.h" HDChDC=NULL;// Private GDI Device Context HGLRChRC=NULL;// Permanent Rendering ContextHWNDhWnd=NULL;// Holds Our Window Handle HINSTANCEhInstance;// Holds The Instance Of The Applicationboolkeys[256];// Array Used For The Keyboard Routineboolactive=TRUE;// Window Active Flag Set To TRUE By Defaultboolfullscreen=TRUE;// Fullscreen Flag Set To Fullscreen Mode By Default GLfloatxrot;// X Rotation ( NEW ) GLfloatyrot;// Y Rotation ( NEW ) GLfloatzrot;// Z Rotation ( NEW ) GLfloat RX; GLfloat RY; GLuinttexture[24];// Storage For One Texture ( NEW )GLboolean b_RX,b_RY; LRESULTCALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);// Declaration For WndProc AUX_RGBImageRec *LoadBMP(char *Filename)// Loads A Bitmap Image{ FILE *File=NULL; // File Handle if (!Filename) // Make Sure A Filename Was Given { return NULL; // If Not Return NULL } File=fopen(Filename,"r");// Check To See If The File Exists if (File) // Does The File Exist? { fclose(File); // Close The Handle return auxDIBImageLoad(Filename);// Load The Bitmap And Return A Pointer } return NULL; // If Load Failed Return NULL } int LoadGLTextures()// Load Bitmaps And Convert To Textures { int Status=FALSE;// Status Indicator AUX_RGBImageRec *TextureImage[1];// Create Storage Space For The Texture memset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULL // Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit if (TextureImage[0]=LoadBMP("Data/NeHe.bmp")) { Status=TRUE; // Set The Status To TRUE glGenTextures(1, &texture[0]);// Create The Texture // Typical Texture Generation Using Data From The Bitmap glBindTexture(GL_TEXTURE_2D, texture[0]); glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); } if (TextureImage[0]) // If Texture Exists { if (TextureImage[0]->data)// If Texture Image Exists { free(TextureImage[0]->data);// Free The Texture Image Memory } free(TextureImage[0]); // Free The Image Structure } return Status; // Return The Status } int LoadGLTextures(char *file,int index) // Load Bitmaps And Convert To Textures{ int Status=FALSE;// Status Indicator AUX_RGBImageRec *TextureImage[1];// Create Storage Space For The Texture memset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULL // Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit if (TextureImage[0]=LoadBMP(file)) { Status=TRUE; // Set The Status To TRUE glGenTextures(1, &texture[index]);// Create The Texture // Typical Texture Generation Using Data From The Bitmap glBindTexture(GL_TEXTURE_2D, texture[index]); glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); } if (TextureImage[0]) // If Texture Exists { if (TextureImage[0]->data)// If Texture Image Exists { free(TextureImage[0]->data);// Free The Texture Image Memory } free(TextureImage[0]); // Free The Image Structure } return Status; // Return The Status } GLvoid ReSizeGLScene(GLsizei width, GLsizei height)// Resize And Initialize The GL Window { if (height==0) // Prevent A Divide By Zero By { height=1; // Making Height Equal One } glViewport(0,0,width,height);// Reset The Current Viewport glMatrixMode(GL_PROJECTION);// Select The Projection Matrix glLoadIdentity();// Reset The Projection Matrix // Calculate The Aspect Ratio Of The Window gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW);// Select The Modelview Matrix glLoadIdentity();// Reset The Modelview Matrix } int InitGL(GLvoid)// All Setup For OpenGL Goes Here { if (!LoadGLTextures("Data/y1.bmp",0)) // Jump To Texture Loading Routine ( NEW ) { return FALSE; // If Texture Didn't Load Return FALSE } if (!LoadGLTextures("Data/y2.bmp",1)) // Jump To Texture Loading Routine ( NEW ) { return FALSE; // If Texture Didn't Load Return FALSE} if (!LoadGLTextures("Data/y3.bmp",2)) // Jump To Texture Loading Routine ( NEW ){ return FALSE; // If Texture Didn't Load Return FALSE} if (!LoadGLTextures("Data/y4.bmp",3)) // Jump To Texture Loading Routine ( NEW ){ return FALSE; // If Texture Didn't Load Return FALSE} if (!LoadGLTextures("Data/y5.bmp",4)) // Jump To Texture Loading Routine ( NEW ){ return FALSE; // If Texture Didn't Load Return FALSE} if (!LoadGLTextures("Data/y6.bmp",5)) // Jump To Texture Loading Routine ( NEW ){ return FALSE; // If Texture Didn't Load Return FALSE} if (!LoadGLTextures("Data/y7.bmp",6)) // Jump To Texture Loading Routine ( NEW ){ return FALSE; // If Texture Didn't Load Return FALSE} if (!LoadGLTextures("Data/y8.bmp",7)) // Jump To Texture Loading Routine ( NEW ){ return FALSE; // If Texture Didn't Load Return FALSE} glEnable(GL_TEXTURE_2D);// Enable Texture Mapping ( NEW ) glShadeModel(GL_SMOOTH);// Enable Smooth Shading glClearColor(0.0f, 0.0f, 0.0f, 0.5f);// Black Background glClearDepth(1.0f); // Depth Buffer Setup glEnable(GL_DEPTH_TEST);// Enables Depth Testing glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);// Really Nice Perspective Calculations return TRUE; // Initialization Went OK } void DrawObject1(GLfloat X,GLfloat Y,GLfloat Z) { glBegin(GL_QUADS); // Front Face glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, 1.0f + Z); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, 1.0f + Z); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, 1.0f + Z); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, 1.0f + Z); // Back Face glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, -1.0f + Z);glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, -1.0f + Z);// Top Face glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f + X, 1.0f + Y, 1.0f + Z);glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f + X, 1.0f + Y, 1.0f + Z);glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, -1.0f + Z);// Bottom Face glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f + X, -1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f + X, -1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, 1.0f + Z);glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, 1.0f + Z);// Right face glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, -1.0f + Z);glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, 1.0f + Z);glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, 1.0f + Z);// Left Face glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, -1.0f + Z);glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, 1.0f + Z);glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, 1.0f + Z);glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, -1.0f + Z);glEnd(); } void DrawObject(int ID) { stPoint *CubePoint = Cube[ID].CubePoint; glBegin(GL_QUADS); // Front Face glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[0].p); glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[1].p); glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[2].p); glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[3].p); // Back Face glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[4].p); glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[5].p); glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[6].p); glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[7].p); // Top Face glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[5].p); glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[3].p); glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[2].p); glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[6].p); // Bottom Face glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[4].p); glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[7].p); glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[1].p); glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[0].p); // Right face glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[7].p); glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[6].p); glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[2].p); glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[1].p); // Left Face glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[4].p); glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[0].p); glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[3].p); glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[5].p); glEnd(); } int DrawGLScene(GLvoid)// Here's Where We Do All The Drawing { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Clear The Screen And The Depth Buffer glLoadIdentity();// Reset The View glTranslatef(0.0f,0.0f,-12.0f); glTranslatef(RX,0.0f,0.0f); glTranslatef(0.0,RY,0.0); glRotatef(xrot,1.0f,0.0f,0.0f); glRotatef(yrot,0.0f,1.0f,0.0f); glRotatef(zrot,0.0f,0.0f,1.0f); // glBindTexture(GL_TEXTURE_2D, texture[0]); DrawObject(0); glBindTexture(GL_TEXTURE_2D, texture[1]); DrawObject(1); glBindTexture(GL_TEXTURE_2D, texture[2]); DrawObject(2); glBindTexture(GL_TEXTURE_2D, texture[3]); DrawObject(3); glBindTexture(GL_TEXTURE_2D, texture[4]); DrawObject(4); glBindTexture(GL_TEXTURE_2D, texture[5]); DrawObject(5); glBindTexture(GL_TEXTURE_2D, texture[6]); DrawObject(6); glBindTexture(GL_TEXTURE_2D, texture[7]); DrawObject(7);/**/ xrot+=0.15f; yrot+=0.1f; zrot+=0.2f; return TRUE; // Keep Going } GLvoid KillGLWindow(GLvoid)// Properly Kill The Window { if (fullscreen) // Are We In Fullscreen Mode? { ChangeDisplaySettings(NULL,0);// If So Switch Back To The Desktop ShowCursor(TRUE); // Show Mouse Pointer } if (hRC) // Do We Have A Rendering Context? { if (!wglMakeCurrent(NULL,NULL))// Are We Able To Release The DC And RC Contexts? { MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); } if (!wglDeleteContext(hRC))// Are We Able To Delete The RC? { MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); } hRC=NULL; // Set RC To NULL } if (hDC && !ReleaseDC(hWnd,hDC))// Are We Able To Release The DC { MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); hDC=NULL; // Set DC To NULL } if (hWnd && !DestroyWindow(hWnd))// Are We Able To Destroy The Window? { MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); hWnd=NULL; // Set hWnd To NULL } if (!UnregisterClass("OpenGL",hInstance))// Are We Able To Unregister Class { MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); hInstance=NULL; // Set hInstance To NULL } } /*This Code Creates Our OpenGL Window. Parameters Are: * *title- Title To Appear At The Top Of The Window * *width- Width Of The GL Window Or Fullscreen Mode * *height- Height Of The GL Window Or Fullscreen Mode * *bits- Number Of Bits To Use For Color (8/16/24/32)* *fullscreenflag- Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE)*/ BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag) { GLuintPixelFormat;// Holds The Results After Searching For A Match WNDCLASSwc;// Windows Class Structure DWORDdwExStyle;// Window Extended Style DWORDdwStyle;// Window Style RECTWindowRect;// Grabs Rectangle Upper Left / Lower Right Values WindowRect.left=(long)0;// Set Left Value To 0 WindowRect.right=(long)width;// Set Right Value To Requested Width WindowRect.top=(long)0;// Set Top Value To 0 WindowRect.bottom=(long)height;// Set Bottom Value To Requested Height fullscreen=fullscreenflag;// Set The Global Fullscreen Flag hInstance= GetModuleHandle(NULL);// Grab An Instance For Our Window wc.style= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;// Redraw On Size, And Own DC For Window. wc.lpfnWndProc= (WNDPROC) WndProc;// WndProc Handles Messages wc.cbClsExtra= 0; // No Extra Window Data wc.cbWndExtra= 0; // No Extra Window Data wc.hInstance= hInstance; // Set The Instance wc.hIcon= LoadIcon(NULL, IDI_WINLOGO);// Load The Default Icon wc.hCursor= LoadCursor(NULL, IDC_ARROW);// Load The Arrow Pointer wc.hbrBackground= NULL; // No Background Required For GL wc.lpszMenuName= NULL; // We Don't Want A Menu wc.lpszClassName= "OpenGL"; // Set The Class Name if (!RegisterClass(&wc)) // Attempt To Register The Window Class { MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK| MB_ICONEXCLAMATION); return FALSE; // Return FALSE } if (fullscreen) // Attempt Fullscreen Mode? { DEVMODE dmScreenSettings; // Device Mode memset(&dmScreenSettings,0,sizeof(dmScreenSettings));// Makes Sure Memory's Cleared dmScreenSettings.dmSize=sizeof(dmScreenSettings);// Size Of The Devmode Structure dmScreenSettings.dmPelsWidth= width;// Selected Screen Width dmScreenSettings.dmPelsHeight= height;// Selected Screen Height dmScreenSettings.dmBitsPerPel= bits;// Selected Bits Per Pixel dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; // Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar. if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL) { // If The Mode Fails, Offer Two Options. Quit Or Use Windowed Mode. if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES) { fullscreen=FALSE;// Windowed Mode Selected. Fullscreen = FALSE } else { // Pop Up A Message Box Letting User Know The Program Is Closing. MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK| MB_ICONSTOP); return FALSE; // Return FALSE } } } if (fullscreen) // Are We Still In Fullscreen Mode?{ dwExStyle=WS_EX_APPWINDOW; // Window Extended Style dwStyle=WS_POPUP; // Windows Style ShowCursor(FALSE); // Hide Mouse Pointer } else { dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;// Window Extended Style dwStyle=WS_OVERLAPPEDWINDOW; // Windows Style } AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);// Adjust Window To True Requested Size // Create The Window if (!(hWnd=CreateWindowEx(dwExStyle, // Extended Style For The Window "OpenGL", // Class Name title, // Window Title dwStyle | // Defined Window Style WS_CLIPSIBLINGS | // Required Window Style WS_CLIPCHILDREN, // Required Window Style 0, 0, // Window Position WindowRect.right- WindowRect.left,// Calculate Window Width WindowRect.bottom- WindowRect.top,// Calculate Window Height NULL, // No Parent Window NULL, // No Menu hInstance, // Instance NULL))) // Dont Pass Anything To WM_CREATE{ KillGLWindow();// Reset The Display MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK| MB_ICONEXCLAMATION); return FALSE;// Return FALSE } staticPIXELFORMATDESCRIPTOR pfd=// pfd Tells Windows How We Want Things To Be { sizeof(PIXELFORMATDESCRIPTOR),// Size Of This Pixel Format Descriptor 1, // Version Number PFD_DRAW_TO_WINDOW |// Format Must Support Window PFD_SUPPORT_OPENGL |// Format Must Support OpenGL PFD_DOUBLEBUFFER,// Must Support Double Buffering PFD_TYPE_RGBA, // Request An RGBA Format bits, // Select Our Color Depth 0, 0, 0, 0, 0, 0,// Color Bits Ignored 0, // No Alpha Buffer 0, // Shift Bit Ignored 0, // No Accumulation Buffer 0, 0, 0, 0,// Accumulation Bits Ignored 16, // 16Bit Z-Buffer (Depth Buffer) 0, // No Stencil Buffer 0, // No Auxiliary Buffer PFD_MAIN_PLANE, // Main Drawing Layer 0, // Reserved 0, 0, 0 // Layer Masks Ignored }; if (!(hDC=GetDC(hWnd)))// Did We Get A Device Context? { KillGLWindow();// Reset The Display MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK| MB_ICONEXCLAMATION); return FALSE;// Return FALSE } if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))// Did Windows Find A Matching Pixel Format? { KillGLWindow();// Reset The Display MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK| MB_ICONEXCLAMATION); return FALSE;// Return FALSE } if(!SetPixelFormat(hDC,PixelFormat,&pfd))// Are We Able To Set The Pixel Format? { KillGLWindow();// Reset The Display MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK| MB_ICONEXCLAMATION); return FALSE;// Return FALSE } if (!(hRC=wglCreateContext(hDC)))// Are We Able To Get A Rendering Context? { KillGLWindow();// Reset The Display MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK| MB_ICONEXCLAMATION); return FALSE;// Return FALSE } if(!wglMakeCurrent(hDC,hRC))// Try To Activate The Rendering Context { KillGLWindow();// Reset The Display MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK| MB_ICONEXCLAMATION); return FALSE;// Return FALSE } ShowWindow(hWnd,SW_SHOW);// Show The Window SetForegroundWindow(hWnd);// Slightly Higher Priority SetFocus(hWnd);// Sets Keyboard Focus To The Window ReSizeGLScene(width, height);// Set Up Our Perspective GL Screen reset_model(); if (!InitGL())// Initialize Our Newly Created GL Window { KillGLWindow();// Reset The Display MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE;// Return FALSE } return TRUE;// Success } static int iii=0; LRESULT CALLBACK WndProc(HWNDhWnd,// Handle For This Window UINTuMsg,// Message For This Window WPARAMwParam, // Additional Message Information LPARAMlParam) // Additional Message Information{ switch (uMsg)// Check For Windows Messages { case WM_ACTIVATE:// Watch For Window Activate Message { if (!HIWORD(wParam))// Check Minimization State { active=TRUE;// Program Is Active } else { active=FALSE;// Program Is No Longer Active } return 0;// Return To The Message Loop } case WM_SYSCOMMAND:// Intercept System Commands { switch (wParam)// Check System Calls { case SC_SCREENSAVE:// Screensaver Trying To Start? case SC_MONITORPOWER:// Monitor Trying To Enter Powersave? return 0;// Prevent From Happening } break; // Exit } case WM_CLOSE:// Did We Receive A Close Message? { PostQuitMessage(0);// Send A Quit Message return 0;// Jump Back } case WM_KEYDOWN:// Is A Key Being Held Down? { keys[wParam] = TRUE;// If So, Mark It As TRUE return 0;// Jump Back } case WM_KEYUP: // Has A Key Been Released? { keys[wParam] = FALSE;// If So, Mark It As FALSE return 0;// Jump Back } case WM_SIZE:// Resize The OpenGL Window { ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // LoWord=Width, HiWord=Height return 0;// Jump Back } case WM_TIMER: { if(rotAngle != 0) { if(rotZ) Rotate_ZM(); if(rotY) Rotate_YM(); if(rotX) Rotate_XM(); } } } // Pass All Unhandled Messages To DefWindowProc return DefWindowProc(hWnd,uMsg,wParam,lParam); } VOID CALLBACK TimerProc( HWND hwnd, // handle of window for timer messages UINT uMsg, // WM_TIMER message UINT idEvent, // timer identifier DWORD dwTime // current system time ) { if( idEvent==2) { srand(dwTime); int r = rand(); if( r%6==0) enable_X_roatate(1); else if( r%6==1) enable_Y_roatate(1); else if( r%6==2) enable_Z_roatate(1); else if( r%6==3) enable_X_roatate(-1); else if( r%6==4) enable_Y_roatate(-1); else if( r%6==5) enable_Z_roatate(-1); } } VOID CALLBACK CubeWalk( HWND hwnd, // handle of window for timer messages UINT uMsg, // WM_TIMER message UINT idEvent, // timer identifier DWORD dwTime // current system time ) { if( idEvent==3) { /* int i = RX*100; if( i==560) Vx = -0.02; else if( i==-560) Vx = 0.02; RX += Vx;*/ } } int WINAPI WinMain(HINSTANCEhInstance,// Instance HINSTANCEhPrevInstance,// Previous Instance LPSTRlpCmdLine,// Command Line Parameters intnCmdShow) // Window Show State { MSGmsg; // Windows Message Structure BOOLdone=FALSE;// Bool Variable To Exit Loop // Ask The User Which Screen Mode They Prefer if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO| MB_ICONQUESTION)==IDNO) { fullscreen=FALSE;// Windowed Mode } // Create Our OpenGL Window if (!CreateGLWindow("3D MagicCube-杨文涛",1280,768,16,fullscreen)) { return 0;// Quit If Window Was Not Created } ::SetTimer(hWnd,1,10,NULL); ::SetTimer(hWnd,2,1500,TimerProc); ::SetTimer(hWnd,3,10,CubeWalk); while(!done)// Loop That Runs While done=FALSE { if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))// Is There A Message Waiting? { if (msg.message==WM_QUIT)// Have We Received A Quit Message? { done=TRUE; // If So done=TRUE } else // If Not, Deal With Window Messages { TranslateMessage(&msg);// Translate The Message DispatchMessage(&msg);// Dispatch The Message } } else // If There Are No Messages { // Draw The Scene. Watch For ESC Key And Quit Messages From DrawGLScene() if ((active && !DrawGLScene()) || keys[VK_ESCAPE])// Active? Was There A Quit Received? { done=TRUE; // ESC or DrawGLScene Signalled A Quit } else // Not Time To Quit, Update Screen { SwapBuffers(hDC);// Swap Buffers (Double Buffering) } if (keys[VK_F1])// Is F1 Being Pressed? { keys[VK_F1]=FALSE;// If So Make Key FALSE KillGLWindow();// Kill Our Current Window fullscreen=!fullscreen;// Toggle Fullscreen / Windowed Mode // Recreate Our OpenGL Window if (!CreateGLWindow("NeHe's Texture Mapping Tutorial",640,480,16,fullscreen)) { return 0;// Quit If Window Was Not Created } } if(keys[VK_LEFT]) { keys[VK_LEFT]=FALSE; RX -= 0.05f; b_RY = true; } if(keys[VK_RIGHT]) { keys[VK_RIGHT]=FALSE; RX += 0.05f; b_RY = true; } if(keys[VK_UP]) { keys[VK_UP]=FALSE; RY += 0.05f; b_RX = true; } if(keys[VK_DOWN]) { keys[VK_DOWN]=FALSE; RY -= 0.05f; b_RX = true; } if(keys[VK_F2]) { keys[VK_F2] = FALSE; enable_X_roatate(1); } if(keys[VK_F3]) { keys[VK_F3] = FALSE; enable_Y_roatate(1); } if(keys[VK_F4]) //control Z direction { keys[VK_F4] = FALSE; enable_Z_roatate(1); } } } // Shutdown KillGLWindow();// Kill The Window return (msg.wParam);// Exit The Program }
本文档为【基于openGl的三维旋转魔方源代码】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_792768
暂无简介~
格式:doc
大小:78KB
软件:Word
页数:37
分类:生活休闲
上传时间:2017-09-21
浏览量:95