-1

XNA をいじっていて、問題が発生しました。48 * 48 のスプライトがあり、スプライトの左上隅でゲーム ワールド内の位置を追跡できます。
正方形を回転させても同じ点を追跡できるようにしたい。たとえば、時計回りに 90 度回転し、元の X 位置が 200 だった場合、新しい X 位置は 200 + 48 (画像の幅のサイズ) になります。90 度で問題ありません。頭の中でそれを解決することはできますが、その間のそれぞれが問題です。
おそらく、これを解決するための何らかの公式があることを私は知っています。
どんな助けでも素晴らしいでしょう!ああ、正方形はその中心を中心に回転しています。

使ってるだけspriteBatch.Draw()

      spriteBatch.Draw( animations[currentAnimation].Texture,
            Camera.WorldToScreen(WorldRectangle),
            animations[currentAnimation].FrameRectangle,
            color, rotationScale , new Vector2((float)frameHeight/2, (float)frameWidth/2), effect, TileMap.characterDepth);
4

2 に答える 2

0

3D グラフィックス ライブラリの上にアプリケーションを構築しています。3D グラフィックス ライブラリは、この種の問題を解決するのに非常に優れています! それをより小さな操作に分割し、ライブラリに作業を任せてください。

まず、ワールド空間ではなくモデル空間で作業しているときに、これらの種類の質問について考えるのが最も簡単です。言い換えると、回転ポイントが絶対的にどこにあるかを気にする必要はありません。変換されていないモデル (この場合、回転や移動のないスプライト) との相対的な場所だけを気にする必要があります。

それで、それはどこですか?単純:

var pt = new Vector3(-frameWidth / 2f, -frameHeight / 2f, 0f);

原点はスプライトの中心であるため、モデル空間でのスプライトの中心は (0, 0) です。これは、スプライトの左上隅が負の x 方向のスプライトの幅の半分であり、負の y 方向に沿ったスプライトの高さの半分であることを意味します。

次に、目的の変換を表すオブジェクトを作成します。これを行うには、XNA の組み込みメソッドを使用して回転行列を作成します。

var transformation = Matrix.CreateRotationZ(MathHelper.ToRadians(90f));

元のポイントに変換を適用します。

var transformedPt = Vector3.Transform(pt, transformation);

これはまだモデル空間にあるので、ワールド座標を取得するには、ワールド空間に変換する必要があります。

var transformedWorldX = transformedPt.X + spritePosition.X;
var transformedWorldY = transformedPt.Y + spritePosition.Y;

そして、そこに行きます。

于 2013-09-13T14:52:01.703 に答える
0

If you have to keep track of a moving rotating sprite you can't use the top left corner, but its centroid. You already draw your sprite using the centroid to rotate it.

The problem is that the second parameter of your Draw call is a Rectangle, you sholud use a Vector2 position, instead.

于 2013-09-13T13:39:51.497 に答える