在 box2d 中投掷标枪的物理学

physics of javelin throwing in box2d

我正在尝试使用 box2d 在 libgdx 中制作一个标枪投掷游戏,但由于 box2d 的物理特性,标枪准确地落在投掷处而不是落在它的头上。
我已经尝试应用 angular Impulse,但对于我尝试过的每个公式,它仍然看起来不真实。 box2d中有什么可以解决这个问题的吗?

private void throwJavelin() {
    PolygonShape rect = new PolygonShape();
    rect.setAsBox(1.5f,0.05f);

    BodyDef bd = new BodyDef();
    bd.type = BodyDef.BodyType.DynamicBody;
    Body javelin = world.createBody(bd);
    javelin.setUserData("javelin");
    javelin.setTransform(firingPos, angle);
    javelin.createFixture(rect,1);
    float velX = -( -MathUtils.cos(angle) * (strength/4));
    float velY = -( -MathUtils.sin(angle) * (strength/4));
    javelin.setLinearVelocity(velX, velY);

    float omega = -3/strength;
    javelin.applyAngularImpulse(omega, true);
}

由于标枪的角度受到 drag/air 摩擦力的影响,而 box2d 不处理阻力,因此您必须想出一些解决方法。如果你在每一步都设置相对于速度矢量的角度,它看起来自然吗?

an online tutorial by iforce2d that explains how to do what you're asking。我建议检查一下。

还有 a video demonstration 我认为有用的结果,建议查看。