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

时间:2017-07-15 02:54:34

标签: c++ runtime-error box2d game-physics assert

我在C ++程序中运行Box2D模拟,当此错误中止程序时:

a.out: ./Box2D/Dynamics/Contacts/b2ContactSolver.cpp:96: b2ContactSolver::b2ContactSolver(b2Contact**, int32, b2StackAllocator*, float32): Assertion `kNormal > 1.19209289550781250000e-7F' failed.
  • 此断言失败表示什么?
  • 可能是什么造成的?
  • 我可以通过哪些方式修复它?

我没有任何可能涉及该问题的进一步背景。

1 个答案:

答案 0 :(得分:1)

断言至少意味着三件事:

一个:您正在运行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; 

三:身体A和身体B的反向质量总和及其有效的基于逆旋转的质量,不大于b2_epsilon这个版本的Box2D {{} 1}}设置为b2_epsilonFLT_EPSILON)。

这可能由于各种原因而发生,例如两个物体都具有零反质量。例如,如果b2Settings.h的任何组件值为kNormal,我相信大于检查也会失败。 NaN小于零当然也会导致此检查失败。

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

  1. 您可以查看使用Box2D的源代码,看看您的身体是否存在无效质量,无效的反质量,无效的转动惯量或无效的反转惯性。
  2. 您可以升级到更新版本的Box2D并查看问题是否消失。
  3. 您可以使用Box2D的非调试版本,看看是否有零除错。