OpenGL绘图 简单3D空间D漫游的实现.docx
《OpenGL绘图 简单3D空间D漫游的实现.docx》由会员分享,可在线阅读,更多相关《OpenGL绘图 简单3D空间D漫游的实现.docx(27页珍藏版)》请在三一办公上搜索。
1、OpenGL绘图 简单3D空间D漫游的实现主要参考了NEHE的Opengl教程 所有物体都是直接用代码画的,没有经过建模。 主要部分有详细注释。 适合刚接触图形学或OpenGL的新手。老鸟勿来。 部分效果图: 全部代码,VC6.0环境: /* 主要实现简单的3D空间搭建,添加物体旋转效果,光照,纹理映射,3D漫游,雾化效果 */ #include / Header File For Windows #include / Math Library Header File #include / Header File For Standard Input/Output #include / Hea
2、der File For The OpenGL32 Library #include / Header File For The GLu32 Library #include / Header File For TheGlaux Library HDC hDC=NULL; / Private GDI Device Context HGLRC hRC=NULL; / Permanent Rendering Context HWND hWnd=NULL; / Holds Our Window Handle HINSTANCE hInstance; / Holds The Instance Of T
3、he Application bool keys256; bool active=TRUE; bool fullscreen=TRUE; bool blend; bool bp; bool fp; bool gp; bool light; boollp; / Array Used For The Keyboard Routine / Window Active Flag Set To TRUE By Default / Fullscreen Flag Set To Fullscreen Mode By Default / Blending ON/OFF / B Pressed? / F Pre
4、ssed? / G Pressed? GLuint fogMode= GL_EXP, GL_EXP2, GL_LINEAR ; / 雾气的三种模式 GLuint fogfilter = 0; / Which Fog Mode To Use GLfloat fogColor4 = 0.5f,0.5f,0.5f,1.0f; / Fog Color GLfloatwalkbias = 0; GLfloatwalkbiasangle = 0; GLfloatlookupdown = 0.0f; float x; float z; GLfloateye=0.0f,0.0f,0.0f; GLfloatlo
5、okat=0.0f,0.0f,0.0f; GLfloat angle=-90.0; GLfloat speed=0.5; float PI=3.14159f; GLuint filter; / Which Filter To Use GLuint texture7; / 储存7个纹理 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); / Declaration For WndProc AUX_RGBImageRec *LoadBMP(char *Filename) / 加载一个位图 FILE *File=NULL; / File Han
6、dle 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 returnauxDIBImageLoad(Filename); / Load The Bitmap And Return A Pointer return NULL; / If
7、Load Failed Return NULL intLoadGLTextures / 加载位图并将其转化为纹理 int Status=FALSE; / Status Indicator AUX_RGBImageRec *TextureImage1; / Create Storage Space For The Texture memset(TextureImage,0,sizeof(void *)*1); / Set The Pointer To NULL if (TextureImage0=LoadBMP(Data/zhou.bmp) /指定风扇轴的纹理 Status=TRUE; / Se
8、t The Status To TRUE glGenTextures(1, &texture0); glBindTexture(GL_TEXTURE_2D,texture0); glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage0-sizeX,TextureImage0-sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage0-data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D
9、,GL_TEXTURE_MAG_FILTER,GL_LINEAR); if(TextureImage0=LoadBMP(Data/yepian.bmp) /指定风扇叶的纹理 Status=TRUE; glGenTextures(1,&texture1); glBindTexture(GL_TEXTURE_2D,texture1); glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage0-sizeX,TextureImage0-sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage0-data); glTexParameteri
10、(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); if(TextureImage0=LoadBMP(Data/qiang.bmp) /指定左右墙壁的纹理 Status=TRUE; glGenTextures(1,&texture2); glBindTexture(GL_TEXTURE_2D,texture2); glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage0-sizeX,Text
11、ureImage0-sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage0-data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); if(TextureImage0=LoadBMP(Data/diban.bmp) /指定地板的纹理 Status=TRUE; glGenTextures(1,&texture3); glBindTexture(GL_T
12、EXTURE_2D,texture3); glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage0-sizeX,TextureImage0-sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage0-data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); if(TextureImage0=LoadBMP(Data/tia
13、nhuaban.bmp) /指定天花板的纹理 Status=TRUE; glGenTextures(1,&texture4); glBindTexture(GL_TEXTURE_2D,texture4); glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage0-sizeX,TextureImage0-sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage0-data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri
14、(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); if(TextureImage0=LoadBMP(Data/qiang2.bmp) /指定对面墙的纹理 Status=TRUE; glGenTextures(1,&texture5); glBindTexture(GL_TEXTURE_2D,texture5); glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage0-sizeX,TextureImage0-sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage0-data); g
15、lTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); if(TextureImage0=LoadBMP(Data/shafa.bmp) /指定沙发的纹理 Status=TRUE; glGenTextures(1,&texture6); glBindTexture(GL_TEXTURE_2D,texture6); glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage
16、0-sizeX,TextureImage0-sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage0-data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); if (TextureImage0) / If Texture Exists if (TextureImage0-data) / If Texture Image Exists free(Tex
17、tureImage0-data); / Free The Texture Image Memory free(TextureImage0); / Free The Image Structure return Status; / Return The Status GLvoidReSizeGLScene(GLsizei width, GLsizei height) / Resize And Initialize The GL Window if (height=0) / Prevent A Divide By Zero By height=1; / Making Height Equal On
18、e 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,120.0f); glMatrixMode(GL_MODELVIE
19、W); / Select The Modelview Matrix glLoadIdentity; / Reset The Modelview Matrix /设置06号光源位置 GLfloat sun_light_position0 = 0.0f, -5.0f, 2.0f, 1.0f; GLfloat sun_light_position1 = 0.0f, 7.0f, 2.0f, 1.0f; GLfloat sun_light_position2 = -10.0f, -5.0f, -30.0f, 1.0f; GLfloat sun_light_position3 = 10.0f, 7.0f,
20、 -30.0f, 1.0f; GLfloat sun_light_position4 = 10.0f, 5.0f, -50.0f, 1.0f; GLfloat sun_light_position5 = -10.0f, -5.0f, -50.0f, 1.0f; GLfloatsun_light_ambient = 0.5f, 0.5f, 0.5f, 1.0f; /环境光 GLfloatsun_light_diffuse = 1.0f, 1.0f, 1.0f, 1.0f; /漫射光 GLfloatsun_light_specular = 1.0f, 1.0f, 1.0f, 1.0f; /反射光
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenGL绘图 简单3D空间D漫游的实现 OpenGL 绘图 简单 空间 漫游 实现
链接地址:https://www.31ppt.com/p-3162284.html