XNA/C#从世界矩阵到三维视图矩阵的二维坐标缩放?

XNA/C#从世界矩阵到三维视图矩阵的二维坐标缩放?,c#,matrix,xna,camera,C#,Matrix,Xna,Camera,这是我的转变。我是从一个简单的2D相机的例子中得到的 public Matrix Transform(GraphicsDevice graphicsDevice) { float ViewportWidth = graphicsDevice.Viewport.Width; float ViewportHeight = graphicsDevice.Viewport.Height; matrixTransform =

这是我的转变。我是从一个简单的2D相机的例子中得到的

    public Matrix Transform(GraphicsDevice graphicsDevice)
    {
        float ViewportWidth = graphicsDevice.Viewport.Width;
        float ViewportHeight = graphicsDevice.Viewport.Height;

        matrixTransform =
          Matrix.CreateTranslation(new Vector3(-cameraPosition.X, -cameraPosition.Y, 0)) *
              Matrix.CreateRotationZ(Rotation) *
              Matrix.CreateScale(new Vector3(Zoom, Zoom, 0)) *
              Matrix.CreateTranslation(
                    new Vector3(ViewportWidth * 0.5f, ViewportHeight * 0.5f, 0));
        return matrixTransform;
    } 
如果我理解正确,它允许滚动(旋转),缩放时精灵比例的变化,以及世界和相机之间的平移,以实现简单的上、下、左、右控制。但是,它不会改变Z深度

但我需要的是游戏世界的缩放,而不仅仅是绘制的精灵。我假设为了做到这一点,我需要改变相机和世界矩阵之间的Z距离

    //Offsets any cam location by a zoom scaled window bounds
    Vector2 CamCenterOffset
    {
        get { return new Vector2((game.Window.ClientBounds.Height / Zoom)
             * 0.5f, (game.Window.ClientBounds.Width / Zoom) * 0.5f);
        }
    }

    //Scales the mouse.X and mouse.Y by the same Zoom as everything.
    Vector2 MouseCursorInWorld
    {
        get
        {
            currMouseState = Mouse.GetState();
            return cameraPosition + new Vector2(currMouseState.X / Zoom,
                currMouseState.Y / Zoom);
        }
    }

我对编程非常陌生,对矩阵的理解也很简单。对于XNA如何在绘图方法中使用它们,我的理解甚至更少。到目前为止,我想从徒劳的寻找答案中解脱出来。。。我只需要在缩放时缩放世界坐标,这样我的鼠标在缩放前X.60 Y.60将在缩放后X.600 Y.600(即:缩放级别0.1)。但是我的鼠标没有移动,只是世界变得更大了(或者缩小了)

您使用的是2D坐标,因此Z坐标绝对不重要。事实上,您正在使用的比例矩阵(
matrix.CreateScale(新矢量3(缩放,缩放,0))
)将Z坐标乘以0,有效地将其设置为0


由于此比例矩阵位于视图矩阵中,因此它将缩放整个世界。我不确定是否真的理解你的问题。请你再解释一点好吗?

我似乎已经知道如何使坐标按比例缩放了

我假设当前的鼠标状态会反映其点击的世界矩阵,但显然它从来没有这样做过。它始终链接到视图矩阵。(屏幕本身)并且该值需要与世界矩阵(在变换中)一起缩放

因此,当变换受到矩阵中缩放的影响时,CreateScale(新矢量3(缩放,缩放,0))也需要对mouseState X&Y坐标进行缩放,以虚拟镜像世界矩阵

    //Offsets any cam location by a zoom scaled window bounds
    Vector2 CamCenterOffset
    {
        get { return new Vector2((game.Window.ClientBounds.Height / Zoom)
             * 0.5f, (game.Window.ClientBounds.Width / Zoom) * 0.5f);
        }
    }

    //Scales the mouse.X and mouse.Y by the same Zoom as everything.
    Vector2 MouseCursorInWorld
    {
        get
        {
            currMouseState = Mouse.GetState();
            return cameraPosition + new Vector2(currMouseState.X / Zoom,
                currMouseState.Y / Zoom);
        }
    }

我知道这个问题由来已久,但这是为了防止任何人遇到这个问题而找不到解决方案@RogueDeus在用相机放大或缩小时试图转换缩放输入坐标。要缩放鼠标,只需获得缩放的逆矩阵

因此,如果他的比例矩阵是这样创建的:

Matrix.CreateScale(zoom, zoom, 0);
鼠标坐标应反向缩放,并通过必要的平移进行移动:

float ViewportWidth = graphicsDevice.Viewport.Width;
float ViewportHeight = graphicsDevice.Viewport.Height;

Matrix scale = Matrix.CreateScale(zoom, zoom, 0);
Matrix inputScalar = Matrix.Invert(scale);

...

public MouseState transformMouse(MouseState mouse)
{
    /// Shifts the position to 0-relative
    Vector2 newPosition = new Vector2(mouse.X - ViewportWidth,
                                      mouse.Y - ViewportHeight);

    /// Scales the input to a proper size
    newPosition = Vector2.Transform(newPosition, InputScalar);

    return new MouseState((int)newPosition.X, (int)newPosition.Y,
                          mouse.ScrollWheelValue, mouse.LeftButton,
                          mouse.MiddleButton, mouse.RightButton,
                          mouse.XButton1, mouse.XButton2);
}

我目前正在消化这个矩阵教程,希望它能帮助我理解我做错了什么。您是否尝试过更改视口宽度和视口高度?我认为这可能会产生你想要的效果。所有这些似乎只是改变相机的位置。仍然在窗口中获得相同数量的坐标。无论缩放级别如何,它们似乎都锁定在1:1。你能提供获取鼠标在世界坐标中位置的代码吗?我算出了。。。但我的名声使我在接下来的4个小时内无法回答自己的问题。。。对不起,伙计们。例句:我在600600位置(右下角)点击鼠标,我得到了600600的世界定位回报。我缩小到0.1,因此屏幕上应该有10倍的坐标,所以在不移动鼠标的情况下,我应该能够在相同的位置单击,但得到一个离上一个世界坐标远得多的坐标。。。但当我这样做时,它仍然返回600600。因此,我移动我的相机+25,+25(仍然没有移动鼠标)并单击,返回一个新的世界坐标625625。因此我知道我得到的是世界坐标,而不是视图坐标。但世界坐标根本不随我的缩放级别缩放。这会对任何以鼠标单击为中心的尝试或使用世界点位置将相机旋转到适当位置的其他功能造成严重破坏。毕竟,缩小(查看更多)才是关键。。。但是,选择应该在几英里之外的东西,只会使相机移动几英尺,因为实际坐标并没有按看到的距离缩放。我希望这是有意义的?..@Eilistraee通常最好将Z刻度设置为1(无变化)。将Z缩放到0可能会在各种情况下导致问题。感谢您提供的信息。我会修好的。