プレーヤーを地形に対してスムーズにスライドさせる方法


11

図

等尺性のゲームを作っています。プレイヤーが斜めに壁の中を歩こうとするとき、スムーズに壁を横切って滑らせたいので、動きのどの部分でも合法であり、法線の方向のすべてが捨てられます。壁は垂直または水平だけでなく、任意の角度にすることができ、プレーヤーは360度の動きをします。

もうすぐそこにいるような気がしますが、最後のピースを置くことができません。

更新:みんな良いニュースです!私はそれを働いています。しかし...私は正規化すべきこととそうでないことを少し混乱しています。法線は単位ベクトルである必要がありますよね?しかし、それを私の入力と混合しているので、それを正規化しています-私は間違っていますか?

ちなみに、プレイヤーが通常の方向に1ピクセル押す必要があることもわかりました。これにより、プレイヤーが物に引っ掛からないようになり、うまく機能します。

回答:


13

運動ベクトルを平面の法線に投影し、運動ベクトルから結果を差し引くだけです。

Vector undesiredMotion = normal * (dotProduct(input, normal));
Vector desiredMotion = input - undesiredMotion;

とにかくそのようなもの。素敵な図では、入力が壁から離れているように見えるので、少し混乱しています。


申し訳ありませんが、垂直壁の前にいるはずです。ひどい絵
イアン

1
ドット積について少し混乱しています。ドット積はスカラーではありませんか?
Iain

1
はい、ただし、法線(ベクトル)を掛けて、不要なモーションのベクトルを取得します。ベクトル(x、y、z)にスカラーsを掛けると、ベクトル(sx、sy、sz)が得られます。
Chris Howe

完了しました。変数が図と一致するように変更しました。:)
Chris Howe

@Iain私はこの回答の使い方を本当に理解しようとしていますが、理解できません。この正確なコードを作成すると、非常に奇妙なdesiredMotion結果が得られます。これを機能させたことがありますか?
テスト

1

法線の方向にあるモーションのコンポーネントを削除するのは簡単ですが、代わりにゲームプレイに合わせてモーションベクトルを回転させることもできます。たとえば、3人称のアクションゲームでは、壁やその他の境界に少し引っ掛かるのが簡単な場合があるため、プレイヤーの意図を推測できます。

// assume that 'normal' is unit length
Vector GetDesired(Vector input, Vector normal) {
   // tune this to get where you stop when you're running into the wall,
   // vs. bouncing off of it
   static float k_runningIntoWallThreshold = cos(DEG2RAD(45));

   // tune this to "fudge" the "push away" from the wall
   static float k_bounceFudge = 1.1f;

   // normalize input, but keep track of original size
   float inputLength = input.GetLength();
   input.Scale(1.0f / inputLength);

   float dot = DotProduct(input, normal);

   if (dot < 0)
   {
      // we're not running into the wall
      return input;
   }
   else if (dot < k_runningIntoWallThreshold)
   {
      Vector intoWall = normal.Scale(dot);
      intoWall.Scale(k_bounceFudge);

      Vector alongWall = (input - intoWall).Normalize();
      alongWall.Scale(inputLength);

      return alongWall;
   }
   else
   {
      // we ran "straight into the wall"
      return Vector(0, 0, 0);
   }
}

いいね。しかし、ファッジファクターでスケーリングした場合、壁に沿ってスライドするのではなく、壁に沿ってスライドするのですか、それともそれを微調整するだけのケースですか?
Chris Howe

私の考えでは、見た目を良くするために微調整すると思います。確かに大きすぎると跳ねているように見えますが、十分に微妙な場合は、表面のわずかな曲がりに引っかかるのを防ぐだけです。
ダッシュトムバン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.