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...
}