为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

基于OpenGL的小球碰撞动画模拟的实现

2017-10-26 10页 doc 37KB 32阅读

用户头像

is_321635

暂无简介

举报
基于OpenGL的小球碰撞动画模拟的实现基于OpenGL的小球碰撞动画模拟的实现 124 No. 6 Vo l第 24 卷第 6期计算机应用与软件 2007 年 6月Comp u te r App lica tion s and Softwa re Jun. 2007 基于 O penGL 的小球碰撞动画模拟的实现 贺孝梅 刘丹青姚新港 ()中国矿业大学机电工程学院 江苏 徐州 221008 Op enGL 双缓存技术实现计算机动画的原理和方法 ,并结合实例“小球碰撞动画模拟 ”的演示介绍了利用图形工业标准 摘 要 动画 ,详细描述了 M FC构架下 O...
基于OpenGL的小球碰撞动画模拟的实现
基于OpenGL的小球碰撞动画模拟的实现 124 No. 6 Vo l第 24 卷第 6期计算机应用与软件 2007 年 6月Comp u te r App lica tion s and Softwa re Jun. 2007 基于 O penGL 的小球碰撞动画模拟的实现 贺孝梅 刘丹青姚新港 ()中国矿业大学机电学院 江苏 徐州 221008 Op enGL 双缓存技术实现计算机动画的原理和方法 ,并结合实例“小球碰撞动画模拟 ”的演示介绍了利用图形工业 摘 要 动画 ,详细描述了 M FC构架下 Op enGL 动画编程的要点 。 关键词 Op enGL 双缓存 动画 M FC THE IM PL EM ENTA T IO N O F A SPHERULE πS COLL IS IO N A N IM A T IO N S IM UL A T IO N BA SED O N O PENGL H e X iaom e i L iu D anq ing Yao X inπgang ( )College of M echan ica l and E lectric Eng ineering, Ch ina U n iversity of M in ing and Technology, X uzhou 221008, J iangsu, Ch ina A b stra c t The theo ry and m e thod of imp lem en ting comp u te r an im a tion by Op enGL doub le buffe r techno logy a re in troduced. W ith the ex2 amp le of a sp he ru leπs co llision an im a tion sim u la tion, the key po in ts of p e rfo rm ing Op enGL an im a tion p rogramm ing in M FC struc tu re a re de2 sc ribed. Keyword s Op enGL Doub le buffe r A n im a tion M FC ( )使用 M FC编写 Op enGL 程序是通过 SwapB uffe r 函数实现 缓存切换的 ,该函数格式为 :0 引 言 ( ) BOOL SwapB uffe rs HDC hdc; 开放图形库 Op enGL 是一个三维的计算机图形和模 型库 , [ 1 ] 现在已成为 3D 图形软件接口的工业标准 , Op enGL 只有与其 2 M FC 构架下 O pen GL 动画编程的要点 他程序 设 计 语 言 相 结 合 才 能 发 挥 它 的 作 用 。微 软 基 本 类 库 本文以“小 球 碰 撞 动 画 模 拟 ”为 例 简 要 说 明 M FC 构 架 下M FC是 PC机上 W indow s操 作 系 统 中 广 泛 使 用 的 应 用 程 序 框 架 ,它提供可视窗口程序的界 面和基本输入输出功能 , 弥补了 Op enGL 动画编程的要点 。当小球碰到左右两根柱子后 ,就会被 Op enGL 的不足 。因此 采 用 M FC 与 Op enGL 相 结 合 的 办 法 , 可 迫改变运动方向 ;当小球下落到与下部由三维立体直方图组成 以充分利用 M FC提供的 W indow s程序框架和 Op enGL 强大便捷 的墙壁碰撞后 ,小球很快被弹起 。由于能量的逐步损耗 ,小球弹 的绘画功能 ,很方便地开发出功能丰富 、性能优秀的动画应用程起的高度将逐渐下降 ,最后会停止 。这个动画过程能够很好地 序 。本文以“小球 碰 撞 动 画 模 拟 ”的 演 示 为 例 , 具 体 介 绍 M FC演示小球的非弹性碰撞 。 与 Op enGL 相结合制作动画的方法及其应用 。 2. 1 引入 O pen GL 绘图环境 首先用 M FC创建一个名为“B a llCo llision s”的工程 ,向工程 中加入相应的 . lib文件 ,将 M FC中相应的 Op enGL 头文件包含进 1 O pen GL 动画工作原理 该工程项目中 ,在 P ro jec t \ Se ttings \L ink菜单下的 L ib ra ry中增加 op eng132. lib, glu32. lib, glaux. lib三个库文件 。 计算机动画中的驱动要素是时间 ,通过足够快的速度显示 一系列单个帧以生成活动的感觉 。Op enGL 支持双缓存技术 ,该 2. 2 O pen GL 绘图环境的初始化[ 2 ] 技术提供了一种生 成平滑动画的机制 。程序把帧存看成是 ( ) 向 V iew类中添加消息响应函数 O nC rea te ,在该方法中编 两个视频缓存 ,在任意时刻只有两者中的一个内容能被显示出( ) 写一个 V iew类的成员函 数 bSe tup P ixe lFo rm a t HDC hdc , 重新 来 。当后台视频缓存中的内容被要求显示时 , Op enGL 就会将它 设置像 素 格 式 , 创 建 着 色 上 下 文 并 使 它 成 为 当 前 着 色 上 下 拷贝至前台视频缓存 。在交换前后台视频缓存中的内容之前 , [ 3 ] 文 。将帧缓存设置成正确的组态 , 之后在 O n In itia lUp da te 方 ( )( ) 应调用同步操作函数 glF lu sh 或 glF in ish 。 ( ) 法中编制函数 In it ,用来完成对绘图的初始化 ,包括 : 设备清 除背景色 、光源属性 、材料属性 、深度测试方式和最初的场影变 收稿日期 : 2006 - 10 - 12。贺孝梅 , 硕士生 , 主研领域 : 计算机辅助 1 Op enGL 双缓存动画原理 图 ,计算机图形学 。 ( )换等 。 其中 x, y表示小球的位置 , m _ nSp eedX 和 m _ nSp eedY分别表 示小球在 X 方向和 Y方向以像素为单位的速度分量 , m _ bP lay 2. 3 建立 O pen GL 视点 控制动画的显示 。其次在构造函数中进行初始化 :增加 W indow s消息 WM _ S IZE, 向 V iew 类中加入消息响应 x = 10 , y = 32; ( ) ( )函数 O nSize ,在 O nSize 中添加代码 ,建立视点 、启动透视变 m _nSp eedX = 10 , m _nSp eedY = 1; 换及建立透视体以设置投影格式 。 m _bP lay = True; 2. 4 在 O nD ra w( )函数中设置光源 , 绘制图形Y方向上的速度分量根据演示过程不断地进行调整 ,就是 Op enGL 提供了点 、线 、面 三种几何图元的绘制功 能 , 运用 这个演示程序的核心技术 。小球碰撞算法的实现 ,主要是要响 [ 6 ] Op enGL 的绘图函数库 ,可以绘制出所需的基本图形 ,再辅以适 ( ) 应 WM _T IM ER 消息 ,因而在 V iew 类的 O nTim e r 中添加核 当的变换 ,就可以绘制出比较复杂的三维形体 。在该实例动画 心代码如下 : 场景中 ,场景物体有运动小球 ,左右两边的柱子 ,中间下部是由 X + = m _nSp eedX; ( ) If x > nC lien tW id th - 25 { 有立体感的三维直方图组成的墙体 。这些图形可以通过 Op en2 x = nC lien tW id th - 25 , m _nSp eedX = - m _nSp eedX; } GL 的绘图函数库来完成 。材质由环境色 、扩散色 、镜面高亮色 ( ) else if x < 10 { 等组成 ,分别体现该种材质对环境光 、漫反射光和镜面反射光的 [ 4 ] x = 10 , m _nSp eedX = - m _nSp eedX; } 不同反射率 。给物体添加适当的材质 ,在不同位置和方向架y + = m _nSp eedY, m _nSp eedY + + ; 设光源 ,合理地利用纹理贴图可产生真实的场景效果 。( ( ) ) if y > nC lien tH e igh t - 80 { 在 CB a llCo llision sV iew 类 中 添 加 保 护 成 员 函 数 D rawScene ( ) y = 2 3 nC lien tH e igh t - 80 - y; ( ) ,在此函数中编写 Op enGL 的绘图语句 ,所有的绘图工作都可 m _nSp eedY = - m _nSp eedY + 4 } ( ) 以通过它来完成 ;然后在绘图函数 O nD raw 中调用 D rawScene ( ) else if y < 32 y = 32; ( )( )即可 。在 D rawScene 函数中绘制场景图的代码如下 : 用鼠标左键控制小球动画 :( ) vo id CB a llCo llision sV iew: : d raw scene vo id{ ( Vo id CB a llCo llision sV iew: : O nLB u ttonDown UN IT nF lags, CPo in t ( ) glC lea rCo lo r 0. 0 , 0. 0 , 0. 0 , 0. 0 ; ) po in t{ ( ) glC lea r GL _COLOR _BU FFER _B IT | GL _D EPTH _BU FFER _B IT; m _bP lay = ! m _bP lay; ( ) m yin it ; ()if m _bP lay ( ) auxSo lidSp here 1. 0 , 20 , 1 ; 绘制碰撞的小球 / /( ) SetTim e r 1 , 45 , NULL ; ( ) / / D raw A Q uad glB egin GL _QUAD S; e lse ( ) glV e rtex3 f 1. 0 f, 500. 0 f, 0. 0 f; / / Top L eft ( ) KillTim e r 1 ; ( ) glV e rtex3 f 10. 0 f, 500. 0 f, 0. 0 f; / / Top R igh t ( ) CV iew: : O nLB u ttonDown nF lags, po in t} ( ) glV e rtex3 f 10. 0 f, 1. 0 f, 0. 0 f; / /Bo ttom R igh t / /通过鼠标左键下按操作在播放和暂停之间进行切换( ) glV e rtex3 f 1. 0 f, 1. 0 f, 0. 0 f; / /Bo ttom L eft ( in t CB a llCo llision sV iew:: O nC reate L PCR EA TESTRUCT lpC rea teStruc t ( ) glEnd ; / /Done D raw ing The Q uad ) { re tu rn TRU E; / / Keep Go ing ( ( ) ) if CV iew:: O nC rea te lpC rea teStruct= = - 1 re tu rn - 1; / /绘制左边的柱子( ) Se tTim er 1 , 45 , NULL ; ( ) glTran slatef 500. 0 f, 0. 0 f, 0. 0 f; / /Move R igh t 500 U n its;可以同 re tu rn 0; } / /初始化一个时钟 ,并规定它每 45 毫秒搏斗一次 / /样的方式绘制右边的柱子 ,只是四边形各个定点坐标不同 glF lu sh; } 3 实例展示 对于场景中下部墙壁的绘制 ,我们是通过三维的直方图来 构建的 ,为了突出其立体感 ,我们可以用画刷进行填充 。在绘制 通过 M FC与 Op enGL 的结合 ,所编动画程序经过调试后得 时采用绘制多边形的方式 ,每个直方图可以绘制三个多边形来 到了很逼真的具有三维立体感的动画效果 。图 2为动画过程中 组成 。 的某一帧 。 2. 5 动画控制的实现 实现动画效果方面 ,使用定时器是比较简单和常用的方法 。 ( )用 Se tTim e r 函数来为应用程序分配一个系统定时器 ,通过该 () 函数设置时间间隔 以 m s为单位 ,然后在对 WM _T IM ER 消息 的响应函数中触发对图像的刷新 。需要停止时 ,使用 KillTim e r ( )( ) 函数删除定时器 。实现在视图类的 O nC rea te 函数中启动 计时器 ,计时器消息控制函数对位置变量的值进行更新 ,并且使 ( ) 绘图矩形区域无效 。而视图类的 O nD raw 函数根据位置变量 [ 5 ] 的值对图像进行绘制 。 图 2 小球非弹性碰撞动画场景 在实现小球的碰撞动画中关键的工作是管理好控制其位置 的运动参数 ,这也是运动动画设计的一个至关重要的方面 。首 4 结 论 先要在 CB a llCo llision sV iew. h文件中 ,添加私有成员变量 : in t x, y, m _nSp eedX, m _nSp eedY; 本文介绍了开放图形库 Op enGL 通过双缓存技术实现动画 BOOL m _bP lay; 186 计算机应用与软件2007年 的原理 。结 合“小 球 碰 撞 动 画 模 拟 ”这 个 具 体 实 例 讲 解 了 在 2. 8 多态性 M FC框架下利用 Op enGL 实现动画演示的编程要点 。程序调试 CK度量组同样没有对多态性的度量 。 多态性可以分为四 结果立体感强 ,效果逼真 ,充分说明了 Op enGL 是三维可视化和 类 :重载多态 、强制多态 、包含多态 、参数 场景系统开发的有力工具 。将 M FC 与 Op enGL 结合起来 ,充分 [ 11 ] 多态 。重载多态包括普通函数重载 、类成员函数重载 、运算利用 M FC提供的 W indow s程序框架和 Op enGL 强大便捷的绘画 符重载 。对于普通函数重载 , 这不是类级的度量 , 而是一个系统 功能 ,方便地开发出功能丰富 、性能优秀的动画应用程序 ,具有 级的度量 , 应该单独拿出来 , 统计出同名普通函数即可 。运算符 一定的实用价值 ,值得我们继续深入研究 。 重载也可以重载为类的成员函数 。包含多态通过虚函数实现 。 类成员函数重载 、虚拟函数 , 其特点都是函数名相同 。度量时 ,参 考 文 献 需要在基类中及基类的基类中 , 查找同名函数 。参数多态与类 [ 1 ] 白建军 ,朱亚平 ,等. Op enGL 三维图形设计与制作 [M ]. 北京 :人民 模板相关 , 也是系统级的度量 。该度量可定义为 : 邮电出版社 , 1999 - 8. Poly =M /M o t [ 2 ] 和平鸽工作室. Op enGL 高级编程与可视化系统开发 [M ]. 北京 :中M 包括类成员函数重载 、虚拟函数 、运算符重载为类的成 o 国水利水电出版社 , 2003.员函数的数量 , M 为类的成员函数总数量 。 t [ 3 ] 向世明. Op enGL 编程与实例 [M ]. 北京 :电子工业出版社 , 1999. [ 4 ] D ave Sh re ine r, M a son W oo, 等. Op enGL 编程指南 [ M ]. 第四版. 北 3 结 论 京 :人民邮电出版社 , 2005 - 4. [ 5 ] 胡伟 ,王弘. 如何在 VC + +中用 M FC进行 Op eGL 编程 [ J ]. 计算机 () 本文提出了一种将每类加权方法数 WMC 的计算分 为 3 ( ) 应用 , 2001 , 21 8 : 87 - 89. 部分的方法 ,从而方便将从基类继承的方法计入本类 WMC。改 [ 6 ] 向世明. VC + +数字图像与图形处 理 [ M ]. 北 京 : 电子 工业 出版 进了继承树深度的算法 ,把多继承的情况也计算到了度量中 ,从 社 , 2002. 而更全面的反映了类在继承方面的特性 。对每个类的孩子数的 度量 ,分析了将间接继承的孩子数目计算到本度量的可行性 ,建 ()上接第 153页 议计入其中 ,从而得到更真实的度量结果 。2 ( L a ck of C ohe sion in M e th2. 6 方 法 间 内 聚 缺 乏CK度量组缺少对封装性 、多态性的度量 ,本文补充了这两 od s, L COM ) 个度量 。本文分析了 CK度量的应用方法 ,对改进 、补充的度量 LCOM 是没有访问一个属性的方法的百分比 。Ch idam ber 和 也分析了应用方法 。 [ 9 ] Kem ere r于 1991年 、1994年提出的度量都包含一定缺陷 。Hen2 下一步的工作 , 便 是对这些度量进行验证 , 找 出 度 量 经 验[ 10 ] d rson2Se llers于 1996年提出了一个克服了一些缺陷的定义 : 值 ,以更好的指导设计 、开发 。a 1 - m )(m A j ? a j =1 参 考 文 献 LO CM = 1 - m [ 1 ] Ch idam ber S R , Kem e re r C F. A m e tric s su ite fo r ob jec t2o rien ted de2 ) ( a为属性数 , m 为方法数 , A 为属性 , m A 为访问 A 的方 j j j sign. IEEE Tran sac tion s on Softwa re Enginee ring, 1994 , 20: 476 - 493. 法数 。可见 , 要统计的信息比较方便得出 , 因而比较方便应用 。 [ 2 ] B unge M. Treatise on B asic Ph ilo sop hy: O n to logy I: The Fu rn itu re of 这个定义提供了一个随内聚增加而减少的度量 , 给出了单位区 the W o rld. Bo ston: R iede l, 1977. [ 9 ] 间内的值 , 给出了区分直觉上内聚不同的类的值 。 [ 3 ] B unge M. Trea tise on B a sic Ph ilo sop hv: O n to logy / I: The W o rld of Sys2 tem s. Bo ston: R iede l. 1979. 2. 7 封装性 [ 4 ] W and Y, W ebe r R. A n on to logica l eva lua tion of system s ana lysis and CK度量组缺少对封装性的度量 , 因而做以下补充 。 封装de sign m e thod s, Info rm a tion System s Concep ts: A n In2dep th A idysrs, 性的度量可以通过公有成员数量 、私有成员数量之比 E. D. Fa lkenbe rg and P. L indgreen. Ed s. Am ste rdam: E lsevie r Sci2 () U _V 表示 。保护成员对本类来说 , 和私有成员相似 , 外部不可 ence, 1989. 访问 , 故可以计入私有成员的数量 。基类的成员 , 则要按继承方 [ 5 ] W eyuke r E. Eva lua ting Software Comp lexity M ea su re s[ J ]. IEEE Tran s2 式 , 将基类的各成员数量计入本类中 。这样对间接继承 , 计算也 ac tion s on Software Enginee ring, 1988 , 14: 1357 - 1365. 比较方便 。 [ 6 ] H aeng Kon Kim. A Study on Eva luation of Componen t M e tric Su ite s, 对于方法 ,基本上应以公有的为主 。对于属性 ,则应以私有 Comp u ta tiona l Sc ience and Its App lica tion s 2 ICCSA 2005: In te rna2 为主 。故两者应分开计算 。方法的度量 ,在 R FC中已经有所反 tiona l Conference, Singapo re, M ay 9 212 , 2005: 62 - 70. [ 7 ] Tob ia s M aye r, Tracy H a ll. C ritica l A na lysis of Cu rren t OO D e sign M et2 映 ,计算 WMC时已经保存了相应信息 ,此处只要作相应计算即 ( ) rics[ J ]. Softwa reQ ua lity Jou rna l, 1999 8 : 97 - 110. 可 。属性封装性计算方法和计算 WMC时相似 。[ 8 ] Ro senberg L , Stap ko R , Gallo A. App lying O b jec t2O rien ted M e tric s, 同时 ,友员也破坏封装性 。所以 ,也应计入本度量 。对于友 The Sixth In te rna tional Sympo sium on Softwa re M e tric s, Boca R a ton, 员来说 ,本类的私有成员都是可以访问的 ,故相当于增加了公有 F lo rida, Novem be r 4 - 6 , 1999. 成员的数量 。故可以这样计算 :[ 9 ] Ian Graham. 面向对象的方法 :原理与实践 [M ]. 北京 : 机械工业出 () () ( )U _V = U /V + a 3 U /V 3 F = U /V 3 a 3 F + 1 版社 , 2003.U 为公有成员数及保护成员数的和 , V 为私有成员数 , F 为 [ 10 ] B rian H ende rson Se lle rs. O b jec t2O rien ted M e tric s [ J ]. M ea su re s of 友员数 , a为系数 。这里 , 友员增加一个 , 相当于将一定数量的 Comp lexity. P ren tice H a ll PTR , 1996. ( ) 私有成员变为公有成员 , a 3 U /V 3 F 反映了这种情况 。U _V [ 11 ] 郑莉 ,董渊 ,傅仕星. C + +语言程序设计 [ M ]. 北京 : 清华大学出 值越大 , 说明封装性越差 。 版社 , 2000.
/
本文档为【基于OpenGL的小球碰撞动画模拟的实现】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索