XNA - 使用带旋转/缩放/平移的2D摄像机系统获取鼠标坐标

时间:2010-09-11 02:35:46

标签: xna camera 2d translation linear-algebra

我有一个带有这个翻译矩阵的二维相机:

        Transform = Matrix.CreateTranslation(new Vector3(-Position.X, -Position.Y, 0)) *
                     Matrix.CreateRotationZ(Rotation) *
                     Matrix.CreateScale(new Vector3(Scale, Scale, 0)) *
                     Matrix.CreateTranslation(new Vector3((GraphicsDevice.Viewport.Width * 0.5f), (GraphicsDevice.Viewport.Height * 0.5f), 0));

适用于旋转/缩放,其中原点是相机的中心。

现在我正在尝试获取世界上的鼠标坐标。

我尝试使用逆转换,但这只会导致NaN错误。 我猜我需要为鼠标坐标设置另一个转换矩阵,与当前的坐标相反,但是我无法弄清楚它是如何设置的

我有这个,

MousePosition = new Vector2((Mouse.GetState()。X - DrawTransform.Translation.X)*(1 / Gamecode.Camera1.Scale),(Mouse.GetState()。Y - DrawTransform.Translation.Y)* (1 / Gamecode.Camera1.Scale));

但这没有考虑到轮换

1 个答案:

答案 0 :(得分:5)

通常,找到矩阵的逆矩阵比手动计算客户端到世界的位置更容易,更健壮。

你的矩阵的问题 - 你无法得到逆的原因是你将Z轴缩小到零。

Matrix.CreateScale(new Vector3(Scale, Scale, 0))

这意味着您已在单个轴上展平整个空间。因此,当您尝试在该空间(客户空间)中获取单个点并将其返回到原始空间(世界空间)时,您获得的实际上是沿Z轴延伸的线。这就是你回归NaNs的原因。 (或者你可以这么说 - 你已经将零除了。)

矩阵反函数不知道您只是使用平面2D平面。 XNA的矩阵是3D。

修复方法是将矩阵更改为:

Matrix.CreateScale(Scale)

然后尝试找到反向。