基于openGl的三维旋转魔方源代码.docx
《基于openGl的三维旋转魔方源代码.docx》由会员分享,可在线阅读,更多相关《基于openGl的三维旋转魔方源代码.docx(25页珍藏版)》请在冰豆网上搜索。
![基于openGl的三维旋转魔方源代码.docx](https://file1.bdocx.com/fileroot1/2023-1/23/d046b9b2-32d1-4926-9994-32ca374eafd8/d046b9b2-32d1-4926-9994-32ca374eafd81.gif)
基于openGl的三维旋转魔方源代码
/*******/基于openGl的三维旋转魔方源代码ThisCodeWasCreatedByJeffMolofee2000
AHUGEThanksToFredricEcholsForCleaningUp
AndOptimizingTheBaseCode,MakingItMoreFlexible!
IfYou'veFoundThisCodeUseful,PleaseLetMeKnow.
//HeaderFileForStandardInput/Output
#include"MoFang.h"
HDC
HGLRC
HWND
boolkeys[256];
boolactive=TRUE;
GLfloat
GLfloat
GLfloat
GLfloatRX;
GLfloatRY;
GLuint
GLbooleanb_RX,b_RY;
LRESULT
AUX_RGBImageRec*LoadBMP(char*Filename){if(!
Filename)//MakeSureAFilenameWasGivenFILE*File=NULL;//FileHandle
//LoadsABitmapImage
CALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);//DeclarationForWndProc
texture[24];//StorageForOneTexture(NEW)
xrot;
yrot;
zrot;//XRotation(NEW)
//YRotation(NEW)
//ZRotation(NEW)
//ArrayUsedForTheKeyboardRoutine
//WindowActiveFlagSetToTRUEByDefault
hDC=NULL;
hRC=NULL;
hWnd=NULL;//PrivateGDIDeviceContext
//PermanentRenderingContext
//HoldsOurWindowHandle
HINSTANCEhInstance;//HoldsTheInstanceOfTheApplication
boolfullscreen=TRUE;//FullscreenFlagSetToFullscreenModeByDefault
}{}File=fopen(Filename,"r");
if(File){}
returnNULL;//IfLoadFailedReturnNULLfclose(File);//CloseTheHandle
//LoadTheBitmapAndReturnAPointerreturnauxDIBImageLoad(Filename);//CheckToSeeIfTheFileExists
//DoesTheFileExist?
returnNULL;//IfNotReturnNULL
intLoadGLTextures(){if(TextureImage[0]){}
intStatus=FALSE;//LoadBitmapsAndConvertToTextures//StatusIndicator
//CreateStorageSpaceForTheTextureAUX_RGBImageRec*TextureImage[1];
memset(TextureImage,0,sizeof(void*)*1);//SetThePointerToNULL
//LoadTheBitmap,CheckForErrors,IfBitmap'sNotFoundQuit
if(TextureImage[0]=LoadBMP("Data/NeHe.bmp")){Status=TRUE;//SetTheStatusToTRUEglGenTextures(1,&texture[0]);//CreateTheTexture
//TypicalTextureGenerationUsingDataFromTheBitmap
glBindTexture(GL_TEXTURE_2D,texture[0]);
glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
GL_UNSIGNED_BYTE,TextureImage[0]->data);
//IfTextureExists
//IfTextureImageExists//FreeTheTextureImageMemoryif(TextureImage[0]->data){}free(TextureImage[0]->data);}intLoadGLTextures(char*file,intindex)
ConvertToTextures{}intStatus=FALSE;
AUX_RGBImageRec*TextureImage[1];
memset(TextureImage,0,sizeof(void*)*1);//SetThePointerToNULL
//LoadTheBitmap,CheckForErrors,IfBitmap'sNotFoundQuit
if(TextureImage[0]=LoadBMP(file)){}
if(TextureImage[0]){}
returnStatus;//ReturnTheStatus
if(TextureImage[0]->data){}
free(TextureImage[0]);//FreeTheImageStructurefree(TextureImage[0]->data);//FreeTheTextureImageMemory//IfTextureImageExists//IfTextureExists
Status=TRUE;
glGenTextures(1,&texture[index]);
//TypicalTextureGenerationUsingDataFromTheBitmap
glBindTexture(GL_TEXTURE_2D,texture[index]);
glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//CreateTheTexture
//SetTheStatusToTRUE//CreateStorageSpaceForTheTexture//StatusIndicator//LoadBitmapsAndreturnStatus;//ReturnTheStatus
}free(TextureImage[0]);//FreeTheImageStructureGL_UNSIGNED_BYTE,TextureImage[0]->data);
GLvoidReSizeGLScene(GLsizeiwidth,GLsizeiheight){}
intInitGL(GLvoid){if(!
LoadGLTextures("Data/y
3."bmp",2)){}
if(!
LoadGLTextures("Data/y
4."bmp",3)){}
if(!
LoadGLTextures("Data/y
5."bmp",4))returnFALSE;
returnFALSE;
if(!
LoadGLTextures("Data/y
2."bmp",1)){}returnFALSE;
if(!
LoadGLTextures("Data/y
1."bmp",0)){}returnFALSE;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//CalculateTheAspectRatioOfTheWindow
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0,0,width,height);
if(height==0){}height=1;//ResizeAndInitializeTheGLWindow
//PreventADivideByZeroBy//MakingHeightEqualOne//ResetTheCurrentViewport//SelectTheProjectionMatrix//ResetTheProjectionMatrixgluPerspective(
45."0f,(GLfloat)width/(GLfloat)height,
0."1f,
100."0f);
//SelectTheModelviewMatrix//ResetTheModelviewMatrix
//AllSetupForOpenGLGoesHere
//JumpToTextureLoadingRoutine(NEW)
//IfTextureDidn'tLoadReturnFALSE
//JumpToTextureLoadingRoutine(NEW)
//IfTextureDidn'tLoadReturnFALSE
//JumpToTextureLoadingRoutine(NEW)
//IfTextureDidn'tLoadReturnFALSE
//JumpToTextureLoadingRoutine(NEW)
//IfTextureDidn'tLoadReturnFALSE
//JumpToTextureLoadingRoutine(NEW)}voidDrawObject1(GLfloatX,GLfloatY,GLfloatZ){glBegin(GL_QUADS);
//FrontFace
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);
//BackFace
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);{}
if(!
LoadGLTextures("Data/y
6."bmp",5)){}
if(!
LoadGLTextures("Data/y
7."bmp",6)){}
if(!
LoadGLTextures("Data/y
8."bmp",7)){}
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearDepth(
1."0f);//EnableTextureMapping(NEW)
//EnableSmoothShading//DepthBufferSetup
//TheTypeOfDepthTestingToDo//InitializationWentOKreturnFALSE;//IfTextureDidn'tLoadReturnFALSE//JumpToTextureLoadingreturnFALSE;//IfTextureDidn'tLoadReturnFALSE//JumpToTextureLoadingreturnFALSE;//IfTextureDidn'tLoadReturnFALSE//JumpToTextureLoadingreturnFALSE;//IfTextureDidn'tLoadReturnFALSERoutine(NEW)
Routine(NEW)
Routine(NEW)
glClearColor(
0."0f,
0."0f,
0."0f,
0."5f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
returnTRUE;//BlackBackground
//EnablesDepthTesting
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//ReallyNicePerspectiveCalculations}//TopFace
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);
//BottomFace
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);
//Rightface
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);
//LeftFace
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();
voidDrawObject(intID){glBegin(GL_QUADS);
//FrontFace
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);
//BackFace
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);
//TopFace
glTexCoord2f(
0."0f,
1."0f);glVertex3fv(CubePoint[5].p);
glTexCoord2f(
0."0f,
0."0f);glVertex3fv(CubePoint[3].p);
stPoint*CubePoint=Cube[ID].CubePoint;
glTexCoord2f(
1."0f,
0."0f);glVertex3fv(CubePoint[2].p);
glTexCoord2f(
1."0f,
1."0f);glVertex3fv(CubePoint[6].p);
//BottomFace
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);
//Rightface
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);
//LeftFace
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();}intDrawGLScene(GLvoid)
Drawing{glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
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