Box2D 断言失败:kNormal > 1.19209289550781250000e-7F

Box2D assertion failed: kNormal > 1.19209289550781250000e-7F

我是运行 C++ 程序中的 Box2D 模拟,当这个错误中止程序时:

a.out: ./Box2D/Dynamics/Contacts/b2ContactSolver.cpp:96: b2ContactSolver::b2ContactSolver(b2Contact**, int32, b2StackAllocator*, float32): Assertion `kNormal > 1.19209289550781250000e-7F' failed.

我没有任何与此问题相关的进一步背景信息。

断言至少意味着三件事:

一个: 你是 运行 Box2D 的调试版本。

二:您 运行 Box2D 的版本比 Erin Box2D GitHub 存储库中托管的源代码旧。

经过四处搜索,Erin 发布的最新源代码中似乎有这个断言是Box2D_v2.1.2。此 zip 文件的上传日期是 2010 年 4 月 17 日。

您是 运行 的旧 Box2D 版本 2.1.2 中 b2ContactSolver.cpp 的源代码显示了以下围绕第 96 行断言的相关代码:

float32 kNormal = bodyA->m_invMass + bodyB->m_invMass + bodyA->m_invI * rnA + bodyB->m_invI * rnB;

b2Assert(kNormal > b2_epsilon);
ccp->normalMass = 1.0f / kNormal; 

三:bodyA和bodyB的反质量和它们的有效反rotational-based质量之和,不大于 b2_epsilon,在此版本的 Box2D 中 b2_epsilon 设置为 FLT_EPSILON(在 b2Settings.h 中)。

这可能由于多种原因而发生,例如两个物体都以某种方式具有零反质量。例如,如果 kNormal 的任何组件值是 NaN,我相信 greater-than 检查也会失败。 kNormal 小于零当然也会导致此检查失败。


至于您可以做些什么来进一步评估和解决问题,这里有一些想法...

  1. 您可以查看使用 Box2D 的源代码,看看您的身体是否存在无效质量、无效反质量、无效转动惯量或无效逆转动惯量。
  2. 您可以升级到较新版本的 Box2D,看看问题是否消失。
  3. 您可以使用 non-debug 构建的 Box2D 并查看是否得到除以零的错误。