基于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

ThetheoryandmethodofimplementingcomputeranimationbyOpenGLdoublebufbrtechnology

are

introduced.

Withthe

are

ex

sphemle’scollisionanimationsimulation,thekeypointsofperfbming0penGLanimationpmgmmminginMFCstmcture

de—

scribed.Keywords

0penGL

Doublebuf玷r

AIlimation

MFC

使用MFC编写0penGL程序是通过swapBuffer()函数实现

引言

缓存切换的,该函数格式为:

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

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毫秒搏斗一次

对于场景中下部墙壁的绘制,我们是通过三维的直方图来构建的,为了突出其立体感,我们可以用画刷进行填充。在绘制时采用绘制多边形的方式,每个直方图可以绘制三个多边形来组成。

实例展示

通过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

本文来源:https://www.bwwdw.com/article/h2um.html

Top