0

我正在尝试在转换后的精灵中获取 x 和 y 坐标。我有一个简单的 200x200 精灵,它在屏幕中间旋转 - 原点为 (0,0) 以保持简单。

截屏

我编写了一段代码,可以转换鼠标坐标,但只能使用指定的 x 或 y 值。

int ox = (int)(MousePos.X - Position.X);
int oy = (int)(MousePos.Y - Position.Y);

Relative.X = (float)((ox - (Math.Sin(Rotation) * Y /* problem here */)) / Math.Cos(Rotation));
Relative.Y = (float)((oy + (Math.Sin(Rotation) * X /* problem here */)) / Math.Cos(Rotation));

我怎样才能做到这一点?或者我怎样才能修正我的方程式?

4

1 回答 1

2

最一般的方式是将变换表示为矩阵。这样,您可以稍后添加任何其他转换,如果您发现需要它。

对于给定的变换,矩阵为:

var mat = Matrix.CreateRotationZ(Rotation) * Matrix.CreateTranslation(Position);

这个矩阵可以解释为从精灵空间到世界空间的系统转换。你想要逆变换——从世界空间到精灵空间的系统变换。

var inv = Matrix.Invert(mat);

您可以使用此矩阵转换鼠标坐标:

var mouseInSpriteSpace = Vector2.Transform(MousePos, inv);

并且您在精灵的本地系统中获得鼠标位置。

mat您可以通过使用矩阵的重载来检查您是否拥有正确Spritebatch.Begin()的矩阵。如果传递矩阵,则在 (0, 0) 处绘制精灵,不进行旋转。

于 2013-08-12T17:52:19.117 回答