2D 等距相机矩阵

本文关键字:相机 2D | 更新日期: 2023-09-27 18:34:58

我有一个用笛卡尔坐标系布置的小游戏关卡。我有一个相机类,我想使用以下矩阵将所有点从笛卡尔空间转换为等距空间:

[cos(45(, sin(45(]

[-sin(45(, cos(45(]

纸面上,将任何向量乘以矩阵可以成功地将该向量在第一次旋转后放入等轴测空间。

现在,我只能使用此矩阵根据摄像机位置绘制关卡:

public Matrix GetTransformation()
    {
        _mTransform =
            Matrix.CreateTranslation(-Position.X, -Position.Y, 0);
        return _mTransform;
    }

感到困惑的是我上面列出的矩阵在哪里适合该等式。

CameraIso2D不带任何参数,但这里是Draw函数

public void Draw(SpriteBatch sb)
    {
        // Start drawing from this GameLayer
        sb.Begin(
            SpriteSortMode.FrontToBack,
            BlendState.AlphaBlend,
            null,
            null,
            null,
            null,
            _transformation);
        // Draw all contained objects
        foreach (DrawableGameObject dgo in _drawableGameObjects)
            dgo.Draw(sb);
        // End drawing from this GameLayer
        sb.End();
    }

_transformation是每次更新从CameraIso2D返回_mTransform矩阵

2D 等距相机矩阵

我通过使用两个矩阵解决了这个问题。第一个矩阵使用常规相机转换,并作为转换矩阵传递到 spriteBatch.Begin 中。对于等轴测变换矩阵,我使用 Matrix.CreateRotationZ 模拟等轴测 Y 轴旋转,然后使用 Matrix.CreateScale 模拟从 Y 轴向下的等轴旋转。游戏对象需要一个位置来表示笛卡尔坐标,一个矢量 2 来表示它们的等轴测坐标。通过等轴测变换矩阵传递游戏对象的笛卡尔坐标以获取等轴测坐标,然后绘制到该位置。