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Ã.


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

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;
| };




Como siempre, muy bien elaborado.
Muy bueno che, muchas gracias
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.