常见问题解答
什么是Box2D?
Box2D是一个功能丰富的2D刚体物理引擎,由erincatto用C语言编写。它已经在许多游戏中使用,包括2008年独立游戏节大奖得主蜡笔物理豪华版。
Box2D使用麻省理工学院执照并可免费使用
Box2D支持哪些平台?
Box2D是在Windows上用visualc开发的。端口还可用于Flash、Java、C#、Python。
erincatto维护C版本,但不支持其他语言。其他语言得到了社区的支持,也可能得到了这些端口的作者的支持。
谁做的?
Erin Catto是Box2D背后的驱动力,其他各种支持端口。Box2D是一个开源项目,接受社区反馈。
我怎样才能得到帮助?
您应该先阅读文档和本常见问题解答的其余部分。另外,您应该研究源代码发行版中包含的示例。然后你可以参观 subreddit公司问剩下的问题
请不要下午或电子邮件艾琳卡特托支持。最好在论坛上提问,这样每个人都能从讨论中受益。
文档
为什么没有记录featurefoo?
如果您从git主分支获取最新代码,您可能会发现手册中没有记录的特性。新的功能在成熟后被添加到手册中,新的点发布即将到来。但是,添加到Box2D的所有主要特性都会在测试床中附带示例代码,以测试该特性并显示预期用途。
先决条件
编程
在使用Box2D之前,您应该具备C的工作知识。您应该了解类、继承和指针。网上有很多学习C语言的资源。您还应该了解您的开发环境:编译、链接和调试。
数学和物理
你应该对刚体、力、力矩和脉冲有基本的了解。如果你遇到一个你不懂的数学或物理概念,请在维基百科上阅读。访问此页码如果您想更深入地了解Box2D中使用的算法。
美国石油学会
Box2D使用什么单位?
Box2D调整为米-千克-秒(MKS)。你的移动物体应该在0.1-10米之间。不要使用像素作为单位!你将得到一个紧张的模拟。
如何将像素转换为米?
假设你有一个100x100像素的精灵。您决定使用比例因子0.01。这将使角色物理框为1m x 1m。所以去做一个1x1的物理盒子。现在假设角色从像素坐标(345679)开始。所以把物理盒子放在(3.45,6.79)的位置。现在模拟物理世界。假设角色物理框移动到(2.31,4.98),那么将角色精灵移动到像素坐标(231498)。现在唯一棘手的是选择一个比例因子。这取决于你的比赛。你应该试着让你的移动物体在0.1-10米的范围内,1米是最佳位置。
为什么不使用这个很棒的C特性呢?
Box2D被设计成可移植的,所以我尽量保持C语言的简单用法。另外,我不使用STL(除了sort)或其他库来保持低的依赖性。我保持低模板使用率和不使用名称空间。记住,仅仅因为C特性的存在,并不意味着您需要使用它。
Box2D到其他语言平台的许多端口表明,这种策略是成功的。
我可以在DLL中使用Box2D吗?
Box2D不是为在DLL中使用而设计的。静态数据可能要改变你的工作方式。
Box2D线程安全吗?
不,Box2D可能永远不会是线程安全的。Box2D有一个很大的API,试图使这样的API线程安全将对性能和复杂性产生很大的影响。
生成问题
为什么我的代码不能编译和/或链接?
构建失败的原因有很多。以下是一些:
- 将旧的Box2D标头与新代码一起使用
- 不将Box2D库与应用程序链接
- 使用不包含新源文件的旧项目文件
致使
Box2D的渲染功能是什么?
Box2D只是一个物理引擎。你怎么画东西取决于你自己。
但是试验台能画出东西
可视化对于调试碰撞和物理非常重要。我编写测试台是为了帮助我测试Box2D,并给出如何使用Box2D的示例。测试台不是Box2D库的一部分。
如何绘制形状?
不支持绘制形状,形状内部数据可能会更改。相反,您应该实现b2DebugDraw
接口
准确度
Box2D使用近似方法有几个原因。
- 性能
- 有些微分方程没有已知的解
- 某些约束不能唯一确定
这意味着约束不是完全刚性的,有时即使恢复为零,也会看到一些反弹。Box2D使用Gauss-Seidel近似求解约束。Box2D还使用半隐式Euler近似求解微分方程。Box2D也没有精确的碰撞。多边形被薄皮覆盖(大约0.5厘米厚),以避免数值问题。这有时会导致意外的接触法线。此外,一些形状可能开始重叠,然后被解算器推开。
制作游戏
蠕虫克隆
制作蠕虫克隆需要任意可破坏的地形。这超出了Box2D的范围,因此您必须自己找出如何做到这一点。
基于平铺的环境
在地形中使用许多长方体可能不会很好地工作,因为长方体形状的角色可能会在内角被绊住。Box2D的未来更新应该允许在边链上平滑运动。一般来说,您应该避免使用矩形字符,因为冲突容差仍然会导致不希望的障碍。
小行星型坐标系
Box2D不支持坐标框换行。为此,您可能需要自定义Box2D。您可能需要使用另一个广泛的阶段来实现这一点。
决定论
Box2D是确定性的吗?
对于相同的输入和相同的二进制,Box2D将再现任何模拟。Box2D不使用任何随机数,也不基于随机事件(如计时器等)进行任何计算。
然而,人们往往想要更严格的决定论。人们经常想知道Box2D是否可以在不同的二进制文件和不同的平台上产生相同的结果。答案是否定的。这个答案的原因与浮点数学在许多编译器和处理器中是如何实现的有关。如果你好奇的话,我建议你读这篇文章:http://www.yosefk.com/blog/consistency-how-to-detail-the-purpose-of-ieee-floating-point.html
但我真的想要决定论
这自然就引出了定点数学的问题。Box2D不支持定点数学。在过去,Box2D是以定点方式移植到NDS的,显然它工作正常。定点数学开发起来比较慢,也比较繁琐,所以我选择不使用定点来开发Box2D。
为什么恢复/摩擦混合不准确?
在实验中必须测量物理上正确的恢复值。但是一旦你改变了实验中的几何结构,那么这个值就错了。其次,添加同时碰撞会使答案变得更糟。我们以前也走过这条路。
因此,关于准确性的问题已经得到了回答:失败。
剩下的唯一问题是我们如何使之方便。在这一点上,意见可能各不相同。
b2Settings
就是这样。如果你知道你在做什么,你可以调整设置。
新用户最大的错误是什么?
- 使用像素表示长度而不是米。
- 期望Box2D提供像素完美的结果。
- 使用b2Polygon创建凹多边形。
- 在发布模式下测试他们的代码。
- 在使用Box2D之前没有学习C。
- 未阅读此常见问题解答。:)