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

OpenGL Discussion :

Camera FPS d'un vaisseau


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Par défaut Camera FPS d'un vaisseau
    Bonjour;
    Je souhaiterai faire en sorte de placer ma caméra en vue FPS par rapport à la position d'un vaisseau.

    Considérons le vaisseau comme un simple cône.
    On connait sa position (x, y, z); et son angle de direction (teta, phi).

    Pour placer ma caméra, voici comment je procède;
    Je calcule tout d'abord le vecteur de direction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    vx = cos(teta)*cos(phi);
    vz = sin(teta)*cos(phi);
    vy = sin(phi);
    y étant mon axe vertical.

    Ainsi, je positionne ma caméra:
    [code]
    gluLookAt(x, y, z, x+vx, y+vy, z+vz);
    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
    
    Là, ça fonctionne; je me retrouve avec une vue au centre du vaisseau. Bref, c'est moche.
    J'aimerai maintenant avoir la vue non pas au centre, mais surélevé au dessus du vaisseau.
    
    Pour cela, je me dis qu'il faut simplement calculer le vecteur orthogonale au vecteur de direction, et d'ajouter cette translation. Je me casse pas la tête, je procède donc ainsi:
    
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    123
    vox = cos(teta)*cos(phi+90°);
    voz = sin(teta)*cos(phi+90°);
    voy = sin(phi+90°);
    gluLookAt(x+vox, y+voy, z+voz, x+vx, y+vy, z+vz);
    Ok, je teste; à premier coup d'oeil ça fonctionne;
    Cependant, si je commence à bouger le vaisseau et modifier en conséquence l'angle Phi; voilà que par moment, la position de vue switches et je me retrouve avec une vue non plus au dessus du vaisseau, mais par dessous; et si je continue à tourner, la vue repasse au dessus.

    Et je n'arrive pas à trouver pourquoi. J'ai regardé à quelles angles ce phénomènes se passaient, et cela se passe à 135° et 315°... Pourquoi?

    Je pense donc à la façon de calculer le vecteur normal qui n'est pas forcément la mieux adaptée. Quelqu'un aurait il une meilleure solution?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut, j'ai eu exactement ton problème une fois (le gimbal lock) et j'utilisais deux angles comme toi.

    Je te conseille de maintenir un état de ta rotation actuelle, par exemple composée de 3 vecteur :
    - un qui pointe vers la droite de ton vaisseau
    - un qui pointe vers son haut
    - un qui pointe devant lui

    Ensuite il sera facile de recréer la camera à partir de ces informations.

    En fait cette rotation tu peux la représenter de diverses manières, selon tes préférences :
    - avec ces trois vecteurs,
    - une matrice 3x3 (composée de ces vecteurs, en fait c'est pareil),
    - ou un quaternion.

    Dans tous les cas il faudra penser à ce que ta rotation reste une rotation :
    - "reorthonormaliser" dans le cas de matrice 3x3 ou 3 vecteur, c'est à dire vérifier qu'ils sont de longueur unitaire et orthogonaux.
    - ou normaliser ton quaternion

    Un tel système n'aimera pas les rotations trop rapides ! Mais ça marche la plupart du temps et ça rend le damping de ta caméra très facile.

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 126
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Je vous conseille la lecture du tuto de Riemers (soit, pour les jeux XNA, mais il fait exactement ce dont vous avez besoin). Le dernier problème, c'est d'avoir une classe de Quaternion toute fait ... (Pour cela, il y a la FAQ Mathématique de DVP)
    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.

  4. #4
    Membre chevronné
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Par défaut
    Merci à tous pour vos réponses.
    Je suis allé jeter un coup d'oeil aux tutoriaux de Riemers; et j'ai vite compris quel chapitre m'intéressait:
    http://www.riemers.net/eng/Tutorials...uaternions.php

    Si j'ai donc bien compris, un Quaternion permet de calculer un vecteur de direction en passant en paramètre un vecteur axe de rotation et un angle.
    On se retrouve alors avec 3 attributs calculés : x, y et z représentant le vecteur de direction; mais je ne comprends pas ce qu'est w.

    Comme c'est sur Android, j'ai facilement trouvé des classes Quaternions toutes faites:
    https://github.com/halfninja/android...uaternion.java
    http://code.google.com/p/libgdx/sour...uaternion.java

  5. #5
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 817
    Par défaut
    Citation Envoyé par ZouBi Voir le message
    Si j'ai donc bien compris, un Quaternion permet de calculer un vecteur de direction en passant en paramètre un vecteur axe de rotation et un angle.
    Oui et non. Un quaternion est un quaternion. Ca peut être converti en matrice de roation, ou en un axe orienté (ou vecteur) et un angle.
    Et inversement, on peut obtenir un quaternion soit à partir d'une matrice de rotation, soit à partir d'un vecteur et d'un angle.

    Et tu t'en sert pour déterminer le transformé d'un vecteur par une rotation dans l'espace. En gros, le quaternion remplace toutes tes formules avec des cosinus et des sinus.


    Citation Envoyé par ZouBi Voir le message
    On se retrouve alors avec 3 attributs calculés : x, y et z représentant le vecteur de direction; mais je ne comprends pas ce qu'est w.
    l'angle de la rotation. Enfin, pas directement, mais ça y correspond (en fait, c'est le cosinus de l'angle de la rotation)
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  6. #6
    Membre chevronné
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Par défaut
    Le truc c'est que je vais gérer deux choses avec ce Quaternions;
    La position et l'angle de vue de la caméra (apparemment simple avec ceci); mais aussi la rotation du vaisseau ; et là ce dernier comment je peux faire sachant qu'avant j'avais bien l'angle des rotations et j'utilisais glRotate, mais maintenant, que je les ai remplacé par ce Quaternions, comment puis je faire?

Discussions similaires

  1. [Bullet] Collision d'une camera FPS
    Par razmott dans le forum Bullet
    Réponses: 7
    Dernier message: 27/03/2007, 13h59
  2. Camera - Directx3D
    Par oxor3 dans le forum DirectX
    Réponses: 3
    Dernier message: 20/09/2003, 00h47
  3. (Debutant) resolution et fps
    Par silverdelph dans le forum DirectX
    Réponses: 4
    Dernier message: 12/07/2003, 12h50
  4. [MFC]Calculer les FPS
    Par inerti@ dans le forum MFC
    Réponses: 6
    Dernier message: 19/03/2003, 18h22
  5. Texte // camera
    Par logramme dans le forum DirectX
    Réponses: 1
    Dernier message: 10/08/2002, 21h05

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