オブジェクトを回転させてプレイヤーに向けます


8

これはおそらく単純なベクトルの質問ですが、どうすればよいかわかりません。

ベクターの位置にオブジェクトがあります(ox,oy)。可能性のあるすべての更新で、ユーザーは画面上を歩き回り(px,py)、いつでもその位置にいます。オブジェクトが常にプレーヤーに面するようにするにはどうすればよいですか?角度を度単位で取得する必要があります。

これは私がいじくり回してきたものですが、方向はすぐにユーザーがいる場所を指していません。代わりに、ユーザーが歩いている方向に徐々に増加します。

 objVec.Normalize(); 
 playerVec.Normalize();

 obj.Rotation = MathHelper.ToDegrees((float)Math.Acos(Vector2.Dot(objVec, playerVec)));

私はそれが完全に間違っているかもしれないので、どんな助けでもありがたいです!


回答:


13

別の方法で問題について考えます。常にプレーヤーに「対面」するように反対する必要があります。つまり、回転する「前方」ベクトルが、それ自体からプレーヤーへのベクトルと平行になるようにします。その「順」ベクトルが通常にあると仮定するとobj.Rotation = 0、適切な回転は基本的にの逆正接ですVector2.Subtract(playerPos, objectPos)。ほとんどの数学ライブラリにはatan2、2つの引数を取るようなものや、Vector2自動的に適切な象限を判断するものがあります。

編集:私はあなたがC#にいて、これらは実際には組み込みクラスであることを認識しました 数学ライブラリのドキュメントを探す必要はありません。私がお手伝いします。適切なコードは次のとおりです。

Vector2 facingVec = playerVec - objVec;
obj.Rotation = MathHelper.ToDegrees((float)Math.Atan2(facingVec.Y, facingVec.X));

X / Yの反転に注意してください。ヒストリカルレーズンの場合、Atan2の引数は常に逆になります。


ありがとう、うまくいきました。以前に試したと思いますが、Normalizationを削除するとうまくいきました。
XSL

1
出くわすすべてのベクトルを正規化するのは魅力的ですが、常に良い方法とは限りません。位置と方向の違いを明確にしておく必要があります。方向は安全に正規化できますが、位置は正規化しないでください。この場合、objVecとplayerVecは明らかにそれぞれのエンティティの位置であり、正規化されるべきではありません。
ポールZ

9
あなたが言うこれらのヒステリックレーズンは誰ですか?美味しい?
Olhovsky、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.