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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API graphiques Discussion :

Gérer une caméra avec des quaternions


Sujet :

API graphiques

  1. #1
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut Gérer une caméra avec des quaternions
    Bonjour à tous

    J'implémente une classe Camera qui me permet de me balader dans mon monde à la 1ère personne. Je suis le tutoriel http://tomdalling.com/blog/modern-op...ors-and-input/

    Ma classe possède une méthode Update qui fait tout le travail de déplacement-orientation d'une caméra.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    /////////////////////////////////////////////////
    void Camera::Update(float dt)
    {
    	double __posX, __posY;
    	glfwGetCursorPos( Window, &__posX, &__posY );
    	glfwSetCursorPos( Window, WINDOW_WIDTH * 0.5, WINDOW_HEIGHT * 0.5 );
     
    	RotationLeftRight += RotationSpeed * float( __posX - WINDOW_WIDTH * 0.5f ) * dt;
    	RotationUpDown += RotationSpeed * float( __posY - WINDOW_HEIGHT * 0.5f  ) * dt;
     
    	glm::quat __orientation;
    	__orientation = glm::rotate( __orientation, RotationUpDown, VEC3_RIGHT );
    	__orientation = glm::rotate( __orientation, RotationLeftRight, VEC3_UP );
     
    	glm::quat __inverse = glm::inverse( __orientation );
     
    	glm::vec3 __direction = __inverse * VEC3_FORWARD;
    	glm::vec3 __right = __inverse * VEC3_RIGHT;
    	glm::vec3 __up = __inverse * VEC3_UP;
     
    	if ( glfwGetKey( Window, GLFW_KEY_Z ) )
    	{
    		Position += __direction * MotionSpeed * dt;
    	}
     
    	if ( glfwGetKey( Window, GLFW_KEY_Q ) )
    	{
    		Position -= __right * MotionSpeed * dt;
    	}
     
    	if ( glfwGetKey( Window, GLFW_KEY_S ) )
    	{
    		Position -= __direction * MotionSpeed * dt;
    	}
     
    	if ( glfwGetKey( Window, GLFW_KEY_D ) )
    	{
    		Position += __right * MotionSpeed * dt;
    	}
     
    	ViewMatrix = glm::lookAt( Position, Position + __direction, __up );
    }
    D'abord je récupère les positions X et Y de la souris, ensuite je calcule le delta par rapport à la frame précédente et je cumule ce delta dans deux variables qui représente mes des angles de rotation à l'instant T. Je stocke ensuite ces rotations dans un quaternion, puis je calcule les vecteurs direction, right et up. Je fourni enfin ces trois vecteurs à la fonction lookAt pour obtenir la matrice de vue de la caméra.
    Il y a cependant quelque chose que je ne comprends pas: pourquoi est-ce que je dois utiliser le quaternion inverse de ma rotation pour que cela fonctionne correctement ? L'auteur l'explique dans son article mais je n'ai pas bien compris le principe

    Merci
    Kromagg
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Je suis mauvais en math donc je pourrais pas te dire pourquoi il faut utiliser quaternion inverse.
    Par contre j'ai juste 2 remarque a faire , perso et pour un jeu je déconseille de coder hardcore la camera avec directement les input de la lib , l'autre pour la caméra (a la 1ere ou a la 3eme personne) un simple cos/sin suffit pour gérer la rotation de la camera et son deplacement.

    D'abord je récupère les positions X et Y de la souris, ensuite je calcule le delta par rapport à la frame précédente et je cumule ce delta dans deux variables qui représente mes des angles de rotation à l'instant T
    Je trouve la méthode un poil 'complexe'.
    Si cela t’intéresse je considérer la position de x(allant de -1 gauche de ecran a 1 droite de ecran) et y (pareil que x) comme le 'déplacement' d'angles , et ça rendait très bien.

  3. #3
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    Perso et pour un jeu je déconseille de coder hardcore la camera avec directement les input de la lib
    En fait je suis les tutoriels OpenGL ici et donc je reste dans du code très simple. Mais pour un vrai jeu oui, je sortirai le code de contrôle de la caméra, pour le mettre dans une classe contrôleur ou quelque chose du genre

    Citation Envoyé par Kannagi Voir le message
    Pour la caméra (a la 1ere ou a la 3eme personne) un simple cos/sin suffit pour gérer la rotation de la camera et son deplacement.
    J'imagine que tu veux parler des coordonnées sphériques. J'ai implémenté la caméra comme ça dans une version précédente et puis j'ai voulu essayé directement avec les fonctions GLM. Et ça tombe bien parce que j'ai ce problème d'inverse que je ne comprend pas

    Citation Envoyé par Kannagi Voir le message
    Si cela t’intéresse je considérer la position de x(allant de -1 gauche de ecran a 1 droite de ecran) et y (pareil que x) comme le 'déplacement' d'angles , et ça rendait très bien.
    Je vais essayer ça
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  4. #4
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    En fait je suis les tutoriels OpenGL ici et donc je reste dans du code très simple. Mais pour un vrai jeu oui, je sortirai le code de contrôle de la caméra, pour le mettre dans une classe contrôleur ou quelque chose du genre
    Après chaqu'un ces priorités surement , mais bon en général quand je commence (avec une nouvelle lib en général , parce que le code risque pas de changée pendant plusieurs années) , je commence par le fenêtrage/événement/fps.

    J'imagine que tu veux parler des coordonnées sphériques. J'ai implémenté la caméra comme ça dans une version précédente et puis j'ai voulu essayé directement avec les fonctions GLM. Et ça tombe bien parce que j'ai ce problème d'inverse que je ne comprend pas
    Oui je parle bien des coordonnés sphériques , après c'est un peu le choix entre utiliser ces propre formules ou utiliser les formules de quelqu'un autre , tout dépend de ce qu'on veut , on général j'utilise les formules que je ne comprend pas quand j'ai pas le choix , sinon je privilégie les formules simple que je comprend facilement.

    Je vais essayer ça
    si t'as un souci n'hésite pas ,après il faut évidement que la souris soit capturé par le jeu et au centre de la fenêtre.

  5. #5
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut
    J'ai oublié de donner l'explication de l'auteur à propos de cette fameuse inversion

    The first thing we will look at is the use of glm::inverse. From the last article, we know that matrices transform coordinates. In certain situations, we also want to “untransform” coordinates. That is, we want to take a transformed coordinate and calculate what it used to be, before it was transformed by matrix multiplication. To do this, we need to calculate the inverse of the matrix. An inverse matrix is a matrix that does the exact opposite of another matrix, which means it can “undo” the transformation that the other matrix produces. For example, if matrix A rotates 90° around the Y axis, then the inverse of matrix A will rotate -90° around the Y axis.

    When the direction of the camera changes, so does the “up” direction. For example, imagine that there is an arrow pointing out of the top of your head. If you rotate your head to look down at the ground, then the arrow tilts forward. If you rotate your head to look up at the sky, the arrow tilts backwards. If you look straight ahead, then your head is completely “unrotated,” so the arrow points directly upwards. The way we calculate the up direction of the camera is by taking the “directly upwards” unit vector (0,1,0) and “unrotate” it by using the inverse of the camera’s orientation matrix. Or, to explain it differently, the up direction is always (0,1,0) after the camera rotation has been applied, so we multiply (0,1,0) by the inverse rotation, which gives us the up direction before the camera rotation was applied.

    The same trick is used to calculate the forward and right directions of the camera.
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Vous suivez la série en cours de traduction/publication ici : http://jeux.developpez.com/tutoriels/OpenGL-moderne/

    Après, dans le cas de tomdalling.com, il explique que si on regarde trop vers le haut (rotation à plus de 90° vers le haut), alors, on se "retourne", du coup, lorsque l'on fait la transformation de la caméra, rien ne va plus.
    C'est aussi le cas lorsque l'on regarde en bas, il y a un moment, on a la tête entre les jambes et on continue à essayez de regarder plus vers le "bas" (ce qui hypothétiquement, ou, dans un dessin animé), nous permet de continuer à tourner, en passant entre les jambes (et là, ce message devient strange), mais bref, une fois que l'on passe le cap des -90°, la camera est comme "retournée" et donc coup, lorsque l'on essaie d'aller à gauche, ça part à droite, ou inversement.
    Lui, il dit :
    Pour éviter cela, je zappe la rotation (je l'annule (ou je reviens en arrière) avec le inverse), et je fais mes calculs, tranquille, dans mon coin.

    D'autres (la méthode qui serait applicable pour les Tutoriels OpenGL moderne, c'est de dire : ok, on ne va pas plus bas et pas plus haut que (-)89°. Ça marche aussi , doit y avoir pas mal de jeux qui le font
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Réponses: 13
    Dernier message: 30/05/2012, 10h42
  2. Problème avec une caméra utilisant les quaternions
    Par Bakura dans le forum Développement 2D, 3D et Jeux
    Réponses: 17
    Dernier message: 15/12/2007, 19h26
  3. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00
  4. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo