我有一个带有这个翻译矩阵的二维相机:
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));
但这没有考虑到轮换
答案 0 :(得分:5)
通常,找到矩阵的逆矩阵比手动计算客户端到世界的位置更容易,更健壮。
你的矩阵的问题 - 你无法得到逆的原因是你将Z轴缩小到零。
Matrix.CreateScale(new Vector3(Scale, Scale, 0))
这意味着您已在单个轴上展平整个空间。因此,当您尝试在该空间(客户空间)中获取单个点并将其返回到原始空间(世界空间)时,您获得的实际上是沿Z轴延伸的线。这就是你回归NaNs的原因。 (或者你可以这么说 - 你已经将零除了。)
矩阵反函数不知道您只是使用平面2D平面。 XNA的矩阵是3D。
修复方法是将矩阵更改为:
Matrix.CreateScale(Scale)
然后尝试找到反向。