1

私は 3D ゲームを作成しています。プレイヤーの背中は常にカメラの方を向いており、その方向に移動する必要があります。「後ろ向きカメラ」の部分まではまだ来ていませんが、プレイヤーを正しい方向に動かす方法がわかれば簡単になると思います...

これは 3D 座標系ですが、高さ (z 軸) は無視できます。これは、カメラがどれほど高くても、プレーヤーは常に同じ速度で移動する必要があるためです (カメラ システムは、ゲームの世界と同じように機能するように計画されています)。ウォークラフトの)。

今、私はこれに私の問題を要約しました...

  • ポイント (0, 0) はプレイヤーの位置です。
  • ポイント (x, y) はカメラの位置です。
  • カメラはプレーヤーから (dx, dy) 単位離れています (また、プレーヤーは (0, 0) にあるため、(x, y) 単位離れていますが、これは位置ベクトルであり、移動ベクトルではありません)。

問題: 円 r = 1 上にあり、(0, 0) および (x, y) と同じ線上にあるこの 2D 空間内の点 (a, b) を取得するにはどうすればよいですか?

視覚化:

ここに画像の説明を入力

これを行うと、2D ベクトル (a, b) が得られます。これに -30 を掛けると、プレーヤーの速度として機能します。

私はこれを行う方法を知っていますが、非常に高価で非効率的な方法で、ピタゴラの定理、平方根、およびそれらすべてのあり得ないツール (Javascript で動作) を使用します。

基本的には、次のようなものです。

c = sqrt(dx*dx + dy*dy); //Get the length of the line
rat = 1/c; //How many times is the desired length (1) bigger than the actual length

a = x*rat;
b = y*rat;

もっといいものがあるに違いない!

参考までに、Three.js エンジンを使用して Javascript でゲームを作成しています。

4

1 に答える 1

4

ここでより効率的にするものは何もありません。これらの計算は3Dシーンの標準的なものです。

時期尚早に最適化しないでください。このようなものがあなたのアプリのボトルネックになる方法はありません。

これらの計算がそれぞれrender()で発生する場合でも、数ミリ秒ごとに1回だけ発生することを忘れないでください。60FPSを想定すると17ミリ秒であり、これはかなりの量です。Math.sin()//は非常に効率的でありMath.cos()Math.sqrt()他の多くの計算がそれぞれrender()で行われ、はるかに複雑です。

あなたは今持っているものでうまくいくでしょう。

于 2012-05-27T21:38:03.143 に答える