在VC++6.0中实现对3D Max构造OpenGL模型的控制
如何在vc++6.0里面使用openGl

如何在vc++6.0里面使用openGl?你既可以建立Win32项目使用API,也可以建立MFC工程(一般不用MFC框架直接用API)我给你一个例子吧,建立Win32空项目,添加一个cpp文件,编译执行就行了(这是一个经典的opengl框架了)代码如下:#pragma comment(lib,"opengl32.lib")#pragma comment(lib,"glu32.lib")#pragma comment(lib,"glaux.lib")#include <windows.h>#include <gl/gl.h>#include <gl/glu.h>#include <gl/glaux.h>HDC hDC=NULL;HGLRC hRC=NULL;HWND hWnd=NULL;HINSTANCE hInstance;BOOL keys[256];BOOL active=TRUE;BOOL fullscreen=TRUE;GLfloat rtri;GLfloat rquad;LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);GLvoid ResizeGLScene(GLsizei width,GLsizei height){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){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);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); 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);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,"释放DC或RC失败","关闭错误",MB_OK|MB_ICONINFORMA TION);if(!wglDeleteContext(hRC))MessageBox(NULL,"释放RC失败","关闭错误",MB_OK|MB_ICONINFORMATION); hRC=NULL;}if(hDC && !ReleaseDC(hWnd,hDC)){MessageBox(NULL,"释放DC失败","关闭错误",MB_OK|MB_ICONINFORMATION); hDC=NULL;}if(hWnd && !DestroyWindow(hWnd)){MessageBox(NULL,"释放窗口句柄失败","关闭错误",MB_OK|MB_ICONINFORMA TION); hWnd=NULL;}if(!UnregisterClass("OpenG",hInstance)){MessageBox(NULL,"不能注销窗口类","关闭错误",MB_OK|MB_ICONINFORMATION); hInstance=NULL;}}BOOL CreateGLWindow(char* title,int width,int height,int bits,BOOL fullscreenflag){GLuint PixelFormat;WNDCLASS wc;DWORD dwExStyle;DWORD dwStyle;RECT WindowRect;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="OpenG";if(!RegisterClass(&wc)){MessageBox(NULL,"注册窗口失败","错误",MB_OK|MB_ICONINFORMATION); 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_SUCCE SSFUL){if(MessageBox(NULL,"全屏模式设置失败!\n使用窗口模式?","OpenGL 3D游戏编程",MB_YESNO|MB_ICONEXCLAMA TION)==IDYES){fullscreen=FALSE;}else{MessageBox(NULL,"程序将被关闭","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}}}if(fullscreen){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,"OpenG",title,dwStyle|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,0,0,WindowRect.right-WindowRect.left,WindowRect.bottom-WindowRect.top,NULL,NULL,hInstance,NULL))){KillGLWindow();MessageBox(NULL,"窗口创建失败","错误",MB_OK|MB_ICONINFORMATION);return FALSE;}static PIXELFORMA TDESCRIPTOR pfd={sizeof(PIXELFORMA TDESCRIPTOR),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,"不能创建一个窗口设备描述表","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}if(!(PixelFormat=ChoosePixelFormat(hDC,&pfd))){KillGLWindow();MessageBox(NULL,"不能创建一个匹配的像素格式","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}if(!SetPixelFormat(hDC,PixelFormat,&pfd)){KillGLWindow();MessageBox(NULL,"不能设置像素格式","错误",MB_OK|MB_ICONINFORMATION); return FALSE;}if(!(hRC=wglCreateContext(hDC))){KillGLWindow();MessageBox(NULL,"不能创建OpenGL渲染描述表","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}if(!wglMakeCurrent(hDC,hRC)){KillGLWindow();MessageBox(NULL,"不能激活当前的OpenGL渲染描述表","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}ShowWindow(hWnd,SW_SHOW);SetForegroundWindow(hWnd);SetFocus(hWnd);ResizeGLScene(width,height);if(!InitGL()){KillGLWindow();MessageBox(NULL,"初始化失败","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}return TRUE;}LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){switch(uMsg){case WM_ACTIV ATE:{if(!HIWORD(wParam))active=TRUE;elseactive=FALSE;return 0;}case WM_SYSCOMMAND:{switch(wParam){case SC_SCREENSA VE:case SC_MONITORPOWER:return 0;}break;}case WM_CLOSE:{PostQuitMessage(0);return 0;}case WM_KEYDOWN:{keys[wParam]=TRUE;return 0;}case WM_KEYUP:{keys[wParam]=FALSE;return 0;}case WM_SIZE:{ResizeGLScene(LOWORD(lParam),HIWORD(lParam));return 0;}}return DefWindowProc(hWnd,uMsg,wParam,lParam);}int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){MSG msg;BOOL done=FALSE;if(MessageBox(NULL,"你想在全屏模式下运行吗?","设置全屏模式",MB_YESNO|MB_ICONQUESTION)==IDNO){fullscreen=FALSE;}if(!CreateGLWindow("Win32 SDK风格OpenGL程序框架",640,480,16,fullscreen)) return 0;while(!done){if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){if(msg.message==WM_QUIT)done=TRUE;else{TranslateMessage(&msg);DispatchMessage(&msg);}}else{if(active){if(keys[VK_ESCAPE])done=TRUE;else{DrawGLScene();SwapBuffers(hDC);}}if(keys[VK_F1]){keys[VK_F1]=FALSE;KillGLWindow();fullscreen=!fullscreen;if(!CreateGLWindow("Win32 SDK风格OpenGL程序框架",640,480,16,fullscreen)) return 0;}}}KillGLWindow();return msg.wParam;}。
计算机科技与应用专业毕业论文--基于Opengl的3D游戏设计

摘要随着时代进步,从简单的色块堆砌而成的画面到数百万多边形组成的精细人物,游戏正展示给我们越来越真实且广阔的世界。
对于近几年游戏的发展来说,老式2D游戏的画面、游戏性、互动性已经无法满足各类玩家的需要,而3D游戏无论是在游戏画面的真实程度、操作的流畅程度、以及故事背景方面的优越性都非常突出。
在这种发展趋势下,2D游戏所占领的市场将会变得微乎其微,3D游戏的开发将会成为整个游戏制作领域的一种趋势。
针对于3D游戏开发,OpenGL作为一个3D的应用程序编程接口(API)来说,是非常合适的。
OpengGL作为与硬件无关的软件接口,只要操作系统使用了OpengGL适配器就可以打到相同的效果。
它又是一个开放图形库,在跨平台领域上非常便利。
并且它具有优良的移植性,是广大3D游戏开发者的首选。
本论文为利用OpengGL进行3D射击游戏的设计与开发,采用碰撞检测、粒子系统、MD2模型绘制、3D声效等技术,最终实现一个射击游戏。
关键词:游戏, 基于OpengGL,三维, 射击游戏Abstract: Along with the progress of the times,fine characters from simple color swatch built the picture to the millions of polygons, the game is to show us more and more real and the wide world.For the development of the game in recent years, the old 2D games' screen ,games andinteractive have been unable to meet all kinds of game player needs, while 3D regardless of the game on the game screen reality, smooth operation, and the background of the story of the superiority is very prominent.In this trend, 2D game occupied market will become very little, the development of 3D games will become the game made a trend in the field.For 3D game development, OpenGL as the application programming interface of a 3D (API), is a very suitable. OpengGL as the interface of the software and hardware independence, as long as the operating system uses the OpengGL adapter can reach the same effect. It is also an open graphics library, cross-platform in areas very convenient. And it has good transplantation, is the 3D game developer's choice.In this paper, the design and development of 3D shooting game is to use OpengGL, the collision detection, particle system, MD2 model, 3D sound rendering technology, the ultimate realization of a shooting game.Keywords game, OpengGL, 3D, shooting game目录1 引言 (1)1.1 课题的背景及意义 (1)1.2 毕业设计的任务 (1)1.3 国内外现状的研究 (2)1.4 开发技术与开发平台 (3)1.4.1 开发技术 (3)1.4.2 开发平台 (3)2 OpenGL简介与3D图形学相关 (5)2.1 OpenGL简介 (5)2.1.1 OpenGl特点 (5)2.1.2 OpenGL功能 (6)2.1.3 OpenGL渲染 (7)2.2 3D图形学相关 (8)2.2.1 向量与矩阵 (8)2.2.2 变换 (8)2.2.3 投影 (8)2.2.4 3D裁剪 (9)3 游戏设计 (11)3.1 游戏的组成 (11)3.2 游戏的结构 (11)3.3 本游戏设计 (12)4 关键技术 (15)4.1 摄像机漫游 (15)4.2 碰撞检测 (16)4.3 粒子爆炸 (19)4.4 云雾效果 (20)4.5 简易AI (21)4.6 3D模型 (23)4.7 3D音效 (26)4.8 游戏场景随机地形 (28)5 运行游戏 (30)结论 (36)参考文献 (37)致谢 .................................................................................................................................. 错误!未定义书签。
在VC中使用3DMAXSDK和OpenGL实现建模的方法_王彪

黑龙江商学院学报第16卷第3期 JOURNAL OF HEILONGJIANG INSTITUTE OF COMMERCE Vol.16 No.3 2000年9月 (NATURAL SCIENCES EDITION) Sep. 2000文章编号2000哈尔滨工业大学工程制图教研室150001探讨了在VC++中使用3DMAX SDK及OpenGL函数的方法加上OpenGL的光照和材质处理关键词3DMAX SDK求差 中图分类号A 1 前 言 目前加之Microsoft已把OpenGL集成到Windows98中OpenGL是一个工业标准的三维计算机图形软件接口它能够生成真彩的三维场景而且在其辅助函数库中还提供了绘制三维物体的子程序void auxSolidSphere (GLdouble radius);void auxSolidBox (GLdouble width, GLdoble height, GLdouble depth);但对于初学者来说要想利用这两个函数来求球与方体的差就比较困难了如果在Visual C++中使用3D MAX的基本几何形体则会使编程人员在极短的时间内达到编程目的及在应用程序执行时可能出现的几个问题将3D MAX SDK装入到微机中2000-07-19作者简介1962-男研究方向三维造型第3期王彪等点取Options进入Options对话框DirectoriesÔÚDirectories列表框中加入\3D MAX SDK/INCLUDE如图1所示a)将动态连接库加入到路经为Windows/system下b)将动态连接库加入到某文件的Debug中2.3 利用MFC提供的应用框架建立一个Windows用户界面要用MFC AppWizard来生成Windows应用程序的基本源文件消息处理和数据处理或者定义控件的属性最后把应用程序所要求的功能添加到类中My3d My3d程序的主要类及主要源文件如下CMy3dDoc视图类它指定用户以什么方式见到文档数据主边框窗口类用于管理应用程序窗口菜单栏状态栏应用程序类用于控制应用程序的所有对象并完成应用程序的初始化工作和46 黑龙江商学院学报2000年最后的清除工作是标准的头文件StdAfx.h和StdAfx.cppRes\My3d.icoÓ¦ÓóÌÐòͼ±ê°üº¬ÔÚ×ÊÔ´ÎļþMy3d.rc中应用程序必须包含相应的头文件和函数库文件#include“max.h”#include<GL/gl.h>#include<GL/glu.h>#include<GL/glaux.h>2.5 为了防问OpenGL和3D MAX SDK函数glu32.lib, glaux.lib, Geom.lib[3], Mesh.lib[3], Patch.lib[3], Core.lib[3]等文件加入到工程中去这些信息可帮助程序利用连接器访问动态连接库函数和表示要用到的3D MAX SDK和OpenGL库函数打开Project\Settings如图2所示第3期王彪等差的布尔运算被封装在函数CalcBoolop (mesh &mesh, Mesh &mesh1, Mesh &mesh2, int op)[32]中Mesh &mesh1, Mesh &mesh2为进行布尔运算前的两个实体的数据结构并MESHBOOL UNION实体间的交运算MESHBOOL DIFFERENCE½á¹¹²»¶ÔʹÓõıäÁ¿Ã»ÓнøÐж¨ÒåÒÔ¼°À¨ºÅ´îÅä²»¶ÔµÈµÈ´íÎó4.2 语句错误没有而Linking出错说明可能缺少函数库4.3 如果Compiling和Linking均通过与系统相连的设备不能正常运转则可能需要加入动态连接库如果问题还不能解决则可能是你所装入的3D MAX SDK中的函数所需要的动态连接库与你所添加的动态连接库不相匹配查明相应的3D MAX版本下转51页第3期徐耀群等詹叔浩. 求解Packing问题的拟物方法[J]. 应用数学学报许如初. 支持求解圆形Packing问题的两个拟人策略[J]. 中国科学29蒋慰孙. 混沌优化方法及应用[J]. 控制理论及应用14. [5] 卢侃等. 混沌动力学[M]. 上海1990.Find Solution of Circle Packing Problem by Using ChaosOptimrzlation MethodXu Yao-qun1, Wang Hong-bin2, Cao Xiao-hua3(1.Basic Course Department, Heilongjiang Commerce Institute, Harbin, 150076, China; 2.Department of Mathmatic, Harbin Institute of Technology, Harbin, 150001, China; 3.Department of Adlilt Education, Heilongjiang Commerce Institute, Harbin, 150076, china)Abstract This paper has found solation of circle packing problem by using chaos optimization method, and given a new idea for solving this problem.Key words Packing problem; NP-complete problem; chaos algorithm(上接47页)加入该版本的动态连接库作者在进行课题研究时发现3D MAX 3.0中的SDK函数要与3D MAX 1.0或3D MAX 1.1的动态连接库要相搭配使用[1] 贾志刚.精通OpenGL[M]. 北京:电子工业出版社,1998.3[2] 木林森,高峰霞,奚红宇.Visual C++5.0使用与开发[M] .北京1997[3] Microsoft Corporation. 3D Studio Max Software Development Kit. Yost Group, Inc., 1996A Modeling Method of Using 3DMAX SDK and OpenGL in VC++Wang Biao Gong Na(Harbin Institute of Technology, Engineering Drawings Dep.Harbin, 150001, China)Abstract: This paper is concerned with using the functions of 3DMAX SDK and OpenGL in Visual C++. It is conveniently to settle the difference of two solids, by utilizing the primitive geometric models of 3DMAX and the lights and materials of OpenGL.Key words: VC++; 3DMAX SDK; OpenGL; difference。
基于VC++6.0和OpenGL的3DS文件的读取与控制方法

O eG p n L作 为 一 个 性 能 优 越 的 图 形 应 用 程 序 设 计 界 面 fP1 A I, 其 编 程 灵 活 、 便 . 广 泛 的移 植 性 和 很 强 的 交 互 式 兰 维 网 形 处 方 有 理 能 力 , 认 为 是 高性 能 图形 和交 互 式 视 景 处 理 的 标 准 。O e G 被 pn L 除 了 能 够 对 三 维 模 型 进 行 绘 制 外 . 可 以进 行 三 维 交 互 、 还 动作 模 拟 等 。具 体 的 功能 主要 有 : 型 绘 制 : 型观 察 ; 色模 式 的指 定 ; 模 模 颜
摘要 : 本文 介 绍 了在 Vi a C++下 如何 使 用 Op l s l u e1 GL读 取 和 控 制 3 a Ds x生 成 的 三 维 模 型 的 方 法 。 M 关 键 词 : 拟 现 实 ; e GL:DS; sa 虚 Op n 3 Vi l u C++
中图分 类号 : P Байду номын сангаас T 37
维普资讯
。
人 工 智 能 及 识 删 技 术 。
本 目 任 辑: 桂 栏 责编 李瑾
基 于 V + 60和 Op n C +. e GL的 3 S文件 的读取与控 制方法 D
丁 斌
( 东北 大学 秦 皇 岛 分校 管理 系 , 北 秦 皇 岛 0 60 河 6 0 4)
文献标识码 : A
文章编 号:0 9 3 4 (0 71 — 0 3 — 2 1 0 — 0 42 0 )5 3 8 2 0
D I G I N Bi 1
3 c me tRe d n nr I to s B s n VC + + 6 0a d Op n DS Do u n a er d Co t a o Me h d a edO . n e GL
VC6.0中OpenGL开发环境配置

VC6.0中OpenGL开发环境配置All materials are obtained from webpage and this document is created by GangMei2012-11-18第一步:选择一个编译环境现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的。
但这里我们选择VC++ 6.0作为学习OpenGL的环境。
第二步:安装GLUT工具包GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。
Windows环境下的GLUT下载地址:(大小约为150k)/resources/libraries/glut/glutdlls37beta.zip无法从以上地址下载的话请使用下面的连接:/upfile/200607311626279.zipWindows环境下安装GLUT的步骤:1、将下载的压缩包解开,将得到5个文件2、以我的安装目录为例:(1)“d:\Program Files\Microsoft Visual Studio\VC98\include\GL文件夹”。
把解压得到的glut.h放到这个GL文件夹里。
没有GL文件夹可以自己建一个,一般都有的。
(2)“d:\Program Files\Microsoft Visual Studio\VC98\lib文件夹”)。
把解压得到的glut.li b和glut32.lib放到静态函数库所在文件夹,即lib文件夹。
(3)把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。
(典型的位置为:C:\Windows\System32)这是非常重要的动态链接库设置!第三步,创建工程,其步骤如下:(1)创建一个Win32 Console Application。
(以我创建的为例,工程名为simpleGL)(2)链接OpenGL libraries:在Visual C++中先单击Project,再单击Settings,再找到Li nk单击,最后在Object/library modules 的最前面加上opengl32.lib Glut32.lib Glaux.lib glu32.lib 。
VC6.0使用教程4.0汇总

24
方法/步骤
25
方法/步骤
26
方法/步骤
程序的错误修改 如果编译或者连接过程中出现错误,底部信息提示
窗口会提示错误所在行以及错误的类型,双击即可定 位到相应的代码处进行修改,尔后重新编译连接运行 ,重复此过程直到程序功能达到要求没有错误。
4
基本概念
代码文件: 用于存储程序的文件,C++ 代码文件的扩展名为
.cpp ,C 语言代码文件的扩展名为 .c ,存储函数或 者变量声明的头文件扩展名一般为 .h 。
5
基本概念
调试(DEBUG): 输入代码、编译、连接、运行并不断修正错误的整
个过程。
6
基本概念
发布(RELEASE): 指程序完成代码的编写和功能调试,最终编译和分
36
注意事项
2)main already defined in ???.obj 一个项目对应一个可执行文件,终端程序中只能有
一个 main 函数,如果你添加了两个都带有 main 函 数的 cpp 文件到同一个项目,则会出现此错误。
解决办法:在 FileView 视图下找到 source file 下的 cpp 文件按 del 将其从项目中剔除,或者临时 注释掉其中一个 cpp 中的代码。
37
注意事项
3)unknown character 0xa3 cpp 代码中除注释和常量外只能出现半角字符,所
以如果代码是从其他地方粘贴过来的,则常常会出现 此类错误,并且很多非法字符是不可见的。
解决办法:尽量手工录入代码,或者将空白部分都 删掉然后重新格式化代码。
VC环境下OpenGL多视图窗口的实现
别的线程将无法同时绘图。一个线程一次只能拥有一个现行 RC,但是可以拥有多个 RC;一个 RC 也可以由多个线程共享,但是它每次只能在一个线程中是现行 RC;一个 RC 可以对应多个 DC,但在绘图时,只能同时与一个 DC 挂钩。
本文实现多视图采用多个 RC 和多个 DC 的模式,其中每个视图对应一个 DC,每个 DC 对应 一个 RC,故 4 个视图就有 4 个 DC,4 个 RC,当需要在某个视图上绘图时,就将该 RC 切换为当 前 RC。
第2页 共5页
至此,一个多窗口的程序就生成了。下面我们讨论如何实现在各个窗口进行 OpenGL 图形渲 染。 3.视图类设置
同单个窗口显示 OpenGL 图形一样,为了能够在各个视图上显示 OpenGL 图形,需要对各个 视图类都进行相应的设置,为了方便初学者,这里对操作步骤进行详细介绍,读者可以对照参考 本文提供的源代码:
视图类设置同单个窗口显示opengl图形一样为了能够在各个视图上显示opengl图形需要对各个视图类都进行相应的设置为了方便初学者这里对操作步骤进行详细介绍读者可以对照参考本文提供的源代码
软件报/2006 年/10 月/23 日/第 019 版 开发编程 应用实例
VC 环境下 OpenGL 多视图窗口的实现
编程语言:Visual C要:本文在 Visual C++环境下,以 4 个 OpenGL 窗口为例,介绍多个 OpenGL 窗口的 实现,在此框架的基础上,可以实现类似 3DSMax 多视角 3D 软件编程。
关键字:OpenGL;三维;多视角;多视图; OpenGL 是在 SGI 等多家世界闻名的计算机公司的倡导下,以 SGI 的 GL 三维图形库为基 础制定的一个通用共享的开放式三维图形标准。很多著名的产品包括动画制作软件 Soft Image 和 3DStudio MAX 等都是在它的基础上实现的。 从本质上说,OpenGL 是一个完全可移植并且速度很快的 3D 图形和建模库。在 Windows 平台上,OpenGL 可以方便地与 Visual C++(在下文中简称 VC)结合,创建精致漂亮的 3D 图形。通常在 VC 环境下编写 OpenGL 程序都是单视图的模式,本文介绍如何把单个视图拆分为 多个,如何在各个视图上进行切换绘图。 1.OpenGL 绘图 1.1.OpenGL 绘图简介 具有 Windows 编程经验的人都知道,在 Windows 下用 GDI 绘图必须通过设备上下文 (DeviceContext 简称 DC)调用相应的绘图函数;用 OpenGL 绘图也是类似,OpenGL 函数也通 过“渲染上下文”(RenderingContext 简称 RC)完成三维图形的绘制。正如设备上下文 DC 要存 储 GDI 的绘制环境信息如笔、刷和字体等,渲染上下文 RC 也必须存储 OpenGL 所需的渲染信息 如像素格式等。DC 调用每个 GDI 函数都需要一个 DC 句柄,而 RC 不同,所有的 OpenGL 函数 都是在当前 RC(当前 RC 概念见 1.2 节)下进行的,故不需要传入 RC 句柄。 Windows 系统支持 OpenGL 渲染,Win32 库提供了用于初始化像素格式、控制渲染和使用 OpenGL 扩展的函数(wgl 打头的函数)。下面对几个常用的 wgl 函数的功能进行简单介绍。 (1)HGLRC wglCreateContext(HDChdc) 该函数用来创建一个 OpenGL 可用的渲染上下文 RC。 (2)BOOL wglDeleteContext(HGLRChglrc) 该函数删除一个 RC。 (3)HGLRC wglGetCurrentContext(void) 该函数返回线程的现行 RC,如果线程无现行 RC 则返回 NULL。 (4)HDC wglGetCurrentDC(void) 该函数返回与线程现行 RC 关联的 DC,如果线程无现行 RC 则返回 NULL。 (5)BOOL wglMakeCurrent(HDC hdc,HGLRC hglrc) 该函数把 hdc 和 hglrc 关联起来,并使 hglrc 成为调用线程的当前 RC。 1.2.OpenGL 多视图渲染的原理 上文提到,用 OpenGL 绘图首先必须创建一个 RC,在创建 RC 时与一个 DC 建立联系(RC 也只能通过 DC 来创建),然后再将其设置为当前 RC,这样,OpenGL 的函数就可以通过 RC 对 应的 DC 画到相应的显示设备上。 一个 RC 是否是当前 RC,这是针对调用线程而言的,一个线程在拥有现行 RC 进行绘图时,
实验一vc6.0opengl绘图环境及简单图形的输出
任课教师:马文娟《3D图形学》(2013-2014学年第1学期)实验报告学号:姓名:班级:实验一VC++6.0+OpenGL绘图环境及简单图形的输出一、实验目的1、熟练使用实验主要开发平台VC++6.0;2、进一步熟悉OpenGL的主要功能;3、掌握OpenGL的绘图流程和原理;4、掌握OpenGL的基本数据类型、核心函数的使用。
二、实验内容创建一个OpenGL工程,利用OpenGL库函数进行简单图形设计与绘制。
三、实验原理1、基本语法(C版本下的OpenGL语法)OpenGL基本函数均使用gl作为函数名的前缀,如glClearColor();实用函数则使用glu作为函数名的前缀,如gluSphere()。
OpenGL基本常量的名字以GL_开头,如GL_LINE_LOOP;实用常量的名字以GLU_开头,如GLU_FILL。
一些函数如glColor*()(定义颜色值),函数名后可以接不同的后缀以支持不同的数据类型和格式,如glColor3b()、glColor3d()、glColor3f()和glColor3bv ()等,这几个函数在功能上是相似的,只是适用于不同的数据类型和格式,其中3表示该函数带有三个参数,b、d、f分别表示参数的类型是字节型、双精度浮点型和单精度浮点型,v则表示这些参数是以向量形式出现的。
OpenGL定义了一些特殊标识符,如GLfloat、GLvoid,它们其实就是C中的float 和void。
2、程序的基本结构OpenGL程序的基本结构可分为三个部分:1)第一部分是初始化,主要是设置一些OpenGL的状态开关,如颜色模式(RGBA 或ALPHA)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检验、裁剪等。
这些状态一般都用函数glEnable(…)、glDisable(…)来设置,“…”表示特定的状态。
2)第二部分设置观察坐标系下的取景模式和取景框位置大小,主要利用了三个函数:函数void glViewport(left, top, right, bottom) 设置在屏幕上的窗口大小,四个参数描述屏幕窗口四个角上的坐标(以像素表示);函数void glOrtho(left, right, bottom, top, near, far) 设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体;函数void gluPerspective(fovy, aspect, zNear, zFar) 设置投影方式为透视投影,其取景体积是一个截头锥体。
OpenGL在VC_6_0开发环境下的编程实现
山西电子技术2011年第1期软件技术收稿日期:2010-12-03作者简介:王正强(1986-),男,青海互助县人,硕士研究生,专业是信号与信息处理。
文章编号:1674-4578(2011)01-0066-01OpenGL 在VC++6.0开发环境下的编程实现王正强(中北大学信息与通信工程学院,山西太原030051)摘 要:近年来,由于三维技术的飞速发展和广泛应用,许多原来采用V is ua l C ++作为基础语言创建应用程序的领域,都有了虚拟现实、科学计算可视化等三维仿真处理的应用要求。
基于此介绍了O pen GL 的工作方式、VC ++下的Open GL 的程序框架、O pen GL 绘制过程以及双缓存技术。
最后给出工程上某个时刻的效果图。
关键词:VC++;O penGL ;三维技术中图分类号:TP311.5 文献标识码:A0 引言O penGL 是一个优秀的专业化的3D AP I 。
它最早是SG I 为图形工作站开发的。
随着Open GL 成为高性能图形与交互式视景处理的工业标准,目前几乎所有的3D 图形显示卡都已经支持OpenGL 。
O pen GL 的应用范围已经从游戏开发、三维设计等逐步扩展到3D 图形、图形处理、广告、动画、虚拟实现、科学计算可视化、仿真等多种领域多个层面。
可以说OpenGL 在三维领域的霸主地位是毋庸置疑的。
1 OpenGL 工作方式O penGL 指令模型是C /S(C li ent/Server ,客户、服务器)模型,通常用户程序(客户)发出命令提交给内核程序(服务器),内核程序再对各种指令进行解释,并初步处理,之后交给操作系统服务而转交给硬件[1]。
上述过程可以在同一台计算机上完成,也可以在网络环境中,由不同的计算机合作完成,OpenGL 通过上述合作实现网络透明。
简单的工作流程如图1所示。
图1 Op enGL 工作流程O penGL 库函数被封装在动态链接库O peng l 32.dll 中,应用程序发出O pen GL 命令后,O pen GL 函数调用被动态链接库Openg l 32.dll 处理。
OpenGL中3DMAX模型的应用(转)
OpenGL中3DMAX模型的应用(转)OpenGL中3DMAX模型的应用摘要:阐述如何在OpenGL三维编程中实现3DMAX数据模型的程序控制,成果可用于飞机飞行的运动模拟和飞行实时监控等领域中。
关键词:OpenGL、3DMAX、ASE文件、投影和变换。
1、前言OpenGL是一个硬件和图形软件接口,由于它在三维真实感图形制作中性能优秀,诸如Microsoft、SGI、IBM、DEC、SUN等计算机主导公司都采用了OpenGL标准,OpenGL已经成为事实上的高性能和交互式视景标准。
Microsoft 公司在Window95/NT操作系统中支持OpenGL前,只有在昂贵的图形工作站上才能运行OpenGL程序,随着支持OpenGL图形加速卡的出现和PC机性能的提高,OpenGL 在PC机上得到广泛的应用。
OpenGL中很容易实现模型的各种变换、着色、光照、纹理、交互操作和动画,但是它只能提供基本几何元素的造型函数,使得复杂模型的建模相对困难。
3DMAX是Kinetix公司的三维图形建模和动画软件,能方便建立各种复杂物体模型,但是很难进行程序控制。
因此,我们自然想到在3DMAX中建立好复杂模型后,在OpenGL中实现对其方便控制和变换。
2、OpenGL的基本操作1)物体的绘制:通过点、线、多边形实现。
2)变换:投影变换、几何变换、裁剪变换、视口变换。
3)着色:OpenGL提供RGBA模式和颜色索引模式,提供224种颜色。
4)纹理映射:在具体模型表面加上现实世界中物体的纹理,可使三维模型更生动。
5)交互操作和动画:OpenGL辅助函数库提供了消息响应函数,可以较方便的实现交互程序控制。
6)其它:光照、反走样、混合、雾化等功能。
3、3DMAX ASE模型描述及OpenGL控制3.1 用C语言数据结构描述3DMAX模型在3DMAX中建立好模型后,仅以三角形网格方式存为ASE文件(ASCII文件),在程序中我们需建立对应的模型数据结构,本文以C 语言数据结构为例。