XNA / C#2D世界矩阵中的坐标缩放到3D视图矩阵?

时间:2011-08-17 16:33:54

标签: c# matrix xna camera

这是我的变形。我从一个简单的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距离。

我对编程非常陌生,对矩阵一般只有一个简单的理解。我对XNA如何在draw方法中使用它们的理解甚少。到目前为止,我觉得我的头发是从无用的搜索中解脱出来的......我只需要世界坐标来缩放比例,这样在我的鼠标前进行预缩放X.60 Y.60将在X .600 Y.600变焦后(即:缩放级别0.1)。但是我的鼠标没有移动,只有世界变得更大(或缩小)。

3 个答案:

答案 0 :(得分:1)

我知道这个问题很老,但是如果有人遇到这个问题并且无法找到解决方案。 @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 :(得分:0)

您正在使用2D坐标,因此Z坐标绝对不重要。实际上,您使用的比例矩阵(Matrix.CreateScale(new Vector3(Zoom, Zoom, 0)))将Z坐标乘以0,有效地将其设置为0.

由于此比例矩阵位于视图矩阵中,因此它将扩展整个世界。我不确定是否真的了解你的问题。你能尝试解释一下吗?

答案 2 :(得分:0)

我似乎已经想出如何让坐标得以扩展...

我假设当前鼠标状态会反映其点击的世界矩阵,但显然它实际上从未实现过。它始终链接到视图矩阵。 (屏幕本身)和该值需要与世界矩阵(在变换中)一起缩放。

因为变换是通过放大Matrix.CreateScale(新的Vector3(缩放,缩放,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);
        }
    }