Implementando la clase “Cámara”

En este tutorial aprederemos como crear una clase que encapsule el manejo de una cámara en un mundo 3D. Está codificado en C++ utilizando DirectX 8 pero fácilmente podría ser convertido a otros lenguajes utilizando otras librerías como OpenGL.

El punto desde el cual observamos una escena está determinado por la matriz de vista, mientras que el modo en que la vemos y cuanto vemos de ella está determinado por la matriz de proyección. Es conveniente poseer en nuestro juego una clase que encapsule los componentes necesarios para crear una matriz de vista adecuada a nuestros fines en cada caso (aunque también dependiendo de la flexibilidad que deseemos lograr podría ser necesario tener componentes para crear una matriz de proyección).
Nuestra clase que llamaremos “Camera” podrá moverse por el entorno y rotar por medio de los tres ejes posibles (X, Y, Z).

De este modo su manipulación será muy sencilla y podremos utilizarla para navegar por el terreno o mapa de nuestros juegos libremente o para que represente un jugador o vehículo del mismo (al estilo de un FPS).

Definiremos para la cámara cuatro vectores a ser:

+ Posición (punto de visualización de la escena).
+ Vector dirección (vector normalizado que indica hacia donde mira la cámara).
+ Vector arriba (vector normalizado que indica cuál es el arriba de cámara).
+ Vector derecha (vector normalizado que indica cuál es la derecha de la cámara).

Los dos últimos vectores serán de orientación de la cámara y deben ser siempre perpendiculares entre sí.

camera-fig1camera-fig2

 

La cámara podrá realizar ciertas operaciones básicas de rotación y traslación a ser:

Rotación:

+ Roll
+ Pitch
+ Yaw

Traslación:

+ Caminar
+ Strafe
+ Volar

Movimientos posibles de la cámara

camera-fig3

Implementación de una clase cámara

La clase que represente la cámara deberá poseer como propiedades los vectores anteriomente citados y métodos que permitan cambiar sus valores de modo que la relación entre ellos siga siendo correcta.


| class Camera
| {
| public:
| enum eCameraType { ECT_GROUND, ECT_AIR };
|
| // Constructor
| Camera();
| Camera(Vector3 v3Pos);
| Camera(float fPosX, float fPosY, float fPosZ);
|
| // Destructor
| ~Camera();
|
| // Fija la matrix de vista en función de cámara
| void Draw(float fTimeBetweenFrames);
|
| // Fija la posición de la cámara
| void SetPos(Vector3 & v3Pos);
| // Fija la dirección de la cámara
| void SetLookAt(Vector3 & v3Look) { m_v3Look = v3Look; }
| // Fija un punto hacia donde mira la cámara
| void SetLookPos(Vector3 & v3LookPos);
| // Rotaciones
| void Pitch(float fAngle);
| void Yaw(float fAngle);
| void Roll(float fAngle);
| // Traslaciones
| void Walk(float fValue);
| void Fly(float fValue);
| void Strafe(float fValue);
|
| private:
| // Posición de la cámara
| Vector3 m_v3Pos;
| // Hacia adonde mirá la cámara
| Vector3 m_v3Look;
| // Vector "arriba" de la cámara
| Vector3 m_v3Up;
| // Vector derecha de la cámara
| Vector3 m_v3Right;
|
| // Tipo de cámara
| eCameraType m_cameraType;
| };

Pages: 1 2 3

Comments

  1. Novack
    May 13th, 2007 | 22:25

    Como siempre, muy bien elaborado.

  2. Master-Blaster
    May 22nd, 2007 | 0:33

    Muy bueno che, muchas gracias

  3. arzak
    June 22nd, 2008 | 15:41

    muy bueno, me aclaró todas mis dudas. Estoy haciendo una clase en opengl, así que te la enviaré para que la publiques, cuando la termine.

Leave a reply