簡體   English   中英

XNA C# 使用 3D 模型創建等距視圖

[英]XNA C# creating an Isometric view with 3D models

我正在嘗試制作一個簡單的等距游戲引擎,但相機存在一些問題。 當我擁有它時,我可以從前面看到我的模型。 但我想從等距的角度來看它。 我嘗試了很多方法,但似乎都不起作用。 也許我被代碼本身困住了? 你們能幫我寫代碼嗎?

public class Camera : PositionedObject
{

    #region Fields
    private Matrix cameraRotation;

    #endregion


    #region Properties
    public Matrix View
    {
        get;
        set;
    }

    public Matrix Projection
    {
        get;
        protected set;
    }

    public Vector3 Target
    {
        get;
        set;
    }
    #endregion

    #region Constructor
    public Camera(Game game, Vector3 position, Vector3 target, Vector3 rotation, bool Orthographic, float near, float far)
        : base(game)
    {      
        Position = position;
        RotationInRadians = rotation;
        Target = target;


        if (Orthographic)
        {
            Projection = Matrix.CreateOrthographic(Game.Window.ClientBounds.Width, Game.Window.ClientBounds.Height,
                near, far);
        }
        else
        {
            Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4,
                (float)Game.Window.ClientBounds.Width / (float)Game.Window.ClientBounds.Height, near, far);
        }




    }
    #endregion

    #region Public Methods

    public override void Initialize()
    {
        base.Initialize();
        cameraRotation = Matrix.Identity;

    }



    public override void Update(GameTime gameTime)
    {
        base.Update(gameTime);

        cameraRotation = Matrix.CreateFromAxisAngle(cameraRotation.Forward, RotationInRadians.Z)
            * Matrix.CreateFromAxisAngle(cameraRotation.Right, RotationInRadians.X)
            * Matrix.CreateFromAxisAngle(cameraRotation.Up, RotationInRadians.Y);

        Target = Position + cameraRotation.Forward;
        View = Matrix.CreateLookAt(Position, Target, cameraRotation.Up);
    }

    public void Draw(BasicEffect effect)
    {
        effect.View = View;
        effect.Projection = Projection;
    }
    #endregion
}

最簡單的方法是根據焦點(地面上的點或其他點)計算相機位置。

//Lets start with looking at origo for now.
Vector3 FocusPoint = Vector3.Zero;

//This tells us where the camera should be, RELATIVE to the point we are watching.
//I set this a little up and a little back
Vector3 CameraOffset = new Vector3(0f, 20f, 20f);

Matrix ViewMatrix
{
    get
    {
        //The Offset is just up and back, we need to rotate it 45*
        var rotatedOffset = Vector3.Transform(CameraOffset, Matrix.CreateRotationY(MathHelper.PiOver2 * 0.5f));

        //Now we can create out viewmatrix. No need to use a transformed "up" unless it's not going to be upside down or something.
        return Matrix.CreateLookAt(rotatedOffset, FocusPoint, Vector3.Up);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM