【问题标题】:XNA - Getting mouse coordinates with a 2d Camera system with rotation/zoom/translationXNA - 使用带有旋转/缩放/平移的 2d 相机系统获取鼠标坐标
【发布时间】:2010-09-11 18:28:37
【问题描述】:

我有一个带有这个平移矩阵的二维相机:

        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));

但这没有考虑轮换

【问题讨论】:

  • 你弄清楚如何获得旋转部分了吗?

标签: xna camera 2d translation linear-algebra


【解决方案1】:

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

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

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

这意味着您已将整个空间展平在一个轴上。因此,当您尝试在该空间(客户空间)中取一个点并将其返回到原始空间(世界空间)时,您得到的实际上是一条沿 Z 轴延伸的线。这就是为什么您要返回 NaN。 (或者您可以直接说 - 您引入了除以零。)

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

解决方法是将矩阵更改为:

Matrix.CreateScale(Scale)

然后尝试求逆。

【讨论】:

  • 很棒的答案。这对我很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
相关资源
最近更新 更多