【问题标题】:Box2D assertion failed: kNormal > 1.19209289550781250000e-7F [closed]Box2D 断言失败:kNormal > 1.19209289550781250000e-7F [关闭]
【发布时间】:2017-07-15 02:54:34
【问题描述】:

我在 C++ 程序中运行 Box2D 模拟时,这个错误中止了程序:

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

我没有任何可能与该问题相关的进一步背景。

【问题讨论】:

  • 您是否正在创建大量的夹具和/或接头?这些线程很旧,但两者(第一个链接有一个指向第二个帖子的链接)似乎都遇到了错误,分辨率(在第二个帖子最后是 box2d cmets 的创建者)通常与物体的质量有关 -被操纵为负数或接近0,box2d.org/forum/viewtopic.php?t=5250
  • 您使用的是什么版本的 Box2D?我没有在b2ContactSolver.cpp 文件的任何最近提交的第 96 行附近找到任何断言。

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


【解决方案1】:

断言至少意味着三件事:

一:您正在运行 Box2D 的调试版本。

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

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

b2ContactSolver.cpp 的源代码来自您正在运行的旧 Box2D 版本 2.1.2,在第 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 中 b2_epsilon 是设置为FLT_EPSILON(在b2Settings.h)。

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


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

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

【讨论】:

  • 感谢您的全面回答!我实际上已经通过解决另一个不相关的问题解决了这个问题,所以我现在没事了。但这个答案可能对未来的人们有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2014-10-07
  • 2010-11-09
相关资源
最近更新 更多