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

时间:2015-04-18 20:22:04

标签: java libgdx box2d

我使用MouseJointlibgdx中移动身体。它与dynamic个身体一直很好用,但是对于某个kinematic身体,我得到了一个奇怪的错误,导致游戏崩溃。错误是:

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的代码(如上所述,很好。游戏在其他地方崩溃,我不知道在哪里)是:

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);

2 个答案:

答案 0 :(得分:2)

您根本无法将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和弹簧刚度k均为零,d + h * k为零,从而导致断言。

答案 1 :(得分:0)

我仍然不知道为什么会发生错误,但是从reading around我发现拖动kinematic正文 不能通过MouseJoint完成而是使用setTransform方法。

然而,box2d手册明确states(第8.2章)关节可以kinematic身上使用,尽管它们不会影响它们:< / p>

  

......允许静态和/或运动体之间的接合,但有   没有效果,并使用一些处理时间...

所以为什么我收到错误仍然无法解释。