Monogame / Xna - 等轴测视图

时间:2018-04-21 13:10:48

标签: 3d xna monogame

我正在尝试在Monogame中实现等距效果,到目前为止我的视觉效果还不错,但我不确定我为视图和投影矩阵编写的代码是否正确。

所以这就是我为Camera类所做的:

    public class Camera
    {
        GraphicsDevice graphicsDevice;

        public Vector3 position = new Vector3(0, 0, 10);
        public Vector3 lookAtVector = new Vector3(0, 0, 0);
        public Matrix ViewMatrix
        {
            get
            {
                var upVector = Vector3.UnitZ;

                return Matrix.CreateLookAt(Vector3.Transform(position, Matrix.CreateFromYawPitchRoll(MathHelper.ToRadians(45), MathHelper.ToRadians(35), 0)),
                    Vector3.Transform(lookAtVector, Matrix.CreateFromYawPitchRoll(MathHelper.ToRadians(45), MathHelper.ToRadians(35), 0)), 
                    upVector);
            }
        }

        public Matrix ProjectionMatrix
        {
            get
            {
                return Matrix.CreateOrthographic(50, 38, -100, 500);
            }
        }

        public Camera(GraphicsDevice graphicsDevice)
        {
            this.graphicsDevice = graphicsDevice;
        }

        public void Update(GameTime gameTime)
        {

        }
    }

当我绘制一些图块时会创建以下内容:

enter image description here

现在从我所看到的,偏航应该是45度,并且音高应该是30度才能达到我想要的效果,但是如果我将音高设置为30则使用上面的代码它看起来很扭曲所以我已经不得不把它提高到35,我认为它看起来不错。

我对3D编程很陌生,所以也许我的方法不是最好的,任何建议都会非常感激。仅供参考我正在将变换应用于视图矩阵的位置和目标矢量,以便我能够移动相机。

提前致谢!

1 个答案:

答案 0 :(得分:0)

我不确定你在哪里30°。正确的仰角约为35.3°。

如果使用CreateLookAt函数,则有一种更简单的方法,因为视图方向始终是立方体对角线。为此,我们假设您的相机有一个target位置,正在查看viewDistance。然后,视图矩阵是:

Matrix.CreateLookAt(target + new Vector3(1, 1, -1) * viewDistance, target, upVector)

您可以更改对角线矢量(1, 1, -1)中的符号以匹配您想要的视图。