由于自然环境中大部分景物(如云彩、火焰、烟雾、瀑布、雪花等特效)具有不规则性、复杂性与随机性,且随着时间变化形状会随之变化,对其进行逼真的实时模拟十分困难,需要大量的计算量和数据量。在虚拟环境中,自然景物的视觉效果直接影响到观察者对周围环境的感知,所以开发一个既能满足逼真度要求,又能实时显示的粒子系统是非常必要的。自从OpenGL公布以来,有关图形学方面的书籍、论文等资料就层出不穷,如何利用Open GL开发出具有一定水平的计算机图形程序就成为众多学者的追求目标。在Visual C++中,既可利用Win32编程,也可利用MFC编程,两者各有特点,本文就如何利用Open GL在MFC中开发出一个简单的喷泉模拟程序作一个简单探讨。
2019-7-17 10:55:04
1 OpenGL绘图环境初始化
OpenGL是一个跨平台的三维图形库,可在Windows、Unix和Mac等平台上运行。而Visual C++完善的基本类库MFC和应用向导AppWizard使得开发一个复杂的应用程序变得轻松自如。如果将两者结合,便可开发出较高水平的Windows下三维图形应用程序[1]。
在3D游戏的渲染过程中,传统的建模方法一般只适用于外形比较规则的形体,对于那些像雨、雪、瀑布、喷泉以及火焰等没有固定形状,甚至要随着外部环境或者其他因素的改变而改变的物质建模,传统的方法就显得无能为力了[2]。1983年REEVES W T提出了一种新的建模方法,称为模糊物体建模,该方法就是粒子系统,它的出现正好解决了上述问题[3]。
OpenGL函数库和操作系统无关,它有自己的独特设计,与Windows的图像设备接口GDI模型以及多数MFC应用程序的建立方法不太一致。在Windows系统中,这样的一组函数称为wiggle函数,每个wiggle函数的前缀是“wgl”。
在Win32下,首先必须重新设置画图窗口的像素格式,使其符合OpenGL对像素格式的需要。为此,声明一个PIXELFORMATDESCRIPTOR结构的变量,并适当设置其结构成员的值,使其支持OpenGL及其颜色模式。再以此变量为参数调用ChoosePixelFormat(),分配一个像素格式号,然后调用SetPixelFormat()将其设置为当前像素格式。
完成了像素格式的重新设置后,需要为OpenGL建立绘制描述表(Render Context)。绘制描述表的作用类似于Windows中的设备描述表(Device Context)。只有建立了绘制描述表RC后,OpenGL才能调用绘图原语在窗口中做出图形。Win32API提供了几个操作绘制描述表的函数,包括建立、复制、使用、删除和查询等,它们都以wgl为词头。RC是以线程为单位的,每一个线程必须使用一个RC作为当前RC才能执行OpenGL绘图原语。
wglCreateContext()是建立绘制描述表的函数,它以一个指向GDI设备描述表的句柄为参数,返回一个与此设备描述表相关联的绘制描述表句柄。在以此2句柄为参数调用函数wglMakeCurrent(),使RC成为线程当前使用的RC,完成Windows下OpenGL绘图环境的初始化过程[4]。
1 OpenGL绘图环境初始化
OpenGL是一个跨平台的三维图形库,可在Windows、Unix和Mac等平台上运行。而Visual C++完善的基本类库MFC和应用向导AppWizard使得开发一个复杂的应用程序变得轻松自如。如果将两者结合,便可开发出较高水平的Windows下三维图形应用程序[1]。
在3D游戏的渲染过程中,传统的建模方法一般只适用于外形比较规则的形体,对于那些像雨、雪、瀑布、喷泉以及火焰等没有固定形状,甚至要随着外部环境或者其他因素的改变而改变的物质建模,传统的方法就显得无能为力了[2]。1983年REEVES W T提出了一种新的建模方法,称为模糊物体建模,该方法就是粒子系统,它的出现正好解决了上述问题[3]。
OpenGL函数库和操作系统无关,它有自己的独特设计,与Windows的图像设备接口GDI模型以及多数MFC应用程序的建立方法不太一致。在Windows系统中,这样的一组函数称为wiggle函数,每个wiggle函数的前缀是“wgl”。
在Win32下,首先必须重新设置画图窗口的像素格式,使其符合OpenGL对像素格式的需要。为此,声明一个PIXELFORMATDESCRIPTOR结构的变量,并适当设置其结构成员的值,使其支持OpenGL及其颜色模式。再以此变量为参数调用ChoosePixelFormat(),分配一个像素格式号,然后调用SetPixelFormat()将其设置为当前像素格式。
完成了像素格式的重新设置后,需要为OpenGL建立绘制描述表(Render Context)。绘制描述表的作用类似于Windows中的设备描述表(Device Context)。只有建立了绘制描述表RC后,OpenGL才能调用绘图原语在窗口中做出图形。Win32API提供了几个操作绘制描述表的函数,包括建立、复制、使用、删除和查询等,它们都以wgl为词头。RC是以线程为单位的,每一个线程必须使用一个RC作为当前RC才能执行OpenGL绘图原语。
wglCreateContext()是建立绘制描述表的函数,它以一个指向GDI设备描述表的句柄为参数,返回一个与此设备描述表相关联的绘制描述表句柄。在以此2句柄为参数调用函数wglMakeCurrent(),使RC成为线程当前使用的RC,完成Windows下OpenGL绘图环境的初始化过程[4]。
举报
2019-7-17 10:55:18
2 建立OpenGL单文档应用程序框架
使用Visual C++的AppWizard和Class Wizard可以很容易地生成一个使用MFC的OpenGL单文档应用程序框架,名称为MyFountain。
2.1 PreCreateWindow方法
BOOL CMySDOpenGLView:: PreCreateWindow(CREATESTRUCT& cs)
{
cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
return CView::PreCreateWindow(cs);
}
使视窗口具有WS_CLIPCHILDREN和WS_CLIPSIBLINGS风格,确保成功地设置像素格式。
2.2 添加消息响应函数
利用MFC ClassWizard为CMySDOpenGLView类添加消息WM_CREATE、WM_DESTROY、WM_SIZE和WM_TIMER的响应函数。
首先在OnCreate方法中初始化OpenGL,并设置定时器。
然后在OnTimer响应函数中添加定时器响应函数和场景更新命令,使得程序按照定时器设置的时间步长进行中断,并调用OnDraw对场景进行更新、渲染。
第三步,添加OnSize函数对用户进行窗口调整的消息进行响应,并即时调整窗口的大小[5]。
最后,当关闭窗口时,将值NULL(或0)赋值给wglMakeCurrent()的参数hRC后,调用wglDeleteContext()删除绘制描述表,并删除调色板和定时器。
2 建立OpenGL单文档应用程序框架
使用Visual C++的AppWizard和Class Wizard可以很容易地生成一个使用MFC的OpenGL单文档应用程序框架,名称为MyFountain。
2.1 PreCreateWindow方法
BOOL CMySDOpenGLView:: PreCreateWindow(CREATESTRUCT& cs)
{
cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
return CView::PreCreateWindow(cs);
}
使视窗口具有WS_CLIPCHILDREN和WS_CLIPSIBLINGS风格,确保成功地设置像素格式。
2.2 添加消息响应函数
利用MFC ClassWizard为CMySDOpenGLView类添加消息WM_CREATE、WM_DESTROY、WM_SIZE和WM_TIMER的响应函数。
首先在OnCreate方法中初始化OpenGL,并设置定时器。
然后在OnTimer响应函数中添加定时器响应函数和场景更新命令,使得程序按照定时器设置的时间步长进行中断,并调用OnDraw对场景进行更新、渲染。
第三步,添加OnSize函数对用户进行窗口调整的消息进行响应,并即时调整窗口的大小[5]。
最后,当关闭窗口时,将值NULL(或0)赋值给wglMakeCurrent()的参数hRC后,调用wglDeleteContext()删除绘制描述表,并删除调色板和定时器。
举报
2019-7-17 10:55:35
参考文献
[1] 和平鸽工作室.OpenGl高级编程与可视化系统开发(高级编程篇)[M].北京:中国水利水电出版社,2007.
[2] 徐明亮,卢红星,王琬.OpenGl游戏编程[M].北京:机械工业出版社,2008.
[3] REEVES W T. Particle systems-a technique for modeling a class of fuzzy objects[J]. ACM Transations on Graphics(TOG), 1983,2(2):359-376.
[4] 周建龙,肖春.计算机图形学理论与OpenGl编程实践[M].广州:华南理工大学出版社,2007.
[5] 孙鑫,余安萍.VC++深入详解[M].北京:电子工业出版社,2008.
[6] 雷晓,胡倩.基于Direct3D的粒子系统设计[J].微计算机信息,2010(11-1).
[7] 张芹,吴慧中,谢隽毅.基于粒子系统的火焰模型及其生产方法研究[J].计算机辅助设计与图形学报,2001,13(1):78-82.
[8] PHONG B T. Illunimation for computer generated pictures[J].Communications of the ACM,1975,18(6):311-317.
[9] 侯阳,迪克.三维图形动画编程实例[M].海洋出版社,1993.
[10] 杨春雨.基于粒子系统的喷泉动画模拟[J].长春:吉林大学出版社,2008.
[11] 凌云,储林波.用Visual C++中的MFC和OpenGl建立三维图形应用环境[J].微型机与应用,1998,17(4):8-10.
参考文献
[1] 和平鸽工作室.OpenGl高级编程与可视化系统开发(高级编程篇)[M].北京:中国水利水电出版社,2007.
[2] 徐明亮,卢红星,王琬.OpenGl游戏编程[M].北京:机械工业出版社,2008.
[3] REEVES W T. Particle systems-a technique for modeling a class of fuzzy objects[J]. ACM Transations on Graphics(TOG), 1983,2(2):359-376.
[4] 周建龙,肖春.计算机图形学理论与OpenGl编程实践[M].广州:华南理工大学出版社,2007.
[5] 孙鑫,余安萍.VC++深入详解[M].北京:电子工业出版社,2008.
[6] 雷晓,胡倩.基于Direct3D的粒子系统设计[J].微计算机信息,2010(11-1).
[7] 张芹,吴慧中,谢隽毅.基于粒子系统的火焰模型及其生产方法研究[J].计算机辅助设计与图形学报,2001,13(1):78-82.
[8] PHONG B T. Illunimation for computer generated pictures[J].Communications of the ACM,1975,18(6):311-317.
[9] 侯阳,迪克.三维图形动画编程实例[M].海洋出版社,1993.
[10] 杨春雨.基于粒子系统的喷泉动画模拟[J].长春:吉林大学出版社,2008.
[11] 凌云,储林波.用Visual C++中的MFC和OpenGl建立三维图形应用环境[J].微型机与应用,1998,17(4):8-10.
举报