2

我制作了一个 2D 等距渲染器。它工作正常,但现在我想从 4 个不同的角度(没有 NW SE SW)显示我的场景,但是在 90° 旋转时,我的相机无法将我的场景中心保持在屏幕上。

什么工作:

  • 我计算新的场景投影以匹配新的视口(我的世界中的 xyz)。
  • 我重新组织了我的部分场景(块)以正确的顺序绘制它们
  • 我重新组织“块”的“图块”以正确的顺序绘制它们
  • 我可以通过 180 度的旋转保持正确的中心。

什么不起作用:

  • 旋转 90 度后,我找不到适用于我的相机的正确翻译。

我知道的 :

  • 为了与我的相机保持相同的中心旋转 180°,我必须这样做:

camera.Position -= new Vector2(2 * camera.Position.X + camera.Width, 2 * camera.Position.Y + camera.Height);

插图 从 SE 的角度看 在此处输入图像描述 在此处输入图像描述

4

1 回答 1

1

如果地图的中心是 origo (0,0,0),这很容易:

首先将默认相机位置存储在 Vector3 CameraOffset 中,然后使用旋转矩阵计算位置。redians 中的 90* 是半个 Pi,所以我们将使用 PiOverTwo。我们还将使用枚举来决定要指向的方向,所以你可以说

Camera.Orientation = 方向.东;

并且相机应该自行修复:)

public enum Orientation
{
    North, East, South, West
}

在相机中:

public Vector3 Position { get; protected set; }

Vector3 _CameraOffset = new Vector3(0, 20, 20);
public Vector3 CameraOffset
{
    get
    {
        return _Orientation;
    }

    set
    {
        _Orientation = value;
        UpdateOrientation();
    }
}

Orientation _Orientation = Orientation.North;
public Orientation Orientation
{
    get
    {
        return _Orientation;
    }

    set
    {
        _Orientation = value;
        UpdateOrientation();
    }
}

private void UpdateOrientation()
{
    Position = Vector3.Transform(CameraOffset, Matrix.CreateRotationY(MathHelper.PiOverTwo * (int)Orientation));
}

如果您想在位置之间进行滑行运动,我想我也可以提供帮助;)

如果您的相机没有聚焦于 Vector3.Zero 并且不应该围绕它旋转,您只需要更改:

Position = Vector3.Transform(CameraOffset, Matrix.CreateRotationY(MathHelper.PiOverTwo * (int)Orientation));

至:

Position = Vector3.Transform(CameraOffset, Matrix.CreateRotationY(MathHelper.PiOverTwo * (int)Orientation) * Matrix.CreateTranslation(FocusPoint));

在这里,FocusPoint 是您旋转的 3D 点(您的世界中心)。现在你也知道如何让你的相机四处移动,如果你在你的 Camera.Update() 中调用 UpdateOrientation() ;)

编辑; 很抱歉,完全错过了您使用 2D 的重点。我稍后会回来看看我是否可以提供帮助:P

于 2013-02-22T08:59:36.190 回答