书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目录
5.4 生活在Box2D的世界
1、World对象
Box2D中World对象掌管着所有事物:它管理着模拟世界的坐标空间和所有物体,还能决定时间的推进。
- 为了在Processing Sketch中使用Box2D,World对象应该是第一个被初始化的,因为它在程序中引入了Box2D,代表着整个模拟世界。
PBox2D box2d;
void setup() {
box2d = new PBox2D(this);
box2d.createWorld(); 用默认设置初始化Box2D世界
}
- createWorld()函数被调用后,
PBox2D会为你设置一个默认的重力(方向向下),
你也可以通过以下方式更改重力:
box2d.setGravity(0, -10);
值得一提的是:重力不一定是固定的,方向也不一定向下;你可以在程序运行过程中调整重力向量,还可以取消重力,只需要将重力向量设为(0,0)即可。
2、坐标系统
上面程序中的数字0和-10又代表什么?
它在提醒我们:Box2D的坐标系统并不是之前的像素坐标系统!
让我们来看看Box2D和Processing窗口的坐标系统有什么不同。
- 从上图可以看出,在Box2D中,(0,0)坐标位于正中间,y轴的正方向垂直向上。Box2D的坐标系统和笛卡儿坐标系一样。
- 但Processing使用的是传统的计算机图形坐标系,在这种坐标系中,(0,0)坐标位于左上方,y轴的正方向向下。
因此,如果要在Box2D中模拟物体受重力作用下落,我们必须用一个负的y坐标初始化重力向量。
Vec2 gravity = new Vec2(0, -10);
3、转换
幸运的是,如果我们更倾向于用图形学的坐标系思考问题(作为Processing程序员,我们更喜欢这么做),那也没问题,因为PBox2D专门提供了一系列辅助函数用于实现像素空间和Box2D空间的相互转换。
在学习下一节内容之前,让我们先看看这些辅助函数的调用方法。
4、 从“像素”转换为Box2D
- 假如我们想告诉Box2D当前鼠标光标所在的位置,在Processing中鼠标光标所在的坐标是(mouse,mouseY)。
- 我们需要将这个“坐标”(coordinate)从“像素”(pixel)坐标空间转换为Box2D“世界”(world)的坐标空间
——也就是调用coordPixelsToWorld()函数。 - 用代码表示为:
Vec2 mouseWorld = box2d.coordPixelsToWorld(mouseX,mouseY);
将mouseX、mouseY转化成Box2D
5、 从Box2D转换为像素
- 如果我们要将一个Box2D坐标转换为像素空间的坐标,又该怎么做?
Vec2 worldPos = new Vec2(-10, 25); 为了演示,我们编造一个Box2D坐标
Vec2 pixelPos = box2d.coordWorldToPixels(worldPos);
将Box2D坐标转化为像素空间坐标,这一步ellipse(pixelPos.x, pixelPos.y, 16, 16);
6、PBox2D转换函数
PBox2D提供了一系列函数用于两个坐标系的互相转换。通过实践能更好地学习这些函数,但我们可以先看看到底有哪些函数。
除了以上函数,还有其他辅助函数能自动转换PVector对象。
世界被初始化后,我们就准备把Box2D的各种物体放入其中。