IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Tutoriels iOS


précédentsommairesuivant

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.

 
Sélectionnez
const float step = 0.6f;// 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
    }
Image non disponible

précédentsommairesuivant

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 Abdallah DIB. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.