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

时间:2012-06-09 16:35:17

标签: c# xna transformation

我有一个非常讨厌的问题。我想使用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时,大多数都是数千)。

任何想法或建议?我一直试图解决这个简单的问题两天了:\

1 个答案:

答案 0 :(得分:1)

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

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