基于OpenGL的小球碰撞动画模拟的实现
更新时间:2023-08-06 03:44:01 阅读量: 实用文档 文档下载
第24卷第6期2007年6月
计算机应用与软件
ComputerApplicationsandSoftware
V01.24No.6
Jun.2007
基于openGL的小球碰撞动画模拟的实现
贺孝梅刘丹青姚新港
(中国矿业大学机电工程学院江苏徐州221008)
摘要
介绍了利用图形工业标准0penGL双缓存技术实现计算机动画的原理和方法,并结合实例“小球碰撞动画模拟”的演示
动画,详细描述了MFc构架下0penGL动画编程的要点。关键词
0penGL双缓存
动画
MFC
THE
IMPLEMENTATIONoFASPHERULE’SCoLLISIoN
BASEDoNOPENGL
ANIMATIoNSIMULATION
HeXiaomei
LiuDanqingYaoXin’gang
(cof姆旷胁c^帆如口fond觑∞£一cE昭i聊e一增,Ch讥o‰i卯珊妙旷埘ning口nd‰^∞坳,船砌Du22JOD8,以口凡伊H,饥£∞)
Abstractampleof
a
ThetheoryandmethodofimplementingcomputeranimationbyOpenGLdoublebufbrtechnology
are
introduced.
Withthe
are
ex
sphemle’scollisionanimationsimulation,thekeypointsofperfbming0penGLanimationpmgmmminginMFCstmcture
de—
scribed.Keywords
0penGL
Doublebuf玷r
AIlimation
MFC
使用MFC编写0penGL程序是通过swapBuffer()函数实现
O
引言
缓存切换的,该函数格式为:
B00L
SwapBuf绝rs(HDChdc);
开放图形库0penGL是一个三维的计算机图形和模型库,现在已成为3D图形软件接口的工业标准…,OpenGL只有与其他程序设计语言相结合才能发挥它的作用。微软基本类库MFc是Pc机上windows操作系统中广泛使用的应用程序框架,它提供可视窗口程序的界面和基本输入输出功能,弥补了0penGL的不足。因此采用MFC与0penGL相结合的办法,可以充分利用MFc提供的windows程序框架和0penGL强大便捷的绘画功能,很方便地开发出功能丰富、性能优秀的动画应用程序。本文以“小球碰撞动画模拟”的演示为例,具体介绍MFc与OpenGL相结合制作动画的方法及其应用。1
本文以“小球碰撞动画模拟”为例简要说明MFC构架下0penGL动画编程的要点。当小球碰到左右两根柱子后,就会被迫改变运动方向;当小球下落到与下部由三维立体直方图组成的墙壁碰撞后,小球很快被弹起。由于能量的逐步损耗,小球弹起的高度将逐渐下降,最后会停止。这个动画过程能够很好地演示小球的非弹性碰撞。2
MFC构架下OpenGL动画编程的要点
2.1引入openGL绘图环境
首先用MFC创建一个名为“Ballcollisions”的工程,向工程中加入相应的】ib文件,将MFc中相应的0penGL头文件包含进该工程项目中,在Project\settings\Link菜单下的Library中增加
openGL动画工作原理
计算机动画中的驱动要素是时间,通过足够快的速度显示
一系列单个帧以生成活动的感觉。0penGL支持双缓存技术,该技术提供了一种生成平滑动画的机制旧J。程序把帧存看成是两个视频缓存,在任意时刻只有两者中的一个内容能被显示出来。当后台视频缓存中的内容被要求显示时,0penGL就会将它拷贝至前台视频缓存。在交换前后台视频缓存中的内容之前,应调用同步操作函数gIFlush()或毒Finish()。
open9132.1ib,glu32.1ib,glaux.1ib三个库文件。
2.2
openGL绘图环境的初始化
向View类中添加消息响应函数0ncreate(),在该方法中编
写一个View类的成员函数bsetupPixelFo珊at(HDchdc),重新设置像素格式,创建着色上下文并使它成为当前着色上下文”o。将帧缓存设置成正确的组态,之后在0nInitiaJupdate方法中编制函数Init(),用来完成对绘图的初始化,包括:设备清除背景色、光源属性、材料属性、深度测试方式和最初的场影变
喜强辟嚣
图1
0penGL双缓存动画原理
收稿日期:2006—10一12。贺孝梅,硕士生,主研领域:计算机辅助设计,计算机图形学。
第6期
贺孝梅等:基于OpenGL的小球碰撞动画模拟的实现
185
换等。
2.3
其中(x,y)表示小球的位置,m—nspeedx和m—nspeedY分别表
建立openGL视点
增加Wjndows消息wM—sIzE,向View类中加人消息响应
示小球在x方向和Y方向以像素为单位的速度分量,m-bPlay控制动画的显示。其次在构造函数中进行初始化:
x=lO,y=32;
m—nSpeedX=10,m—nSpeedY=1;m_bPlay=Tme;
函数0nsize(),在Onsize()中添加代码,建立视点、启动透视变换及建立透视体以设置投影格式。
2.4在onDraw()函数中设置光源,绘制图形
OpenGL提供了点、线、面三种几何图元的绘制功能,运用0penGL的绘图函数库,可以绘制出所需的基本图形,再辅以适当的变换,就可以绘制出比较复杂的三维形体。在该实例动画场景中,场景物体有运动小球,左右两边的柱子,中间下部是由有立体感的三维直方图组成的墙体。这些图形可以通过Open.GL的绘图函数库来完成。材质由环境色、扩散色、镜面高亮色等组成,分别体现该种材质对环境光、漫反射光和镜面反射光的不同反射率‘41。给物体添加适当的材质,在不同位置和方向架设光源,合理地利用纹理贴图可产生真实的场景效果。
Y方向上的速度分量根据演示过程不断地进行调整,就是这个演示程序的核心技术。小球碰撞算法的实现,主要是要响应wM—TIMER消息‘6|,因而在view类的OnTimer()中添加核心代码如下:
X+=m—nSpeedX;
If(x>ncljentWjdth一25){
x=nClientwidth一25,m—nspeedx=一m—nSpeedX;}
elseif(x<10){
x=10,m—nSpeedx=一m—nSpeedx;}
y+=m—nSpeedY,m—nSpeedY++;
在cBaiicol妇onsView类中添加保护成员函数DrawSeene
(),在此函数中编写0penGL的绘图语句,所有的绘图工作都可以通过它来完成;然后在绘图函数0nDraw()中调用Drawscene()即可。在Drawscene()函数中绘制场景图的代码如下:
void
if(y>(nclientHe噜ht一80)){y=2¥(ncllentHeight一80)一y;m—nSpeedY=一m—nSpeedY+4}
else
if(y<32)y=32;
用鼠标左键控制小球动画:
Void
CBallCollisionsView::0nLButtonDown(UNIT
nFlags,CPoint
CBallcollisionsView::drawscene(void){
91Clea尤0lor(0.O,O.O,O,0,0.O);
glClear(GL—COLOR—BUFFER—BITGL—DEPTH—BUFFER—BIT);Ⅱlyinit();
auxsolidsphere(1.0,20,1);glBegin(GL—QUADS);
出Vertex3f(1.0f,500.Of,0.0f);glVertex3“lO.0f,500.Of,O.0f);glVerte】c3f(10.0f,1.0f,O.0f);
//绘制碰撞的小球
//Draw
A
point){
m-bPlay=!m-bPl8y;
if(mjPIay)
SetTimer(1,45,NuLL);
else
Quad
//T叩Lefc
//T0p//Bottom
KillTimer(1);
CView::0nLButtonDown(nnags,poinc)
//通过鼠标左键下按操作在播放和暂停之间进行切换
int
Right
R培ht
Le&
誊V积ex3f(1.Of,1.Of,O.0f);
glEnd();//Done
retumTRUE;
//Bottom
DrawingThe
//Keep
CBaUCollisionsView=OnCreate(LPCREATESTRUCT1pCreateStmct
Quad
G0ing
){
if(CView::0ncreate(1pCreateStmct)==一1)retum—l;SetTimer(1,45,NULL);
retum
//绘制左边的柱子
glTranslatef(500.Of,0.Of,O.Of);//MoveRight500Units;可以同
//样的方式绘制右边的柱子,只是四边形各个定点坐标不同glFlush;}
0;}//初始化一个时钟,并规定它每45毫秒搏斗一次
对于场景中下部墙壁的绘制,我们是通过三维的直方图来构建的,为了突出其立体感,我们可以用画刷进行填充。在绘制时采用绘制多边形的方式,每个直方图可以绘制三个多边形来组成。
3
实例展示
通过MFc与OpenGL的结合,所编动画程序经过调试后得
到了很逼真的具有三维立体感的动画效果。图2为动画过程中的某一帧。
2.5动画控制的实现
实现动画效果方面,使用定时器是比较简单和常用的方法。用setTimer()函数来为应用程序分配一个系统定时器,通过该函数设置时间问隔(以ms为单位),然后在对wM—TIMER消息的响应函数中触发对图像的刷新。需要停止时,使用KjlJTimer()函数删除定时器。实现在视图类的0ncreate()函数中启动计时器,计时器消息控制函数对位置变量的值进行更新,并且使绘图矩形区域无效。而视图类的0nDraw()函数根据位置变量的值对图像进行绘制"j。
在实现小球的碰撞动画中关键的工作是管理好控制其位置的运动参数,这也是运动动画设计的一个至关重要的方面。首先要在cBallcolIisionsView.b文件中,添加私有成员变量:
int
图2小球非弹性碰撞动画场景
4结论
本文介绍了开放图形库0penGL通过双缓存技术实现动画
x,y,m-nSpeedX,m—nSpeedY;
B00Lm_bPlay:
186
计算机应用与软件
2007年
的原理。结合“小球碰撞动画模拟”这个具体实例讲解了在MFc框架下利用openGL实现动画演示的编程要点。程序调试结果立体感强,效果逼真,充分说明了OpenGL是三维可视化和场景系统开发的有力工具。将MFc与0penGL结合起来,充分利用MFc提供的windows程序框架和0penGL强大便捷的绘画功能,方便地开发出功能丰富、性能优秀的动画应用程序,具有一定的实用价值,值得我们继续深入研究。
参考文献
[1]白建军,朱亚平,等.0penGL三维图形设计与制作[M].北京:人民
邮电出版社,1999—8.
[2]和平鸽工作室.OpenGL高级编程与可视化系统开发[M].北京:中
国水利水电出版社,2003.
[3]向世明.0penGL编程与实例[M],北京:电子工业出版社,1999.[4]Daveshreiner,Masonwoo,等.0penGL编程指南[M].第四版.北
京:人民邮电出版社,2005—4.
[5]胡伟,王弘.如何在Vc十+中用MFc进行0pecL编程[J].计算机
应用,200l,21(8):87—89.
[6]向世明.Vc++数字图像与图形处理[M]+北京:电子工业出版
社,2002.
(上接第153页》
2.6
方法间内聚缺乏(LackofCohesionin
Meth.
ods.LCoM)
LCOM是没有访问一个属性的方法的百分比。Chida瑚-ber和Kemerer于1991年、1994年提出的度量都包含一定缺陷一J。Hen—drson—sellers于1996年提出了一个克服了一些缺陷的定义¨…:
加侧=兰号}
(土∑m(A,))一m
n为属性数,m为方法数,Ai为属性,m(A,)为访问A,的方法数。可见,要统计的信息比较方便得出,因而比较方便应用。这个定义提供了一个随内聚增加而减少的度量,给出了单位区间内的值,给出了区分直觉上内聚不同的类的值一J。
2.7封装性
cK度量组缺少对封装性的度量,因而做以下补充。封装性的度量可以通过公有成员数量、私有成员数量之比
(ny)表示。保护成员对本类来说,和私有成员相似,外部不可
访问,故可以计入私有成员的数量。基类的成员,则要按继承方式,将基类的各成员数量计入本类中。这样对间接继承,计算也比较方便。
对于方法,基本上应以公有的为主。对于属性,则应以私有为主。故两者应分开计算。方法的度量,在RFc中已经有所反映,计算wMc时已经保存了相应信息,此处只要作相应计算即可。属性封装性计算方法和计算wMc时相似。
同时,友员也破坏封装性。所以,也应计入本度量。对于友员来说,本类的私有成员都是可以访问的,故相当于增加了公有成员的数量。故可以这样计算:
过y=Wy+口宰(∥y)丰F=(∥y)书(a木F十1)
U为公有成员数及保护成员数的和,y为私有成员数,F为友员数,。为系数。这里,友员增加一个,相当于将一定数量的私有成员变为公有成员,Gs(彤y)m,反映了这种情况。吐y
值越大,说明封装性越差。
2.8多态性
cK度量组同样没有对多态性的度量。
多态性可以分为四类:重载多态、强制多态、包含多态、参数多态¨“。重载多态包括普通函数重载、类成员函数重载、运算符重载。对于普通函数重载,这不是类级的度量,而是一个系统级的度量,应该单独拿出来,统计出同名普通函数即可。运算符重载也可以重载为类的成员函数。包含多态通过虚函数实现。类成员函数重载、虚拟函数,其特点都是函数名相同。度量时,需要在基类中及基类的基类中,查找同名函数。参数多态与类模板相关,也是系统级的度量。该度量可定义为:
P由=!娃,/M:
帆包括类成员函数重载、虚拟函数、运算符重载为类的成
员函数的数量,丝为类的成员函数总数量。
3结论
本文提出了一种将每类加权方法数(WMc)的计算分为3部分的方法,从而方便将从基类继承的方法计入本类wMc。改进了继承树深度的算法,把多继承的情况也计算到了度量中,从而更全面的反映了类在继承方面的特性。对每个类的孩子数的
度量,分析了将间接继承的孩子数目计算到本度量的可行性,建
议计入其中,从而得到更真实的度量结果。
cK度量组缺少对封装性、多态性的度量,本文补充了这两个度量。本文分析了cK度量的应用方法,对改进、补充的度量也分析了应用方法。
下一步的工作,便是对这些度量进行验证,找出度量经验值,以更好的指导设计、开发。
参考文献
『1]
chid砌ber
sR,KemerercF.Ametricssuitefor
object—odentedde—
sign,IEEE
Transactions
on
Softwar℃Engineering,1994,20:476—493.
[2]
Bunge
M.Treatiseon
8asicPhilosophy:0ntoIogy
I:The
Fumi【ureof
theWorId.Boston:Riedel.1977.
[3]BungeM.Treatise
on
Basic
PhilosophV:ontology/I:弧eworldofsys—
tems.Boston:Riedel.1979.
[4]wandY,weberR.Anontolo画calevaluationof
systems
aIlalysisand
des逗口methods,Infomlation
systems
Concepts:AnIn—depth
Aidysrs,
E.D.Falkenberg
and
P,Lindgreen.Eds.Amsterdam:
ElsevierSci—
ence.1989.
[5]weyukerE.Evaluati“g
sofcware
complexity
Measures[J].IEEE
Trans—
actions
on
SonwareEngineering,1988,14:1357—1365.
[6]Haeng
KonKim.A
Study
on
Evaluation
ofcomponent
Met五c
suitec;,
Computa娃onalScienceandIts
Applications—ICCSA2005:Intema.
tional
Conference,Singapore,May
9—12,2005:62—70.
[7]TbbiasMayer,Tracy
Hall.criticalAnalysjs
of
Current00I)esignMet—
dcs[J].softwareQualityJoumal,1999(8):97—1lO.
[8]
Rosenberg
L,stapko
R,GalloA.Applying
0bject 0dented
Metrics,TheSixthIntemational
Symposium
on
scIflwareMetrics,B0ca
Raton,
Florida,November4—6,1999.
[9]IaIlcrallam.面向对象的方法:原理与实践[M].北京:机械工业出
版社,2003.[10]
Brian
Henderson
sellers.Object一0rientedMetrics[J].Measures
of
Complexity.Prenlice
Hall盯R,1996.
[11]郑莉,董渊,傅仕星.c++语言程序设计[M].北京:清华大学出
版社,2000.
基于OpenGL的小球碰撞动画模拟的实现
作者:作者单位:刊名:英文刊名:年,卷(期):被引用次数:
贺孝梅, 刘丹青, 姚新港, He Xiaomei, Liu Danqing, Yao Xingang中国矿业大学机电工程学院,江苏,徐州,221008计算机应用与软件
COMPUTER APPLICATIONS AND SOFTWARE2007,24(6)2次
参考文献(6条)
1.白建军;朱亚平 OpenGL三维图形设计与制作 19992.和平鸽工作室 OpenGL高级编程与可视化系统开发 20033.向世明 OpenGL编程与实例 1999
4.Dave Shreiner;Mason Woo OpenGL编程指南 2005
5.胡伟;王弘 如何在VC++中用MFC进行OpeGL编程[期刊论文]-计算机应用 2001(08)6.向世明 VC++数字图像与图形处理 2002
本文读者也读过(8条)
1. 孟飞.Meng Fei 基于OpenGL的计算机动画技术[期刊论文]-科技广场2005(1)
2. 贺再红.杨鼎强 基于OpenGL双缓存的多媒体动画实现[期刊论文]-计算技术与自动化2001,20(1)3. 程鑫恒.Cheng Xinheng 基于OpenGL的图像动画应用研究[期刊论文]-计算机光盘软件与应用2010(15)4. 乔立.苏鸿根 对MFC下使用OpenGL实现动画的两种方法特点分析[期刊论文]-计算机应用与软件2004,21(5)5. 尚艳玲.谷保庆.SHANG Yan-ling.GU Bao-qing 使用MFC实现OpenGL应用程序的开发[期刊论文]-安阳师范学院学报2007(5)
6. 杨双华.王以伦.张立勋.曹彩霞 MFC构架下的OpenGL动画技术[期刊论文]-应用科技2001,28(3)7. 许四平 基于MFC的openGL图形开发[期刊论文]-硅谷2009(23)
8. 方贤勇.张佑生.Fang Xianyong.Zhang Yousheng OpenGL扩展的应用技术[期刊论文]-微型电脑应用2001,17(5)
引证文献(2条)
1.王柯 虚拟现实二次开发平台的研究与实现[期刊论文]-成都信息工程学院学报 2010(2)
2.李济良.曾祥国.盛鹰.陈华燕.许书生 螺型位错运动过程的计算机模拟[期刊论文]-四川大学学报(自然科学版) 2009(4)
本文链接:http://www.77cn.com.cn/Periodical_jsjyyyrj200706066.aspx
正在阅读:
基于OpenGL的小球碰撞动画模拟的实现08-06
关于中共××镇××村支部委员会组成人员候选人预备人选的请示01-10
合肥市教育局关于举办2018年合肥市校园足球教练员培训班的补充通03-21
公路养护安全作业规程(试题+答案)04-13
高水15爱卫月活动情况小结04-22
1习题12-09
小学生一年级近视眼看图写话作文06-14
基于DS12C887的单片机实时时钟设计05-20
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 小球
- 碰撞
- 基于
- 模拟
- 实现
- 动画
- OpenGL