quarta-feira, 27 de julho de 2011

XNA 4.0 - Parte 5, Camera livre.

Vamos agora criar uma câmera livre, que pode ir a qualquer lugar do mapa e é controlada por mouse e teclado. Crie uma classe MouseCamera dentro da pasta Cameras, já foi dito como se cria classes. Vamos adicionar using Microsoft.Xna.Framework;

A classe MouseCamera extende de BaseCamera então nossa classe está assim:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;

namespace Tutorial1.GameBase.Cameras
{
class MouseCamera : CameraBase
{

}
}

Como a classe MouseCamera extende de BaseCamera, que é publica, então nossa nova classe será publica sem precisar especificarmos.

Nossa classe precisa de uma variável para definir o quando ela está rodando para os lados e outra para cima e precisa tambem de 2 constantes, uma de velocidade da câmera e outra de velocidade de rotação.

float leftrightRot = MathHelper.PiOver2;
float updownRot = -MathHelper.Pi / 10.0f;
const float rotationSpeed = 0.3f;
const float moveSpeed = 3.0f;

Use o procedimento "Encapsulate Field" para as 4, as duas ultimas que são constantes não terão o método set{}, pois são constantes e esses valores não devem mudar.

Vamos agora criar o método construtor da nossa classe.

public MouseCamera(float aspectRatio)
: base()
{
SetLookAt(new Vector3(8.0f, 0.0f, 0.0f), Vector3.Zero, Vector3.Up);
SetPerspectiveFov(MathHelper.ToRadians(this.Fovy), aspectRatio, this.NearPlane, this.FarPlane);
}

Nós já passamos por essas linhas algumas vezes e já sabemos o que elas fazem, cria a posição de visão e tudo o que será visto. E pra finalizar vamos sobreescrever os métodos Update() e addcameraPosition(), usaremos "override" para sobreescrever.

public override void Update(GameTime gametime)
{
Matrix cameraRotation = Matrix.CreateRotationX(updownRot) * Matrix.CreateRotationY(leftrightRot);

Vector3 cameraOriginalTarget = new Vector3(0, 0, -1);
Vector3 cameraRotatedTarget = Vector3.Transform(cameraOriginalTarget, cameraRotation);
Vector3 cameraFinalTarget = Position + cameraRotatedTarget;

Vector3 cameraOriginalUpVector = new Vector3(0, 1, 0);
Vector3 cameraRotatedUpVector = Vector3.Transform(cameraOriginalUpVector, cameraRotation);

SetLookAt(new Vector3(Position.X, Position.Y, Position.Z), cameraFinalTarget, cameraRotatedUpVector);
base.Update(gametime);
}

E aqui novamente já sabemos o que cada linha faz. A primeira linha cria a rotação nos eixos X e Y e o restante das linhas atualizão a câmera. Agora o método addToCameraPositio()

public override void addToCameraPosition(Vector3 vectorToAdd)
{
Matrix cameraRotation = Matrix.CreateRotationX(updownRot) * Matrix.CreateRotationY(leftrightRot);
Vector3 rotatedVector = Vector3.Transform(vectorToAdd, cameraRotation);
Position += moveSpeed * rotatedVector;
}

Esse método recebe um valor e atualiza a posição da câmera de acordo com o que é passado.

O código de Nossa Camêra fica assim:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;

namespace Tutorial1.GameBase.Cameras
{
class MouseCamera : CameraBase
{

#region Variáveis

float leftrightRot = MathHelper.PiOver2;
float updownRot = -MathHelper.Pi / 10.0f;
const float rotationSpeed = 0.3f;
const float moveSpeed = 3.0f;
#endregion

#region Propriedades

public float LeftrightRot
{
get { return leftrightRot; }
set { leftrightRot = value; }
}

public float UpdownRot
{
get { return updownRot; }
set { updownRot = value; }
}

public float RotationSpeed
{
get { return rotationSpeed; }
}

public float MoveSpeed
{
get { return moveSpeed; }
}

#endregion

#region Método Construtor da Classe
public MouseCamera(float aspectRatio)
: base()
{
SetLookAt(new Vector3(8.0f, 0.0f, 0.0f), Vector3.Zero, Vector3.Up);
SetPerspectiveFov(MathHelper.ToRadians(this.Fovy), aspectRatio, this.NearPlane, this.FarPlane);
}
#endregion

#region Métodos Update e addToCameraPosition
public override void Update(GameTime gametime)
{
Matrix cameraRotation = Matrix.CreateRotationX(updownRot) * Matrix.CreateRotationY(leftrightRot);

Vector3 cameraOriginalTarget = new Vector3(0, 0, -1);
Vector3 cameraRotatedTarget = Vector3.Transform(cameraOriginalTarget, cameraRotation);
Vector3 cameraFinalTarget = Position + cameraRotatedTarget;

Vector3 cameraOriginalUpVector = new Vector3(0, 1, 0);
Vector3 cameraRotatedUpVector = Vector3.Transform(cameraOriginalUpVector, cameraRotation);

SetLookAt(new Vector3(Position.X, Position.Y, Position.Z), cameraFinalTarget, cameraRotatedUpVector);
base.Update(gametime);
}

public override void addToCameraPosition(Vector3 vectorToAdd)
{
Matrix cameraRotation = Matrix.CreateRotationX(updownRot) * Matrix.CreateRotationY(leftrightRot);
Vector3 rotatedVector = Vector3.Transform(vectorToAdd, cameraRotation);
Position += moveSpeed * rotatedVector;
}
#endregion

}
}

Nenhum comentário:

Postar um comentário