XNA - 鼠标坐标到词空间转换

本文关键字:空间 转换 坐标 鼠标 XNA | 更新日期: 2023-09-27 18:36:36

我有一个很烦人的问题。我想创建一个绘图程序,使用 winform + XNA 组合。

最重要的部分是将鼠标位置转换为 XNA 绘制的网格 - 我能够为翻译制作它,但它只有在我不放大时才有效 - 当我这样做时,坐标简直是可怕的错误。

我不知道我做错了什么。我尝试使用缩放矩阵进行变换,使用反向缩放矩阵进行变换,用缩放进行乘法,但似乎都不起作用。

在开始时(缩放值 = 1),网格从 (0,0,0) 开始到 (宽度、高度、0)。只要缩放值根本没有变化,我就可以根据此网格获取坐标。我使用自定义着色器,其中包含正交投影矩阵、标识视图矩阵和转换后的世界矩阵。

以下是两种主要方法:

internal void Update(RenderData data)
{
    KeyboardState keyS = Keyboard.GetState();
    MouseState mouS = Mouse.GetState();
    if (ButtonState.Pressed == mouS.RightButton)
    {
        camTarget.X -= (float)(mouS.X - oldMstate.X) / 2;
        camTarget.Y += (float)(mouS.Y - oldMstate.Y) / 2;
    }
    if (ButtonState.Pressed == mouS.MiddleButton || keyS.IsKeyDown(Keys.Space))
    {
        zVal += (float)(mouS.Y - oldMstate.Y) / 10;
        zoom = (float)Math.Pow(2, zVal);
    }
    oldKState = keyS;
    oldMstate = mouS;
    world = Matrix.CreateTranslation(new Vector3(-camTarget.X, -camTarget.Y, 0)) * Matrix.CreateScale(zoom / 2);
}
internal PointF MousePos
{
    get
    {
        Vector2 mousePos = new Vector2(Mouse.GetState().X, Mouse.GetState().Y);
        Matrix trans = Matrix.CreateTranslation(new Vector3(camTarget.X - (Width / 2), -camTarget.Y + (Height / 2), 0));
        mousePos = Vector2.Transform(mousePos, trans);
        return new PointF(mousePos.X, mousePos.Y);
    }
}

第二种方法应根据网格返回鼠标光标的坐标(其中网格的 (0,0) 点是左上角。

但就是不行。我从矩阵 trans 中删除了缩放转换,因为我无法获得任何有用的结果(大多数时候,坐标非常错误,当网格的大小为 500x500 时,主要是数千个)。

有什么想法或建议吗?两天来我一直在尝试解决这个简单的问题:''

XNA - 鼠标坐标到词空间转换

看看将屏幕空间位置转换为世界空间的 GraphicsDevice.Viewport.Unproject 方法,它基本上以相反的顺序通过您的世界、视图、投影转换。

至于您的变焦问题,与其缩放世界变换,为什么不将相机移近您正在查看的对象?