減速を実装するにはどうすればよいですか?


11

現時点では加速を使用していないため、「減速」と言います。つまり、速度をゼロに戻し、最終的に停止します。

私はベクトルが初めてなので、物理学などはあまり得意ではありません。「減速」は通常どのように処理されますか?


私が今持っているものは動作しますが、一種のハックのようです。

update:function(Game, t, dt) {
    var speed = Game.Input.isKeyDown('shift') ? 8 : 4;

    if (Game.Input.isKeyDown('a')) {
        this.velocity.i -= speed;
    }
    else if (Game.Input.isKeyDown('d')) {
        this.velocity.i += speed;
    }
    else {
        if (Math.abs(this.velocity.i) > 3) {
            this.velocity.i += (this.velocity.i > 0) ? -speed : speed;
        }
        else {
            this.velocity.i = 0;
        }
    }

    if (Game.Input.isKeyDown('w')) {
        this.velocity.j -= speed;
    }
    else if (Game.Input.isKeyDown('s')) {
        this.velocity.j += speed;
    }
    else {
        if (Math.abs(this.velocity.j) > 3) {
            this.velocity.j += (this.velocity.j > 0) ? -speed : speed;
        }
        else {
            this.velocity.j = 0;
        }
    }

    this.updateVectors(dt);
}

私が3を使用したのは、それより低いものは奇妙な動作を示すためです。速度を上げると、変更する必要があると思います。


2
また、セマンティックの詳細はほとんどありません..ステートメントvelocity.i += speed;speedは、実際には加速、つまり速度が変化する速度です。:)
Ipsquiggle 2010

Flixelはこれを「ドラッグ」と呼んでいます。これは、加速とは無関係の用語を探している場合に備えてです。
グレゴリーAvery-Weir

「減速度」は負の加速度です。微積分を取りましたか?
3Dave

1
実際、「減速」は現実のものではなく、「負の加速」でもありません。それはすべて異なる方向の通常の加速です。
MichaelHouse

回答:


16

シンプルなもの

this.velocity.i *= 0.9;

うまく動作します。


へぇ、信頼私はそれを過剰に複雑にすることを悪いです。最近読んだところ、0.9を掛けることで基本的な空気抵抗をシミュレートできるが、それはまだ思いつかなかった。ありがとうございました。
Xavura

ははは、うわー、ええ。私は逆ベクトル法線を計算し、それにスローダウン係数を掛けていました。なぜ私はこれをしなかったのですか?時々本当に明白な答えは見逃すのが最も簡単です。
CodexArcanum 2010

7

擬似コードでは、これのバリエーションを実行します。

速度+ =((MoveDirection * MaximumSpeed)-速度)* AccelerationFactor

どこ:

  • 速度は、エンティティが現在の軸上を移動する現在の速度です。
  • MoveDirectionは、エンティティが現在の軸上を移動しようとしている方向です。1は前方、0は静止、-1は後方です。その間のすべての値が許可されます。
  • MaximumSpeedは、エンティティが現在の軸上を移動できる最速を決定する定数です。
  • AccelerationFactorは0と1の間の定数で、加速と減速の速度を表します。1は瞬時で、0は決して移動しません。

これは加速と減速の両方を直線ではなく曲線でうまく処理します。異なる加速率と減速率が必要な場合は、IFステートメントを実行して、プレーヤーが動かないようにしようとしているのか、反対方向に動かないのかを決定できます。


1
これは非常に興味深い式です。私は将来のためにそれを覚えておく必要があります!
Ipsquiggle 2010

+1面白そうです、私はそれをいくつかのコードに入れて、それが機能することを確認するかもしれません。
David Young

とても良い処方。これを使います。どこで手に入れたの?それとも自分でそれを導き出しましたか?
Riki

返答が遅れてすみません、私は漠然とBlitz3Dデモの1つのコードに触発されたことを覚えていますが、どれを覚えているかはわかりません。
earok

3

ここでの答え(vel = vel * 0.9)は実際には減衰であり、私が「減速」と考えるものではありません。

私はしばしばこのように減速します:

if ( Game.Input.isKeyDown( "w" ) )
{
    this.velocity.i = Math.max( -WALKSPEED, this.velocity.i - WALKFORCE);
}
else if ( Game.Input.isKeyDown( "d" ) )
{
    this.velocity.i = Math.min( WALKSPEED, this.velocity.i + WALKFORCE);
}
else
{
    if (this.velocity.i < 0)
    {
        this.velocity.i = Math.min( 0, this.velocity.i + WALKFORCE);
    }
    else if (this.velocity.i > 0)
    {
        this.velocity.i = Math.max( 0, this.velocity.i - WALKFORCE);
    }
}

いくつかの長所と短所対ダンピング:

長所

  • 加速の加速と減速の加速はどちらも線形であり、ダンピングでは得られないと思われる心地よい微妙な「ゲーム感」を提供します。これは重要な部分です。
  • キャラクターは、予測可能な回数の反復の後に、予測可能な完全な停止になります。

短所

  • 非直交モーションを使用している場合、これは実装が難しくなります(これは、あなたがそうであるように聞こえますか?)(コードで説明したい場合は、質問してください。)

1

簡単に言えば、疑似コードで:

if(no movement keys pressed) [Meaning we want to start to decelerate]
current speed *= 0.85 [Or some number between 0 and 1, the smaller the faster the deceleration]

ただし、(現在の速度<0.001f)または何かを確認して、0に設定する必要があります。


私もチェックを配置する必要があると考えましたが、チェックなしでも機能するようです。
Xavura
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.