从2D相机和独立分辨率中获取鼠标坐标
本文关键字:获取 鼠标 坐标 分辨率 独立 2D 相机 | 更新日期: 2023-09-27 17:54:10
我一直在尝试将David Amador的这两个样本结合起来:
http://www.david-amador.com/2010/03/xna-2d-independent-resolution-rendering/http://www.david-amador.com/2009/10/xna-camera-2d-with-zoom-and-rotation/一切都很好,除了我有一些困难获得鼠标坐标。我能够为每个单独的样本得到它们,但是我的数学计算似乎是错误的。
如果虚拟分辨率和正常分辨率相同,则鼠标坐标是正确的。当我做决议之类的事情时。SetVirtualResolution(1920、1080)和解决。SetResolution(1280,720, false),当我移动相机时,坐标慢慢不同步。
代码如下:
public static Vector2 MousePositionCamera(Camera camera)
{
float MouseWorldX = (Mouse.GetState().X - Resolution.VirtualWidth * 0.5f + (camera.position.X) * (float)Math.Pow(camera.Zoom, 1)) /
(float)Math.Pow(camera.Zoom, 1);
float MouseWorldY = ((Mouse.GetState().Y - Resolution.VirtualHeight * 0.5f + (camera.position.Y) * (float)Math.Pow(camera.Zoom, 1))) /
(float)Math.Pow(camera.Zoom, 1);
Vector2 mousePosition = new Vector2(MouseWorldX, MouseWorldY);
Vector2 virtualViewport = new Vector2(Resolution.VirtualViewportX, Resolution.VirtualViewportY);
mousePosition = Vector2.Transform(mousePosition - virtualViewport, Matrix.Invert(Resolution.getTransformationMatrix()));
return mousePosition;
}
在分辨率中我添加了这个:
virtualViewportX = (_Device.PreferredBackBufferWidth / 2) - (width / 2);
virtualViewportY = (_Device.PreferredBackBufferHeight / 2) - (height / 2);
其他内容与示例代码相同。提前感谢!
感谢David Gouveia,我能够识别问题…我的相机矩阵使用了错误的数学。
我要把我所有的代码都贴出来,希望能帮助那些想做类似事情的人。
摄像机变换矩阵:
public Matrix GetTransformMatrix()
{
transform = Matrix.CreateTranslation(new Vector3(-position.X, -position.Y, 0)) * Matrix.CreateRotationZ(rotation) *
Matrix.CreateScale(new Vector3(Zoom, Zoom, 1)) * Matrix.CreateTranslation(new Vector3(Resolution.VirtualWidth
* 0.5f, Resolution.VirtualHeight * 0.5f, 0));
return transform;
}
这也将使相机居中。下面是结合Resolution类和camera类获得鼠标坐标的方法:
public static Vector2 MousePositionCamera(Camera camera)
{
Vector2 mousePosition;
mousePosition.X = Mouse.GetState().X;
mousePosition.Y = Mouse.GetState().Y;
//Adjust for resolutions like 800 x 600 that are letter boxed on the Y:
mousePosition.Y -= Resolution.VirtualViewportY;
Vector2 screenPosition = Vector2.Transform(mousePosition, Matrix.Invert(Resolution.getTransformationMatrix()));
Vector2 worldPosition = Vector2.Transform(screenPosition, Matrix.Invert(camera.GetTransformMatrix()));
return worldPosition;
}
结合我发布/提到的所有其他代码,这应该是所有你需要实现分辨率独立性和一个了不起的相机!