我在C ++程序中运行Box2D模拟,当此错误中止程序时:
a.out: ./Box2D/Dynamics/Contacts/b2ContactSolver.cpp:96: b2ContactSolver::b2ContactSolver(b2Contact**, int32, b2StackAllocator*, float32): Assertion `kNormal > 1.19209289550781250000e-7F' failed.
我没有任何可能涉及该问题的进一步背景。
答案 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_epsilon
(FLT_EPSILON
)。
这可能由于各种原因而发生,例如两个物体都具有零反质量。例如,如果b2Settings.h
的任何组件值为kNormal
,我相信大于检查也会失败。 NaN
小于零当然也会导致此检查失败。
至于你可以做些什么来进一步评估和解决问题,这里有一些想法......