Box2D基础
书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目录
5.3 Box2D基础
先概述一下Box2D的使用流程
5.3.0、实现流程对比
1、前4章中每个程序
- SETUP
1.创建模拟世界中的所有对象。 - DRAW
1.计算所有力向量。
2.将所有力作用在对象上(F = M * A)。
3.根据加速度更新所有对象的位置。
4.绘制所有对象。
2、Box2D程序的实现流程
- SETUP
1.创建模拟世界中的所有对象。 - DRAW
1.绘制所有对象
3、Box2D的神奇
这就是Box2D的神奇之处。我们摆脱了所有痛苦的计算步骤,不需要根据速度和加速度计算对象的移动,Box2D会替我们接管这些计算任务。
Box2D就像一个魔术盒,替我们完成了整个模拟流程,这真是一个令人欣慰的消息!
- 在setup()函数中,
我们告诉Box2D:“我的模拟世界中需要这些物体。” - 在draw()函数中,
我们只需要向Box2D询问:“我想绘制模拟世界中的这些物体,你能否告诉我它们在什么位置?”
4、Box2D的准备
还有一个坏消息:情况并不像上面描述的那样简单。
- 首先,我们在Box2D的世界中创建物体之前,要先读一遍文档,学会如何创建和配置不同形状的对象。
- 其次,我们不能把任何与像素相关的东西告诉Box2D,因为它根本无法理解像素。
- 在告诉Box2D怎样创建模拟物体之前,我们必须先将像素单位转换为Box2D“世界”的单位。
- 同理,绘制物体之前还要做一次相反的转换,Box2D只会告诉我们它的世界中的位置,我们应该将这个位置翻译成像素世界中的位置。
5.3.1 SETUP
- 1.创建像素世界中的所有对象。
- 2.将像素世界转换为Box2D的模拟世界。
5.3.2 DRAW
- 1.向Box2D询问各个对象的位置。
- 2.将Box2D的返回值转化为像素世界的位置。
- 3.绘制所有对象。
现在我们知道Processing Sketch中的所有物体都要被放到Box2D的世界中,下面来看看Box2D世界由哪些元素组成。
5.3.3 Box2D世界的核心元素
- 1.世界(world)
管理整个物理模拟过程,它知道坐标空间的所有信息,存放了世界
中的所有物体。 - 2.物体(body)
Box2D世界的基础元素,有自己的位置和速度。
是否感到似曾相识?在前面力和向量的模拟程序中,我们开发了很多类,Box2D的物体就等同于这些类。 - 3.形状(shape)
记录所有与碰撞相关的几何信息。 - 4.夹具(fixture)
将形状赋给物体,设置物体的一些属性,比如密度、摩擦系数、复原性。 - 5.关节(joint)
充当两个物体之间的连接器(或者物体和世界之间的连接器)。 - 6.Vec2
描述Box2D世界中的向量。
5.3.4 Vec2
在这里,我们必须了解一些关于物理库的事实。任何物理模拟都要涉及向量的概念。
这是件好事,因为在前面几章,我们一直在学习如何用向量描述运动和力的作用,所以并不需要在本章学习任何新的向量概念。
但有个坏消息:Box2D没有PVector类。虽然rocessing为我们提供了PVector类,但任何物理库都有它自己的向量实现。这是合情合理的,因为物理库怎么会知道PVector类的任何信息?一般情况下,为了兼容其他代码,物理库会按自己的需求实现一个向量类。虽然我们不需要接触任何新的概念,但还是要学习新的命名规则和语法。
参照PVector类,下面列出了Vec2的基础用法。
-
假如我们要将两个向量相加。
PVector a = new PVector(1,-1); PVector b = new PVector(3,4); PVector c =PVector.add(a,b);
Vec2 a = new Vec2(1,-1); Vec2 b = new Vec2(3,4); Vec2 c = a.add(b); -
将向量乘以标量,改变它的长度。
PVector a = new PVector(1,-1); float n = 5; PVector c = PVector.mult(a,n);
Vec2 a = new Vec2(1,-1); float n = 5; Vec2 c = a.mul(n); -
获取它的长度,将向量单位化。
PVector a = new PVector(1,-1);float m = a.mag();a.normalize();
Vec2 a = new Vec2(1,-1);float m = a.length();a.normalize();
从以上几个表中可以看出,PVector和Vec2涉及的基本概念是一样的,但函数名和参数却有细微差异。
比如,Vec2没有用静态和非静态函数区分两种不同用途的add()函数和mult()函数,如果Vec2对象在调用过程中被修改,那么函数名将包含“Local”——addLocal()、multLocal()。
如果你想知道Vec2的更多信息,请查看它的文档,文档放在JBox2D的源代码中
(http://code.google.com/p/jbox2d/)。