Box2D断言失败:kNormal>;1.19209289550781250000e-7F 我在一个C++程序中运行了一个Box 2D仿真,当这个错误中止了程序: a.out: ./Box2D/Dynamics/Contacts/b2ContactSolver.cpp:96: b2ContactSolver::b2ContactSolver(b2Contact**, int32, b2StackAllocator*, float32): Assertion `kNormal > 1.19209289550781250000e-7F' failed. 这个断言失败表示什么 是什么引起的 我可以用什么方法修复它

Box2D断言失败:kNormal>;1.19209289550781250000e-7F 我在一个C++程序中运行了一个Box 2D仿真,当这个错误中止了程序: a.out: ./Box2D/Dynamics/Contacts/b2ContactSolver.cpp:96: b2ContactSolver::b2ContactSolver(b2Contact**, int32, b2StackAllocator*, float32): Assertion `kNormal > 1.19209289550781250000e-7F' failed. 这个断言失败表示什么 是什么引起的 我可以用什么方法修复它,c++,runtime-error,box2d,game-physics,assert,C++,Runtime Error,Box2d,Game Physics,Assert,我没有任何与该问题相关的进一步上下文。断言至少意味着三件事: One:您正在运行Box2D的调试版本 2:您运行的是比Erin的GitHub repo托管的源代码更旧的Box2D版本 在四处搜索之后,Erin发布的包含此断言的最新源代码似乎是。此zip文件的上载日期为2010年4月17日 您正在运行的旧版Box2D版本2.1.2中的b2ContactSolver.cpp的源代码显示了第96行中围绕断言的以下相关代码: float32 kNormal = bodyA->m_invMass +

我没有任何与该问题相关的进一步上下文。

断言至少意味着三件事:

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

2:您运行的是比Erin的GitHub repo托管的源代码更旧的Box2D版本

在四处搜索之后,Erin发布的包含此断言的最新源代码似乎是。此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_ε
,其中在本版本的Box2D
b2_ε
中设置为
FLT_ε
(在
b2Settings.h

这可能是由于各种原因造成的,比如两个物体的质量都为零。例如,如果
kNormal
的任何组件值为
NaN
,我相信大于检查也会失败
kNormal
小于零当然也会导致该检查失败


至于你能做些什么来进一步评估和解决问题,这里有一些想法浮现在你的脑海中

  • 您可以查看使用Box2D的源代码,看看您的身体是否存在无效质量、无效反向质量、无效旋转惯量或无效反向旋转惯量
  • 您可以升级到更新版本的Box2D,看看问题是否消失
  • 您可以使用Box2D的非调试构建,并查看是否出现被零除的错误

  • 您是否创建了很多固定器和/或关节?这些线程是旧的,但两者(第一个链接有到第二个帖子的链接)似乎都遇到了错误,分辨率(在第二个帖子中,box2d的创建者在末尾的评论)通常与身体的质量有关-被操纵为负值或接近于0,您使用的是什么版本/版本的box2d?我没有在最近提交的
    b2ContactSolver.cpp
    文件的第96行附近找到任何断言。感谢您的全面回答!我已经解决了另一个不相关的问题,所以我现在没事了。但这个答案可能对未来的人们有所帮助。