Java 断言失败:(d+;h*k>;1.19209290e-7F),函数InitVelocityConstraints文件。。。b2MouseJoint.cpp,第125行

Java 断言失败:(d+;h*k>;1.19209290e-7F),函数InitVelocityConstraints文件。。。b2MouseJoint.cpp,第125行,java,libgdx,box2d,Java,Libgdx,Box2d,我正在使用MouseJoint在libgdx中移动身体。它在动态身体上运行得很好,但在某个运动学身体上,我遇到了一个奇怪的错误,导致游戏崩溃。错误是: Assertion failed: (d + h * k > 1.19209290e-7F), function InitVelocityConstraints, file /Users/badlogic/jenkins/workspace/libgdx-mac/extensions/gdx-box2d/gdx-box2d/jni/Box2

我正在使用
MouseJoint
libgdx
中移动身体。它在
动态
身体上运行得很好,但在某个
运动学
身体上,我遇到了一个奇怪的错误,导致游戏崩溃。错误是:

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
的创建有关,但我确实在调试中一步一步地进行了调试,并且创建过程本身进行得很顺利(至少看起来是这样)。是否有人也犯过同样的错误,并幸存下来分享自己的智慧

创建
MouseJoint
(如上所述,这很好。游戏在别处崩溃,我不知道在哪里)的代码是:


我仍然不知道为什么会发生错误,但从我的经验来看,拖动
运动学
主体不应该通过
MouseJoint
来完成,而应该使用
setTransform
方法

但是,
box2d
手册(第8.2章)明确指出,关节可用于
运动学
车身,尽管它们不会影响:

…允许静态实体和/或运动实体之间的关节,但具有 没有效果,使用一些处理时间


因此,我得到错误的原因仍然无法解释。

您不能将
鼠标点
与运动体一起用作
bodyB
,这就是导致断言的原因(请参阅关于相同问题的内容)

关于您引用的Box2D手册中的零件,它只是指出,通常可以在两个实体之间创建运动或静态的关节,但没有任何效果。但是,鼠标点的情况并非如此,因为它要求
车身B
质量为非零(在Box2D中)

通过查看
initVelocityConstraints
函数中的代码,我们可以看到(从中):


如果
mass
为零,则阻尼系数
d
和弹簧刚度
k
均为零,
d+h*k
为零,导致断言。

Upvote+接受。虽然我必须说关于这一点的
box2d
文档相当混乱。@user2016436我同意,但令人困惑的是,手册和代码注释中都没有明确说明这一点。我认为这可能是因为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);
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...

}