2013-02-21 3 views
1

Я пытаюсь создать простой изометрический игровой движок, но у вас есть некоторые проблемы с камерой. Когда у меня это так, я могу видеть мою модель спереди. Но я хочу видеть это с изометрической точки зрения. Я пробовал использовать множество методов, но никто не работает. Возможно, я застрял в самом коде? Можете ли вы, ребята, помочь мне с кодом?XNA C#, создающий изометрический вид с 3D-моделями

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 
} 

ответ

0

Самый простой способ - рассчитать положение камеры на основе точки фокусировки (точки на земле или что-то еще).

//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 rotatedOffste = Vector3.Transform(CameraOffset, Matrix.CreateRotationY(MathHelper.PiOverTwo * 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); 
    } 

} 
+0

Спасибо, что мне очень помогли. Я действительно получаю этот прекрасный изометрический вид. Единственная проблема, с которой я сталкиваюсь сейчас, - это то, что она всегда сосредоточена на этом, поэтому, если я перемещаю свою камеру, она не перемещается, как игровая камера. Наверное, потому что я слишком близок к точке фокусировки. Должен ли я просто перемещать все объекты и камеру назад из фокуса или есть способ всегда позволять ему смотреть на определенный угол и действительно создавать изометрический вид при перемещении камеры? Или, конечно, я должен переместить все мои объекты вместо камеры. Какой был бы лучший выбор в этом случае? Спасибо за хороший ответ! – Worempie

+0

Если вы хотите переместить камеру вокруг, вы просто «переместите» FocusPoint, и камера продолжит поддерживать правильное положение и ориентацию относительно этого :) –

+0

Исправлено: D Большое спасибо! – Worempie

 Смежные вопросы

  • Нет связанных вопросов^_^