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

Lee*_*len 4 xna camera translation 2d linear-algebra

我有一个2d相机与这个翻译矩阵:

        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));
Run Code Online (Sandbox Code Playgroud)

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

现在我想在世界上获得鼠标坐标.

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

我有这个,

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

但这没有考虑到轮换

And*_*ell 5

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

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

Matrix.CreateScale(new Vector3(Scale, Scale, 0))
Run Code Online (Sandbox Code Playgroud)

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

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

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

Matrix.CreateScale(Scale)
Run Code Online (Sandbox Code Playgroud)

然后尝试找到逆.