box2d中文教程
- 格式:pdf
- 大小:555.07 KB
- 文档页数:31
本篇开始,会介绍lufylegend-1.4.0的新功能,怎样结合box2dweb 创建一个物理世界以及这个物理世界里的各种刚体准备工作首先你需要下载html5开源库件lufylegend-1.4.0/lufy_legend/article/details/7644932box2dweb你可以到这里下载/p/box2dweb/downloads/list准备三张图片,分别用来创建圆形,矩形和三角刚体。
准备结束,现在开始制作。
下面是利用lufylegend.js中的LLoadManage类来读取图片[javascript]view plain copy1.init(10,"mylegend",800,400,main);2.var backLayer,cLayer,wallLayer,bitmap,loadingLayer;3.var imglist = {};4.var imgData = new Array(5. {name:"bird1",path:"./images/bird1.png"},6. {name:"bird2",path:"./images/bird2.png"},7. {name:"stage01",path:"./images/stage01.png"}8. );9.function main(){10. LGlobal.setDebug(true);11. backLayer = new LSprite();12. addChild(backLayer);13.14.15. loadingLayer = new LoadingSample3();16. backLayer.addChild(loadingLayer);17. LLoadManage.load(18. imgData,19.function(progress){20. loadingLayer.setProgress(progress);21. },22.function(result){23. imglist = result;24. backLayer.removeChild(loadingLayer);25. loadingLayer = null;26. gameInit();27. }28. );29.}LGlobal.setDebug(true);是开启debug模式,这样在创建刚体的时候,会将box2dweb所创建的debug刚体也一起显示出来,发布成品的时候,应该关闭debug模式。
游戏开发中的Cocos2dx引擎教程及使用方法Cocos2d-x引擎是一款流行的开源游戏开发引擎,它基于C++编写,并支持多平台游戏开发。
它拥有强大的功能和灵活的架构,使得游戏开发者可以方便地创建高质量的游戏。
本文将介绍Cocos2d-x引擎的教程和使用方法,以帮助开发者快速上手并开发出优秀的游戏作品。
一、Cocos2d-x引擎的介绍Cocos2d-x引擎是Cocos2d家族的一员,它是Cocos2d开源项目的C++版本。
与其他Cocos2d引擎相比,Cocos2d-x引擎具有较高的性能和跨平台的优势。
它可以在多个平台上运行,包括iOS、Android、Windows、Mac OS等,并且支持多种编程语言,如C++、JavaScript、Lua等。
Cocos2d-x引擎提供了丰富的游戏开发工具和功能,包括图形渲染、动画、音频、物理引擎等,让开发者可以轻松实现各种游戏场景和效果。
二、Cocos2d-x引擎的安装和配置要开始使用Cocos2d-x引擎,首先需要安装和配置相应的开发环境。
以下是一些基本的步骤:1. 下载Cocos2d-x引擎:可以从Cocos2d-x官方网站下载最新版本的引擎。
2. 解压引擎文件:解压下载的引擎文件到本地目录。
3. 配置环境变量:将Cocos2d-x引擎路径加入到系统的环境变量中,以便在命令行中运行引擎命令。
4. 创建新项目:使用引擎提供的命令行工具创建一个新的项目。
5. 编译和运行:通过命令行进入项目目录,执行相应的命令进行编译和运行。
三、Cocos2d-x引擎的基本概念和架构Cocos2d-x引擎以场景为基本单位进行游戏开发,每个场景由层和节点组成。
层是场景中的一个可见区域,用于显示游戏对象和处理用户输入。
节点是层的基本元素,它可以是精灵、标签、按钮等。
通过创建和组合节点,开发者可以实现游戏中的各种功能和效果。
除了场景、层和节点,Cocos2d-x引擎还提供了许多其他的功能模块,如动画、音频、物理引擎等,开发者可以根据需要选择和使用这些功能模块,以实现游戏中的各种特效和交互。
第十章BOX2D 2D物理引擎能增强游戏世界中物体如多边形(箱子,三角形,多边形)的动作的真实感从而提高游戏质量。
这个引擎通过用户设定的参数如重力,密度,摩擦,弹性等参数计算碰撞,角度,力和动力等。
jbox2D物理引擎原版是采用C++编写的,后来扩展到java,as等多种版本。
著名手机游戏愤怒的小鸟便是采用jbox2D物理引擎。
不过java版得jbox2D引擎性能不如C++环境下运行的性能好。
在性能配置比较好的手机上面,jbox2D效果也是不错的。
•Box2D分为java版、C++版、Flash版:Box2D(主要用C++开发的APP和IOS)JBox2D(主要用于J2se、J2me、android)源码:库文件:/p/jbox2d/downloads/list物理世界与手机屏幕坐标系之间的关系•Box2D在Android 中的应用:下载类库/p/jbox2d/downloads/list建立android项目时,导入jbox的jar包。
jbox2D的使用步骤:1.创建一个World的世界在创建一个world对象之前,创建一个AABB的坐标范围,创建一个Vec2的重力方向向量,将两个属性添加到world对象当中去。
2.创建一个Ground(地面)的对象,并设置地面的一些属性,例如弹性,密度,摩擦力等,将地面添加到world对象中去。
3.创建一个Body(物体)对象,并设置物体的属性,如质量,密度等,将物体添加到world对象中。
4.模拟world。
一旦启动模拟world(世界),各个物体对象的属性只,如碰撞后的速度,方向等发生改变,将属性在view界面中不断画出来,就是看到的物理效果。
•例子//创建坐标系private AABB worldAABB;//创建一个世界private World world;worldAABB=new AABB();//上下界,以屏幕的左上方为原点,如果创建的刚体到达屏幕的边缘的话,会停止模拟worldAABB.lowerBound.set(-100.0f,-100.0f);//注意这里使用的是现实世界的单位worldAABB.upperBound.set(100.0f, 100.0f);Vec2 gravity = new Vec2(0.0f,10.0f);//实例化物理世界重力向量对象boolean doSleep= true;//创建世界world = new World(worldAABB, gravity, doSleep);worldAABB一个边界框,完全包含了所有你的形状。
Box2D 物理游戏编程基础内容Box2D 物理游戏编程基础 (1)致谢 (5)前言 (6)A.1 是否需要物理知识 (6)A.2 适用对象 (6)A.3 需要什么 (6)A.4 阅读规范 (7)1.认识Box2D世界 (8)1.1什么是Box2D引擎 (8)1.2 创建Box2D世界 (9)1.2.1 重力 (10)1.2.2 创建世界 (11)1.3 开启Box2D模拟 (12)1.4 小结 (16)2.认识刚体 (17)2.1 什么是刚体 (17)2.2创建刚体 (18)2.3 认识刚体形状 (24)圆形 (25)矩形 (25)2.4 b2DebugDraw调试视图 (28)2.5小结 (33)3.刚体属性详解 (34)3.1 b2BodyDef (34)状态类属性 (35)角度、角速度类属性 (38)坐标、速度类属性 (42)其他属性 (45)3.2 b2FixtureDef (48)物质特性类属性 (49)碰撞属性 (52)形状 (56)其他属性 (68)3.3 小结 (68)4.刚体操作 (70)4.1 LDEasyBox2D工具包 (70)4.2 CreateFixture (74)4.3 CreateFixture2 (77)4.4 DestroyFixture (78)4.5 ApplyForce (81)4.6 ApplyImpulse (86)4.7 ApplyTorque (89)4.8 GetLocalXXX、GetWorldXXX (92)4.9 GetMass (94)4.10 SetMassData (96)4.11 Split (99)4.12 GetAABB (102)4.13 QueryAABB (107)4.14 QueryShape (112)4.15 RayCast (119)4.16 小结 (128)5.碰撞处理 (129)5.1 认识碰撞 (129)5.2 b2Contact (131)GetFixtureA()和GetFixtureB() (132)GetManiFold() (133)GetWorldManifold() (135)isTouching() (137)SetEnabled()和IsEnabled() (137)SetSensor()和IsSensor() (139)SetFriction() (139)SetRestitution() (140)SetTangentSpeed() (141)5.3 b2ContactListener碰撞侦听器 (142)5.4 游戏中的碰撞处理 (146)万有引力 (147)小鸟冲量 (151)单边平台 (156)碰撞粘贴 (166)5.5 小结 (174)6.关节 (176)6.1 认识Box2D关节 (177)6.2 b2MouseJoint鼠标关节 (181)6.3 b2PrismaticJoint位移关节 (187)6.4 b2LineJoint线段关节 (193)6.5 b2RevoluteJoint旋转关节 (194)6.6 b2DistanceJoint距离关节 (200)6.7 b2WeldJoint粘贴关节 (204)6.8 b2PulleyJoint滑轮关节 (206)6.9 b2FrictionJoint 摩擦关节 (211)6.10 b2GearJoint 齿轮关节 (214)6.11 b2WheelJoint中轴关节 (218)6.12 b2RopeJoint绳索关节 (224)6.13 b2MotorJoint马达关节 (229)6.14 综合示例 (232)6.15 小结 (235)7.Box2D工具 (237)7.1 PhysicsEditor (237)7.2 RUBE (249)7.3 b2Separator (261)7.4 小结 (264)8. 游戏中的Box2D应用 (266)8.1 柔体 (266)相关知识点 (266)简单的柔体 (266)柔体库LiquidFun (270)8.2 浮力 (272)相关知识点 (273)水的浮力 (273)水的阻力 (280)8.3 刚体切割 (284)相关知识点 (285)切割的实现 (285)8.4 关节碰撞 (292)相关知识点 (293)关节的碰撞与折弯 (293)回摆的处理 (298)游戏交互 (309)完美的绳索 (313)8.5 小结 (314)附录:向量运算 (316)A.1 Box2D中的向量 (316)A.2 AddVV (316)A.3 SubtractVV (317)A.4 Normalize (317)A.5 NegativeSelf (318)A.6 Distance (318)A.7 Mul (319)MulFV (319)MulQV (319)MulMV (320)MulX (321)A.8 Cross (322)CrossVV (322)CrossFV (323)CrossVF (323)A.9 Dot (324)从起初开始执笔写这本书,到最终稿件的完成,中间经过了一年多的时间,在这段时间里,很多人都从不同的方面帮助着我,支持着我把这本书写完,我想我应该在本书开始之前,由衷的对这些帮助过我的人表示感谢。
Cocos2d-x⼊门教程(详细的实例和讲解)智能终端上的游戏⽬前风头正劲,试问哪个智能⼿机上没有⼏款企鹅公司出品的游戏呢!之前从未涉猎过游戏开发,但知道游戏开发前要挑选⼀款合适的游戏引擎,⾃⼰从头开始敲代码的时代已经out了。
在寻觅游戏引擎之前,我需要回答三道摆在我⾯前的选择题:1、2D引擎还是3D引擎?2、平台专⽤引擎还是跨平台引擎?3、收费引擎还是开源引擎?作为⼊门级选⼿,2D游戏显然更适合上⼿⼀些,另外适合果果这个年龄段的幼教类的游戏也多以2D游戏居多。
3D游戏本⾝也太难了,不仅要 Programming能⼒,还要3D建模能⼒,这些学习起来周期就太长了;⼀直是Ubuntu Fans,⼿头没有Mac Book,这样开发iOS程序变成⼀件糟⼼的事,在Ubuntu下搭建iOS App开发环境繁杂的很,即便是虚拟机也懒得尝试。
但从游戏体验来看,还是在iPad上玩更好⼀些,因此最好引擎能跨平台,以便后续迁移到iOS上;开源和⽤开源惯了,收费的引擎⽬前不在考虑范围之内。
综上,我要寻找的是⼀款开源的、跨平台的Mobile 2D Game Engine。
于是我找到了Cocos2d-x!Cocos2d-x是Cocos2d-iphone的C++跨平台分⽀,由于是国⼈创⽴的,在国内有着较⼤的⽤户群,引擎资料也较多,社区⼗分活跃。
国内已经出版了多本有关Cocos2d-x的中⽂书籍,⽐如《Cocos2d-x⾼级开发教程:制作⾃⼰的 “捕鱼达⼈”》、《Cocos2d-x权威指南》等都还不错。
更重要的是Cocos2d-x⾃带了丰富的例⼦,供初学者“临摹学习”,其中cocos2d-x-2.2.2/samples/Cpp /TestCpp这个例⼦⼏乎涵盖了该引擎的绝⼤多数功能。
下⾯就开启Cocos2d-x的⼊门之旅(For Android)。
试验环境:复制代码代码如下:Ubuntu 12.04.1 x86_64gcc 4.6.3javac 1.7.0_21java "1.7.0_21" HotSpot 64-bit Server VMadt-bundle-linux-x86_64-20131030.zipandroid-ndk-r9d-linux-x86_64.tar.bz2Cocos2d-x官⽹⽬前提供2.2.2稳定版以及3.0beta2版的下载(当然你也可以下载到更⽼的版本)。
box2d dynamic_tree基础用法Box2D的dynamic_tree是一个用于组织并加速碰撞检测和查询的数据结构。
它通常用于碰撞检测系统,以提高效率和性能。
dynamic_tree基本用法:1.创建dynamic_tree对象:使用b2DynamicTree类的构造函数创建一个dynamic_tree对象。
2.插入对象:使用Insert函数将对象添加到dynamic_tree中。
每个对象需要指定纹理区域的aabb包围盒,通常使用b2AABB类表示。
3.移除对象:使用Remove函数从dynamic_tree中移除对象。
4.更新对象:如果对象的aabb包围盒发生变化,需要使用Move函数更新dynamic_tree中的对象位置。
5.查询对象:使用Query函数可以根据一个aabb包围盒,获得与其相交的其他对象。
6.碰撞检测:使用RayCast函数可以进行光线投射,用于检测光线与dynamic_tree中的对象是否相交。
拓展:1.动态树优化:在多次插入和移除对象之后,dynamic_tree的平衡性可能会受到影响,导致性能下降。
可以使用Rebalance函数使dynamic_tree重新平衡。
2.碰撞回调:可以为dynamic_tree设置回调函数,在对象之间发生碰撞时触发相应的操作,例如处理碰撞效果或更新游戏状态等。
3.空间分区:可以使用dynamic_tree将对象分为多个区域,以便更有效地进行碰撞检测。
例如,将空间划分为四叉树或网格,然后使用dynamic_tree对每个区域进行管理。
4.广义碰撞检测:除了简单的相交检测,dynamic_tree还支持树与树之间的相交检测,即检测两个dynamic_tree之间对象的相交情况,可以用于更复杂的碰撞检测需求。
总之,dynamic_tree是一个用于组织并加速碰撞检测和查询的数据结构,可以根据需要插入、移除和查询对象,以及检测光线与对象的碰撞。
目录COCOS2d-X教程 (1)第一章环境 (1)(一)vs环境搭建 (1)(二):如何添加新项目 (2)第二章cocos2d-x的特性 (5)第三章制基本图元 (7)(一)、基本图形绘制 (7)第三部分:绘制图片 (11)第七章在cocos2d-x中使用RTTI (21)第八章动作 (22)第一部分:动作概述 (22)第三部分:CCCallFunc家族(回调函数包装器) (23)COCOS2d-X教程第一章环境(一)vs环境搭建1.安装visual studio2008据说vs2008是cocos2d-x运行最稳定的版本。
官方下载地址:/downloads/info.aspx?na=41&SrcFamilyId=83C3A1EC-ED72-4A79-896 1-25635DB0192B&SrcDisplayLang=zh-cn&u=http%3a%2f%%2fdownlo ad%2fe%2f7%2f7%2fe777851c-c1a4-4979-86b3-6886953b32e9%2fVS2008ProEdition90DayTrialC HSX1435983.isovisual assist x自备,vs序列号自备。
2.安装cocos2d-x引擎/wiki_extensions/forward_wiki_page/cocos2d-x?menu_id=1从网站上下载cocos2d-x,并解压到自定义的路径下3.测试helloworld我们使用windows版的helloworld,打开cocos2d-x引擎安装目录下的cocos2d-win32.vc2008.sln将helloworld设为启动项目| 生成->调试->启动新实例,如图所示:(二):如何添加新项目1 安装应用程序向导运行 install-templates-msvc.bat,cocos2d-x 应用程序向导就会自动安装到VS环境下2 建立新项目右键单击解决方案->添加->新项目->cocos2d-x-win32 application注意:目录层级关系,缺省情况下,应该设置在cocos2d-x引擎安装的目录下,否则在编译链接时可能会找不到文件然后,按照之前的步骤编译运行即可,运行效果同上一部分的图第二章cocos2d-x的特性由于cocos2d-x是cocos2d-iphone的c++移植版本。
【Cocos2d⼊门教程⼆】Cocos2d-x基础篇上⼀章已经学习了环境的搭建。
这⼀章对基础概念进⾏掌握。
内容⼤概有:1.导演2.场景3.节点4.层4.精灵1.导演(Director)导演存在的主要作⽤:a.环境设定(帧率初始化openGl和渲染器)b.场景管理c.执⾏主循环游戏就是个死循环不断不断的渲染就跟视频没两样⼀帧⼀帧的绘制出来话说提⼀下⼀帧为1/60秒也就是说cocos2d⾥⼀秒渲染60次导演的管理: 计时器事件管理器动作管理器导演继承于REF 本质上就是⼀个单例类获得导演类Director实例语句1 auto director = Director :: getInstance();1//调⽤第⼀个场景,当前不能有场景运⾏2void runWithScene(CCScene *pScene);34//场景⼊栈,当前必须有场景5void pushScene(CCScene *pScene);67//场景出栈,删除当前场景,当前必须有场景8void popScene(void);910//弹出所有场景,直⾄根场景11void popToRootScene(void);1213//弹出⾄指定场景14void popToSceneStackLevel(int level);1516//⽤新场景替代旧场景17void replaceScene(CCScene *pScene);1819//结束运⾏,释放场景,必须⼿动调⽤20void end(void);2122//暂停场景23void pause(void);2.场景(Scene)Scene场景也是cocos2dx中必不可少的元素,游戏中通常我们需要构建不同的场景(⾄少⼀个),游戏⾥关卡、版块的切换也就是⼀个⼀个场景的切换,就像在电影中变换舞台和场地⼀样。
场景的⼀个重要的作⽤就是流程控制的作⽤,我们可以通过Director的⼀系列⽅法控制游戏中不同的场景的⾃由切换。
Box2D v2.0.1 用户手册原文:Box2D v2.0.2 User Manual译者:Aman JIANG(江超宇),翻译信息。
1. 导言1.1 关于Box2D 是一个用于游戏的 2D 刚体仿真库。
程序员可以在他们的游戏里使用它,它可以使物体的运动更加可信,让世界看起来更具交互性。
从游戏的视角来看,物理引擎就是一个程序性动画(procedural animation)的系统,而不是由动画师去移动你的物体。
你可以让牛顿来做导演。
Box2D 是用可移植的 C++ 来写成的。
引擎中定义的大部分类型都有 b2 前缀,希望这能消除它和你游戏引擎之间的名字冲突。
1.2 必备条件在此,我假定你已经熟悉了基本的物理学概念,例如质量,力,扭矩和冲量。
如果没有,请先考虑读一下 Chris Hecker 和 David Baraff (google 这些名字)的那些教程,你不需要了解得非常细致,但他们可以使你很好地了解一些基本概念,以便你使用 Box2D。
Wikipedia 也是一个极好的物理和数学知识的获取源,在某些方面它可能比 google 更有用,因为它的内容经过了精心的整理。
这不是必要的,但如果你好奇 Box2D 内部是如何工作的,你可以看 这些文档。
因为 Box2D 是使用 C++ 写成的,所以你应该具备 C++ 程序设计的经验,Box2D 不应该成为你的第一个 C++ 程序项目。
你应该已经能熟练地编译,链接和调试了。
1.3 核心概念Box2D 中有一些基本的对象,这里我们先做一个简要的定义,在随后的文档里会有更详细的描述。
刚体(rigid body)一块十分坚硬的物质,它上面的任何两点之间的距离都是完全不变的。
它们就像钻石那样坚硬。
在后面的讨论中,我们用物体(body)来代替刚体。
形状(shape)一块严格依附于物体(body)的 2D 碰撞几何结构(collision geometry)。
形状具有摩擦(friction)和恢复(restitution)的材料性质。
约束(constraint)一个约束(constraint)就是消除物体自由度的物理连接。
在 2D 中,一个物体有 3 个自由度。
如果我们把一个物体钉在墙上(像摆锤那样),那我们就把它约束到了墙上。
这样,此物体就只能绕着这个钉子旋转,所以这个约束消除了它 2 个自由度。
接触约束(contact constraint)一个防止刚体穿透,以及用于模拟摩擦(friction)和恢复(restitution)的特殊约束。
你永远都不必创建一个接触约束,它们会自动被 Box2D 创建。
关节(j oint)它是一种用于把两个或多个物体固定到一起的约束。
Box2D 支持的关节类型有:旋转,棱柱,距离等等。
关节可以支持限制(limits)和马达(motors)。
关节限制(j oint limit)一个关节限制(j oint limit)限定了一个关节的运动范围。
例如人类的胳膊肘只能做某一范围角度的运动。
关节马达(j oint motor)一个关节马达能依照关节的自由度来驱动所连接的物体。
例如,你可以使用一个马达来驱动一个肘的旋转。
世界(w orld)一个物理世界就是物体,形状和约束相互作用的集合。
Box2D 支持创建多个世界,但这通常是不必要的。
2. Hello Box2D2.1 创建一个世界每个 Box2D 程序都将从一个世界对象(w orld ob j ect)的创建开始。
这是一个管理内存,对象和模拟的中心。
要创建一个世界对象,我们首先需要定义一个世界的包围盒。
Box2D 使用包围盒来加速碰撞检测。
尺寸并不关键,但合适的尺寸有助于性能。
这个包围盒过大总比过小好。
•注意:w orldAABB 应该永远比物体所在的区域要大,让 w orldAABB 更大总比太小要好。
如果一个物体到达了 w orldAABB 的边界,它就会被冻结并停止模拟。
接下来我们定义重力矢量。
是的,你可以使重力朝向侧面(或者你只好转动你的显示器)。
并且,我们告诉世界(w orld)当物体停止移动时允许物体休眠。
一个休眠中的物体不需要任何模拟。
现在我们创建世界对象。
通常你需要在堆(heap)上创建世界对象,并把它的指针保存在某一结构中。
然而,在这个例子中也可以在栈上创建。
那么现在我们有了自己的物理世界,让我们再加些东西进去。
2.2 创建一个地面盒物体通常由以下步骤来创建:1.使用位置(position),阻尼(damping)等定义一个物体2.使用世界对象创建物体3.使用几何结构,摩擦,密度等定义形状4.在物体上创建形状5.可选地调整物体的质量以和附加的形状相匹配第一步,我们创建地面体。
要创建它我们需要一个物体定义(body definition),通过物体定义我们来指定地面体的初始位置。
第二步,将物体定义传给世界对象来创建地面体。
世界对象并不保存到物体定义的引用。
地面体是作为静态物体(static body)创建的,静态物体之间并没有碰撞,它们是固定的。
当一个物体具有零质量的时候 Box2D 就会确定它为静态物体,物体的默认质量是零,所以它们默认就是静态的。
第三步,我们创建一个地面的多边形定义。
我们使用 S etAsBox 简捷地把地面多边形规定为一个盒子(矩形)形状,盒子的中点就位于父物体的原点上。
其中,S etAsBox 函数接收了半个宽度和半个高度,这样的话,地面盒就是 100 个单位宽(x 轴)以及20 个单位高(y 轴)。
Box2D 已被调谐使用米,千克和秒来作单位,所以你可以用米来考虑长度。
然而,改变单位系统是可能的,随后的文档中会有讨论。
在第四步中,我们在地面体上创建地面多边形,以完成地面体。
重申一次,Box2D 并不保存到形状或物体的引用。
它把数据拷贝到 b2Body 结构中。
注意每个形状都必须有一个父物体,即使形状是静态的。
然而你可以把所有静态形状都依附于单个静态物体之上。
这个静态物体之需求是为了保证 Box2D 内部的代码更具一致性,以减少潜在的 bug 数量。
可能你已经注意到了,大部分 Box2D 类型都有一个 b2 前缀。
这是为了降低它和你的代码之间名字冲突的机会。
2.3 创建一个动态物体现在我们已经有了一个地面体,我们可以使用同样的方法来创建一个动态物体。
除了尺寸之外的主要区别是,我们必须为动态物体设置质量性质。
首先我们用 CreateBody 创建物体。
接下来我们创建并添加一个多边形形状到物体上。
注意我们把密度设置为 1,默认的密度是 0。
并且,形状的摩擦设置到了 0.3。
形状添加好以后,我们就使用 S etMass F rom S hapes 方法来命令物体通过形状去计算其自身的质量。
这暗示了你可以给单个物体添加一个以上的形状。
如果质量计算结果为 0,那么物体会变成真正的静态。
物体默认的质量就是零,这就是为什么我们无需为地面体调用S etMass F rom S hapes 的原因。
这就是初始化过程。
现在我们已经准备好开始模拟了。
2.4 模拟(Box2D 的)世界我们已经初始化好了地面盒和一个动态盒。
现在是让牛顿接手的时刻了。
我们只有少数几个问题需要考虑。
Box2D 中有一些数学代码构成的积分器(integrator),积分器在离散的时间点上模拟物理方程,它将与游戏动画循环一同运行。
所以我们需要为 Box2D 选取一个时间步,通常来说游戏物理引擎需要至少60H z 的速度,也就是 1/60 的时间步。
你可以使用更大的时间步,但是你必须更加小心地为你的世界调整定义。
我们也不喜欢时间步变化得太大,所以不要把时间步关联到帧频(除非你真的必须这样做)。
直截了当地,这个就是时间步:除了积分器之外,Box2D 中还有约束求解器(constraint solver)。
约束求解器用于解决模拟中的所有约束,一次一个。
单个的约束会被完美的求解,然而当我们求解一个约束的时候,我们就会稍微耽误另一个。
要得到良好的解,我们需要迭代所有约束多次。
建议的 Box2D 迭代次数是 10 次。
你可以按自己的喜好去调整这个数,但要记得它是速度与质量之间的平衡。
更少的迭代会增加性能并降低精度,同样地,更多的迭代会减少性能但提高模拟质量。
这是我们选择的迭代次数:注意时间步和迭代数是完全无关的。
一个迭代并不是一个子步。
一次迭代就是在时间步之中的单次遍历所有约束,你可以在单个时间步内多次遍历约束。
现在我们可以开始模拟循环了,在游戏中模拟循环应该并入游戏循环。
每次循环你都应该调用b2World::S tep,通常调用一次就够了,这取决于帧频以及物理时间步。
这个 Hello World 程序设计得非常简单,所以它没有图形输出。
胜于完全没有输出,代码会打印出动态物体的位置以及旋转角度。
Y ay!这就是模拟1秒钟内 60 个时间步的循环:2.5 清理工作当一个世界对象超出它的作用域,或通过指针将其 delete 时,所有物体和关节的内存都会被释放。
这能使你的生活变得更简单。
然而,你应该将物体,形状或关节的指针都清零,因为它们已经无效了。
2.6 关于 Testbed一旦你征服了 HelloWorld 例子,你应该开始看 Box2D 的 testbed 了。
testbed 是一个单元测试框架以及演示环境,这是一些它的特点:•可移动和缩放的摄像机•鼠标拣选动态物体的形状•可扩展的测试集•通过图形界面选择测试,调整参数,以及设置调试绘图•暂停和单步模拟•文字渲染在 testbed 中有许多 Box2D 的测试用例,以及框架本身的实例。
我鼓励你通过研究和修改它来学习Box2D。
注意:testbed 是使用 freeglut 和 G L UI 写成的,testbed 本身并不是 Box2D 库的一部分。
Box2D 本身对于渲染是无知的,就像 HelloWorld 例子一样,使用 Box2D 并不一定需要渲染。
3. API 设计3.1 内存管理Box2D 的许多设计决策都是为了能快速有效地使用内存。
在本节我将论述 Box2D 如何和为什么要分配内存。
Box2D 倾向于分配大量的小对象(50-300 字节左右)。
这样通过 malloc 或 ne w 在系统的堆(heap)上分配内存就太低效,并且容易产生内存碎片。
多数这些小型对象的生命期都很短暂,例如触点(contact),可能会维持几个时间步。
所以我们需要为这些对象提供一个有效的分配器(allocator)。
Box2D 的解决方案是使用小型对象分配器(S O A),S O A 维护了许多不定尺寸的可生长的池(gro w able pool)。
当有内存分配请求时,S O A 会返回一块最匹配的内存。
当内存块释放掉以后,它会回到池中。