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));
但这没有考虑到轮换
通常,找到矩阵的逆矩阵比手动计算客户端到世界的位置更容易,更健壮.
矩阵的问题 - 你无法得到逆矩阵的原因是你将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)
然后尝试找到逆.