参考:
官方Manual和对应翻译的中文手册(感谢译者)。
下面的所有内容基于版本Box2D_v2.2.0。
Hello Box2d
1. 说明:
首先要说明的是,Box2D源码中有一个HelloWorld的例子和一个Testbed的单元测试的例子。这两个都是很多的学习参考。首先,就是从HelloWorld的例子来理解Box2D。
另外,需要说明的是,渲染本身是不属于Box2D的一部分的,Testbed使用freeglut和GLUI库渲染部分。Box2D本身只是用于进行计算,用于模拟2D。
2. Box2D的单位
要使用Box2d,先得了解Box2d的单位。Box2D使用MKS(m/kg/s,米/千克/秒)作为单位,角度使用弧度。对于很多渲染引擎,单位一般是像素,而Box2D使用米,所以,在将box2D与其它库结合的时候,要注意单位的问题。对于OpenGL,可以使用视口变换将Box2D的world变换到窗口中。尽量在游戏中使用MKS作为单位,只有在渲染的时候进行适当比例的转换为像素,从而使得游戏逻辑清晰。
关于坐标轴,发现好像没有哪里提到Box2D的坐标轴是怎么样的?可能这个不重要,搜了一下也没有发现来说明这个问题的。无论如下,下面将假设坐标轴为:向右是x方向,向上是y方向。
2. 关于包围盒
旧的版本的文档一般会提到“要创建一个世界对象,首先需要定义一个世界的包围盒。Box2D 使用包围盒来加速碰撞检测。尺寸并不关键,但合适的尺寸有助于性能。这个包围盒过大总比过小好。当一个物体达到了包围盒的边界时,它就会被冻结并停止模拟。"。在新的Box2D中,创建世界对象并不需要以包围盒作为参数,不过相信这里关于包围盒的描述含义等在新版本中也都是有的,无论如何,包围盒在新版本的box2d中仍然存在,在后面如果有机会再去研究其使用。无论如何,下面仍然是创建一个包围盒的方法:
3. 创建世界
每个 Box2D 程序都将从一个世界对象(world object)的创建开始。这是一个管理内存,对象和模拟的
中心。b2World的构造函数为:b2World(const b2Vec2& gravity, bool doSleep);
所以,首先需要定义重力矢量和是否休眠。重力矢量,很显然是重力的方向。在上面的坐标轴的假设下,那么假设重力矢量为(0.0f, -10.0f),那么表示重力是沿着y轴负方向的,即向下。是否休眠用于告诉世界(world)当物体停止移动时允许物体休眠,一个休眠中的物体不需要任何模拟。下面是创建世界的代码:
官方Manual和对应翻译的中文手册(感谢译者)。
下面的所有内容基于版本Box2D_v2.2.0。
Hello Box2d
1. 说明:
首先要说明的是,Box2D源码中有一个HelloWorld的例子和一个Testbed的单元测试的例子。这两个都是很多的学习参考。首先,就是从HelloWorld的例子来理解Box2D。
另外,需要说明的是,渲染本身是不属于Box2D的一部分的,Testbed使用freeglut和GLUI库渲染部分。Box2D本身只是用于进行计算,用于模拟2D。
2. Box2D的单位
要使用Box2d,先得了解Box2d的单位。Box2D使用MKS(m/kg/s,米/千克/秒)作为单位,角度使用弧度。对于很多渲染引擎,单位一般是像素,而Box2D使用米,所以,在将box2D与其它库结合的时候,要注意单位的问题。对于OpenGL,可以使用视口变换将Box2D的world变换到窗口中。尽量在游戏中使用MKS作为单位,只有在渲染的时候进行适当比例的转换为像素,从而使得游戏逻辑清晰。
关于坐标轴,发现好像没有哪里提到Box2D的坐标轴是怎么样的?可能这个不重要,搜了一下也没有发现来说明这个问题的。无论如下,下面将假设坐标轴为:向右是x方向,向上是y方向。
2. 关于包围盒
旧的版本的文档一般会提到“要创建一个世界对象,首先需要定义一个世界的包围盒。Box2D 使用包围盒来加速碰撞检测。尺寸并不关键,但合适的尺寸有助于性能。这个包围盒过大总比过小好。当一个物体达到了包围盒的边界时,它就会被冻结并停止模拟。"。在新的Box2D中,创建世界对象并不需要以包围盒作为参数,不过相信这里关于包围盒的描述含义等在新版本中也都是有的,无论如何,包围盒在新版本的box2d中仍然存在,在后面如果有机会再去研究其使用。无论如何,下面仍然是创建一个包围盒的方法:
b2AABB worldAABB;
worldAABB.lowerBound.Set(-100.0f, -100.0f);
worldAABB.upperBound.Set(100.0f, 100.0f);
包围盒b2AABB是一个结构体,但是提供了成员方法(相当于类了),其定义在文件b2Collision.h中。它只有两个成员,lowerBound和upperBound,都是b2Vec2类型。
3. 创建世界
每个 Box2D 程序都将从一个世界对象(world object)的创建开始。这是一个管理内存,对象和模拟的
中心。b2World的构造函数为:b2World(const b2Vec2& gravity, bool doSleep);
所以,首先需要定义重力矢量和是否休眠。重力矢量,很显然是重力的方向。在上面的坐标轴的假设下,那么假设重力矢量为(0.0f, -10.0f),那么表示重力是沿着y轴负方向的,即向下。是否休眠用于告诉世界(world)当物体停止移动时允许物体休眠,一个休眠中的物体不需要任何模拟。下面是创建世界的代码:
b2Vec2 gravity(0.0f, -10.0f);
bool doSle