【问题标题】:Calcul new coords of camera after a 90 degres rotation in a isometric 2D projection在等距 2D 投影中旋转 90 度后计算相机的新坐标
【发布时间】:2013-02-22 00:27:53
【问题描述】:

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

什么工作:

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

什么不起作用:

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

我所知道的:

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

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

插图

【问题讨论】:

    标签: xna camera rendering game-engine isometric


    【解决方案1】:

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

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

    Camera.Orientation = Orientation.East;

    相机应该会自行修复 :)

    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

    【讨论】:

    • 谢谢你的回答,我今晚会测试,但它看起来不错。事实上,对于我的 180° 旋转,对 Pi 进行平移是合乎逻辑的。
    • 我有一个想法,我会尝试进行 1,1 旋转,然后重新应用等距变换。
    • 我正确地旋转了 90°,Vector2(new_camera_x,new_camera_y) = new Vector2(-(old_camera_y - old_camera_height)/2,old_camera_x*2),或者一种。在我的世界中 Z = 0 是正确的,但如果我改变高度,一切都是错误的。所以最后我需要找到我的场景的中心(X Y Z)并围绕它旋转(par matrice ou simple decallage avant/apres)。
    • 我通过计算 tile elligeable 作为屏幕中心解决了我的问题。然后,我拿起最近的一个相机,旋转一圈后,我把它放回屏幕中间。像这样很简单,但最后我必须计算屏幕中心的图块(因为 Z 轴)。
    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多