断言失败:(d + h * k > 1.19209290e-7F),函数 InitVelocityConstraints 文件 ... b2MouseJoint.cpp,第 125 行
Assertion failed: (d + h * k > 1.19209290e-7F), function InitVelocityConstraints file ... b2MouseJoint.cpp, line 125
我正在使用 MouseJoint
在 libgdx
中移动物体。它在 dynamic
个身体上运行良好,但在某些 kinematic
body 上我遇到了一个奇怪的错误,导致游戏崩溃。错误是:
Assertion failed: (d + h * k > 1.19209290e-7F), function InitVelocityConstraints, file /Users/badlogic/jenkins/workspace/libgdx-mac/extensions/gdx-box2d/gdx-box2d/jni/Box2D/Dynamics/Joints/b2MouseJoint.cpp, line 125.
不幸的是,崩溃时未显示堆栈,因此我无法提供。该错误似乎与 MouseJoint
创建有关,但我确实在调试中进行了 step-by-step 并且创建本身进行得很顺利(或者至少看起来如此)。有没有人有同样的错误并幸存下来分享his/her智慧?
创建 MouseJoint
的代码(如上所述,运行良好。游戏在其他地方崩溃,我不知道在哪里)是:
mTmpMouseJointDef.bodyA = mWorld.createBody(mTmpBodyDef); // Create dummy body
mTmpMouseJointDef.bodyB = b_body;
mTmpMouseJointDef.collideConnected = true;
mTmpMouseJointDef.target.set(pTargetVec.x, pTargetVec.y);
mTmpMouseJointDef.maxForce = 1000.0f * b_body.getMass();
mouseJoint = (MouseJoint)mWorld.createJoint(mTmpMouseJointDef);
我仍然不知道为什么会发生错误,但是从 reading around 我看到拖动 kinematic
body 应该 而不是 通过 MouseJoint
而不是使用 setTransform
方法完成。
然而,box2d
手册清楚地states(第 8.2 章)关节 可以 用于 kinematic
身体,尽管它们可以不影响他们:
...Joints between static and/or kinematic bodies are allowed, but have
no effect and use some processing time...
所以为什么我得到的错误仍然无法解释。
您根本不能将 MouseJoint
与运动体一起用作 bodyB
,这就是导致断言的原因(请参阅 this other SO post 关于同一问题)。
关于你引用的Box2D手册中的部分,它只是说一般来说,可以创建运动或静态的两个物体之间的关节,但没有效果。然而,这对于 MouseJoint
是不正确的,因为它要求 bodyB
质量不为零(在 Box2D 中 all kinematic and static bodies have zero mass)。
我们可以通过查看initVelocityConstraints
函数中的代码(来自JBox2D Github)看到:
public void initVelocityConstraints(final SolverData data) {
// some code...
float mass = m_bodyB.getMass();
// Frequency
float omega = 2.0f * MathUtils.PI * m_frequencyHz;
// Damping coefficient
float d = 2.0f * mass * m_dampingRatio * omega;
// Spring stiffness
float k = mass * (omega * omega);
// magic formulas
// gamma has units of inverse mass.
// beta has units of inverse time.
float h = data.step.dt;
assert (d + h * k > Settings.EPSILON);
// some code...
}
如果mass
为零,则阻尼系数d
和spring刚度k
都为零,d + h * k
为零,导致断言。
我正在使用 MouseJoint
在 libgdx
中移动物体。它在 dynamic
个身体上运行良好,但在某些 kinematic
body 上我遇到了一个奇怪的错误,导致游戏崩溃。错误是:
Assertion failed: (d + h * k > 1.19209290e-7F), function InitVelocityConstraints, file /Users/badlogic/jenkins/workspace/libgdx-mac/extensions/gdx-box2d/gdx-box2d/jni/Box2D/Dynamics/Joints/b2MouseJoint.cpp, line 125.
不幸的是,崩溃时未显示堆栈,因此我无法提供。该错误似乎与 MouseJoint
创建有关,但我确实在调试中进行了 step-by-step 并且创建本身进行得很顺利(或者至少看起来如此)。有没有人有同样的错误并幸存下来分享his/her智慧?
创建 MouseJoint
的代码(如上所述,运行良好。游戏在其他地方崩溃,我不知道在哪里)是:
mTmpMouseJointDef.bodyA = mWorld.createBody(mTmpBodyDef); // Create dummy body
mTmpMouseJointDef.bodyB = b_body;
mTmpMouseJointDef.collideConnected = true;
mTmpMouseJointDef.target.set(pTargetVec.x, pTargetVec.y);
mTmpMouseJointDef.maxForce = 1000.0f * b_body.getMass();
mouseJoint = (MouseJoint)mWorld.createJoint(mTmpMouseJointDef);
我仍然不知道为什么会发生错误,但是从 reading around 我看到拖动 kinematic
body 应该 而不是 通过 MouseJoint
而不是使用 setTransform
方法完成。
然而,box2d
手册清楚地states(第 8.2 章)关节 可以 用于 kinematic
身体,尽管它们可以不影响他们:
...Joints between static and/or kinematic bodies are allowed, but have no effect and use some processing time...
所以为什么我得到的错误仍然无法解释。
您根本不能将 MouseJoint
与运动体一起用作 bodyB
,这就是导致断言的原因(请参阅 this other SO post 关于同一问题)。
关于你引用的Box2D手册中的部分,它只是说一般来说,可以创建运动或静态的两个物体之间的关节,但没有效果。然而,这对于 MouseJoint
是不正确的,因为它要求 bodyB
质量不为零(在 Box2D 中 all kinematic and static bodies have zero mass)。
我们可以通过查看initVelocityConstraints
函数中的代码(来自JBox2D Github)看到:
public void initVelocityConstraints(final SolverData data) {
// some code...
float mass = m_bodyB.getMass();
// Frequency
float omega = 2.0f * MathUtils.PI * m_frequencyHz;
// Damping coefficient
float d = 2.0f * mass * m_dampingRatio * omega;
// Spring stiffness
float k = mass * (omega * omega);
// magic formulas
// gamma has units of inverse mass.
// beta has units of inverse time.
float h = data.step.dt;
assert (d + h * k > Settings.EPSILON);
// some code...
}
如果mass
为零,则阻尼系数d
和spring刚度k
都为零,d + h * k
为零,导致断言。