Box2D个人学习笔记 - HelloWorld

参考:
官方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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值