VI. Tutoriel 4. Mouvement de la caméra quaternion▲
Ce tutoriel implémente une simple caméra quaternion que nous pouvons déplacer dans un monde 3D. La classe Camera n'est pas optimisée, donc si vous prévoyez de l'utiliser dans une application en temps réel, envisagez de faire quelques optimisations. J'ai ajouté un brouillard exponentiel au pixel shader. Pour une application en temps réel, il est recommandé de calculer le facteur du brouillard pour chaque vertex et d'écrire le résultat dans une variable varying qui peut être utilisée par le pixel shader. Le tutoriel emploie le multitexturing pour ajouter quelques détails au terrain.
Dans la fonction UpdateControls(const CControlPad& pad) du fichier Tutorial.cpp, pour faire pivoter la camera, nous obtenons premièrement la représentation actuelle du quaternion et la multiplions par la rotation quaternion adéquate selon le type de contrôle reçu (rotation gauche/droite ou haut/bas). Pour faire bouger la caméra, nous prenons sa position actuelle et le vecteur forward et nous changeons la position de la caméra suivant le vecteur forward.
const
float
step =
0.6
f;// Mouvement et vitesse de la vue
// Obtention de la caméra quaternion
const
Quatf&
q =
m_pCamera->
GetQuaternionRepresentation();
if
(pad.keyUp) // Touche haut
{
Quatf rot =
Quatf::
fromAxisRot(vec3i(1
, 0
, 0
), -
step);
Quatf qf =
rot *
q; // Cela va faire tourner la caméra quaternion autour de l'axe x (regarder vers le haut)
m_pCamera->
SetQuaternion(qf);// Définit la nouvelle caméra quaternion
}
if
(pad.keyDown)
{
Quatf rot =
Quatf::
fromAxisRot(vec3i(1
, 0
, 0
), step);
Quatf qf =
rot *
q ; // Cela va faire tourner la caméra quaternion autour de l'axe x (regarder vers le bas)
m_pCamera->
SetQuaternion(qf);
}
if
(pad.keyLeft)
{
Quatf rotX =
Quatf::
fromAxisRot(vec3i(0
, 0
, 1
), -
step);
Quatf qf =
q *
rotX;// Rotation de la caméra autour de l'axe des z, axe vertical
m_pCamera->
SetQuaternion(qf);
}
if
(pad.keyRight)
{
Quatf rotX =
Quatf::
fromAxisRot(vec3i(0
, 0
, 1
), step);
Quatf qf =
q *
rotX;// Rotation de la caméra autour de l'axe des z, axe vertical
m_pCamera->
SetQuaternion(qf);
}
if
(pad.keyMoveUp)
{
vec3f pos =
m_pCamera->
GetPosition();// Position de la caméra
vec3f forward =
m_pCamera->
GetForwardVector();// Vecteur forward de la caméra
pos +=
forward *
step;// Déplacement de la caméra selon le vecteur forward
m_pCamera->
SetPosition(pos);// Application de la nouvelle position
}
else
if
(pad.keyMoveDown)
{
vec3f pos =
m_pCamera->
GetPosition();// Position de la caméra
vec3f forward =
m_pCamera->
GetForwardVector();// Vecteur forward de la caméra
pos -=
forward *
step;// Déplacement de la caméra selon le vecteur forward
m_pCamera->
SetPosition(pos);// Application de la nouvelle position
}