2Dトップダウンレーサーで横向きの摩擦を作成する


7

私はある種のトップダウンレーサーを作成しようと遊んでいますが、車を適切に方向転換させるのに問題があります。現時点では、これは車の位置を更新するために必要なコードです。

var power;
    if (keyboard.upKeyDown) {
        power = 1;
    } else {
        power = 0;
    }

if (keyboard.leftKeyDown) {
    this.rotate -= 0.05;
} else if (this.keyboard.rightKeyDown) {
    this.rotate+= 0.05;
}

this.velocityX += Math.cos(this.rotate) * power;
this.velocityY += Math.sin(this.rotate) * power;

var cDrag = 0.98;
this.velocityX *= cDrag;
this.velocityY *= cDrag;

this.positionX += this.velocityX;
this.positionY += this.velocityY;

現時点ではコードは非常にシンプルです。上を押し続けると、指している方向に力が加えられ、小惑星のように感じられます。

次に私がする必要があるのは、車が指している方向と実際に移動している方向を比較し、横方向の力を加えて横方向に減速させるだけでなく、その力の一部を前方向に伝達することですそのため、現在指している方向に進み続けます。

私がこれをどうやってやるかについて少し混乱しているので、どんなアドバイスでも大歓迎です。

回答:


9

免責事項:これを行うにはおそらく他のより良い方法があります。どちらの方法でも、しばらく前にこの問題に取り組んだ方法を説明しますが、結局は問題なく動作しました。

私は数年前に大学のプロジェクト用に2Dトップダウンカーゲームを実装しました。覚えていれば、この記事を出発点として使用しましたが、結局、かなり単純化してしまい、すべてを落としました」車の単一ボディを支持するホイール」のモデリングのもの。しかし、私が使用したのはKillOrthogonalVelocity、横方向の摩擦を適用するために、そこにある方法に似た方法です。

それで、これがどのようになっているかの小さなビデオです。ハンドブレーキボタンを使用しているかどうかにも依存する、一定量の横方向の摩擦が適用されています。また、ビデオに使用した車も、他のものより大幅にドリフトします。これは制御可能でした。また、横方向の動きがなく、非常に硬い制御を備えたトラックがありました。

結果に完全に満足したことはありませんでしたが、私のニーズには十分でした。私の物理学は実際の車両の動きなどに基づいていないことに注意してください。私はそれを正しく感じるまで微調整して試してみました。

横向きの摩擦

したがって、実装に関するいくつかの詳細を説明するために、基本的には、その方法をプロジェクトに適合させるときに、横方向の速度をどれだけ殺すかを正確に制御できる変数を0〜1の値として追加しました。これにより、車の取り扱いとドリフトの程度を微調整することができました。XNAに変換され、簡略化されたメソッドは次のとおりです。

public static void KillOrthogonalVelocity(Car car, float drift = 0f)
{
    Vector2 forwardVelocity = car.Forward * Vector2.Dot(car.Velocity, car.Forward);
    Vector2 rightVelocity = car.Right * Vector2.Dot(car.Velocity, car.Right);
    car.Velocity = forwardVelocity + rightVelocity * drift;
}

ご覧のとおり、三角法ではなくベクトルと線形代数を使用しているので、ニーズに合わせて調整する必要があります。car.Forwardcar.Rightはどちらも、その特定の方向を指す正規化されたベクトルです。

スロットル、ブレーキ、ステアリング

それ以外の唯一の関連部分は、力を車に適用して車を動かして操縦する方法でした。

  • 加速とブレーキは簡単でした。車が現在向いている方向、またはその逆の方向に力を加えるだけです。
  • 一方、ステアリングにはいくつかのトリックがありました。ステアリングは車にトルクをかけることで行われました(私はBox2Dを使用したため、これは単純なメソッド呼び出しでした)が、そのトルクの力はいくつかの要因、特に次の要素に依存しました。

    1. ブレーキング時にトルクを25%増やして、より鋭いターンを可能にしました。 if(braking || handbraking) torque *= 1.25
    2. 後退するときは、正しい制御を得るためにトルクも逆にしました。 if(reverse) torque *= -1
    3. 最後に、車が特定の速度しきい値を下回っている場合は、通常よりもステアリングを小さくしました。 if(speed < 2.0f) torque *= (speed / 4.0f)

次に、KillOrthogonalVelocity()メソッドを呼び出して最終速度を調整し、宇宙船のように振る舞わず、車のように振る舞います。


答えてくれてありがとう、あなたの提案の実装に取り​​掛かったところ、それは本当にうまく機能しているようです。私は間違いなくあなたがステアリングについて言及した他のいくつかのことを試します。ありがとう!
pogo 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.