有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在libgdx/box2d中为特定实体强制执行最大速度?

我正在通过Libgdx使用Box2D创建一个场景。我有一个场景,我想用applyForce不断推动一个特定的物体(方向会不时改变),但只能达到给定的速度

想象一个由火箭发动机(四面都有喷嘴)推动的圆形物体,以零克为单位进行说明

有没有一种方法可以做到这一点,而无需重新计算施加的力,或在每次更新时重复计算我只知道如何为所有对象设置最大速度。目前我最好的办法是以某种方式使用^{,但我希望有一个更简单的解决方案


共 (1) 个答案

  1. # 1 楼答案

    可以使用SetLinearVelocity覆盖当前速度

    b2Vec2 vel = body->GetLinearVelocity();
    float speed = vel.Normalize();//normalizes vector and returns length
    if ( speed > maxSpeed ) 
        body->SetLinearVelocity( maxSpeed * vel );
    

    ==============================

    编辑: 简单的空气阻力可以通过在相反的行驶方向上施加一个小的阻力来模拟,该阻力随行驶速度成比例

    b2Vec2 vel = body->GetLinearVelocity();
    body->ApplyForce( 0.05 * -vel, body->GetWorldCenter() );
    

    阻力的比例值(本例中为0.05)决定了阻力与火箭发动机施加的力相等的速度,这两个力相互抵消,从而获得最高速度

    maxSpeed = thrustForce.Length() / 0.05;
    

    纯粹主义者会指出,阻力实际上是相对于速度的平方,所以更准确地说,你可以这样做:

    b2Vec2 vel = body->GetLinearVelocity();
    float speed = vel.Normalize(); //normalizes vector and returns length
    body->ApplyForce( 0.05 * speed * speed * -vel, body->GetWorldCenter() );
    

    。。。我想这会让你以最快的速度

    maxSpeed = sqrtf( thrustForce.Length() / 0.05 );