現在、スプライトをグループ化して、描画に回転変換を適用しています。
private void UpdateMatrix(ref Vector2 origin, float radians)
{
Vector3 matrixorigin = new Vector3(origin, 0);
_rotationMatrix = Matrix.CreateTranslation(-matrixorigin) * Matrix.CreateRotationZ(radians) * Matrix.CreateTranslation(matrixorigin);
}
ここで、原点は私のスプライトグループの中心点です。この変換をグループ内の各スプライトに適用します。
私の問題は、原点を調整すると、スプライトグループ全体が画面上で再配置されることです。
変換で使用される回転のポイントを、スプライトグループの位置とどのように区別できますか?この変換行列を作成するより良い方法はありますか?
編集
次に、Draw()関数の関連部分を示します。
Matrix allTransforms = _rotationMatrix * camera.GetTransformation();
spriteBatch.Begin(SpriteSortMode.BackToFront, null, null, null, null, null, allTransforms);
for (int i = 0; i < _map.AllParts.Count; i++)
{
for (int j = 0; j < _map.AllParts[0].Count; j++)
{
spriteBatch.Draw(_map.AllParts[i][j].Texture, _map.AllParts[i][j].Position, null, Color.White, 0, _map.AllParts[i][j].Origin, 1.0f, SpriteEffects.None, 0f);
}
}
これはすべて正常に機能しますが、問題は、回転が設定され、原点が変更されると、スプライトグループの位置が画面上でオフセットされることです。
私は、位置を変えずに原点を調整する方法を見つけようとしています。
編集2 現在のところ、これが機能していないため、回避策を探しています。XNAでスプライトのグループを回転させるより良い方法を誰かが知っていますか?画面上のスプライトグループの位置に影響を与えずに回転ポイント(原点)を変更できる方法が必要です。
編集3 スプライトの位置で画面座標を(0,0)にリセットできれば、基本的に移動せずに原点を再配置できると思います。基本的に、現在の位置/回転を設定して、最初から始める方法が必要です。私のスプライトを新しい画面の原点にすることが可能かどうか誰かが知っていますか?
回転せずに原点を移動:
回転による原点の移動(上方向への移動方法に注意してください):