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 :

Rotation caméra autour d'un point fixe


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 116
    Par défaut Rotation caméra autour d'un point fixe
    Bonjour,

    Pour m'entrainer j'aimerais programmer un système solaire en openGL avec C++. Le système solaire marche très bien. Ce qui me pose problème c'est de pouvoir faire tourner la caméra autour du système solaire, un peu comme Homeworld (le jeu) ou le principe de rotation de warcraft III (pas de déplacement de caméra, mais bien de rotation). Je précise que la rotation présentée dans les lignes de code qui suivent sont des rotations basées sur la position d'origine de la caméra (je me contente de changer l'angle et de recalculer en fonction de la position de départ).

    Pour ce faire, j'utilise deux méthodes :
    - Le clavier ("q et d" pour la rotation horizontal et "z et s" pour la rotation verticale).
    - La souris (les deux rotations effectuées en même temps)

    La rotation devant se faire autour d'un point fixe, je me contente d'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gluLookAt(cam.x , cam.y , cam.z , 0.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0);
    Dans les deux cas, la rotation horizontale fonctionne parfaitement :
    Clavier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     case 'd':
                  anglex -= vitesse_rotation;
                  cam.x = cos(anglex)*cam.base_x+cam.base_z*(-sin(anglex));
                  cam.z = sin(anglex)*cam.base_x+cam.base_z*cos(anglex);
                  break;
                case 'q':
                  anglex += vitesse_rotation;
                  cam.x = cos(anglex)*cam.base_x+cam.base_z*(-sin(anglex));
                  cam.z = sin(anglex)*cam.base_x+cam.base_z*cos(anglex);
                  break;
    Souris :
    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
    if(cam.rotate_status)
      {
        // traitement du mouvement de la souris en mode rotation
        if(x > cam.mouse_x)
        {
          anglex -= vitesse_rotation_souris;
          moove = true;
        }
        else if(x < cam.mouse_x)
        {
          anglex += vitesse_rotation_souris;
          moove = true;
        }
     
        if(moove)
        {
          if(anglex > 0.0001 || anglex < -0.0001)
          {
            cam.mouse_x = x;
            cam.x = cos(anglex)*cam.base_x+cam.base_z*(-sin(anglex));
            cam.z = sin(anglex)*cam.base_x+cam.base_z*cos(anglex);
          }
          else
          {
            cam.x = cam.base_x;
          }
        }
    Le problème arrive quand on veut faire une rotation verticale. Avec le clavier un problème survient dès lors que la coordonnée Z de la caméra devient négative o_O. Une sorte de symétrie à alors lieu selon le plan ZY (ce qui est à gauche passe à droite) et vice versa.
    Avec la souris c'est encore plus calamiteux puisque de façon très récurrente la caméra se déplace aléatoirement d'un bout à l'autre de la scène... Pourtant le même calcul est effectué :
    Clavier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    case 'z':
                  angley -= vitesse_rotation;
                  cam.y = cos(angley)*cam.base_y+cam.base_z*(-sin(angley));
                  cam.z = sin(angley)*cam.base_y+cam.base_z*cos(angley);
                  break;
                case 's':
                  angley += vitesse_rotation;
                  cam.y = cos(angley)*cam.base_y+cam.base_z*(-sin(angley));
                  cam.z = sin(angley)*cam.base_y+cam.base_z*cos(angley);
                  break;
    Souris :
    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
    if(y > cam.mouse_y)
        {
          angley -= vitesse_rotation_souris;
          moove = true;
        }
        else if(y < cam.mouse_y)
        {
          angley += vitesse_rotation_souris;
          moove = true;
        }
     
        if(moove)
        {
          cam.mouse_y = y;
          cam.y=cos(angley)*cam.base_y+cam.base_z*(-sin(angley));
          cam.z=sin(angley)*cam.base_y+cam.base_z*cos(angley);
        }
    Je commence un peu à m'arracher les cheveux...

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    Salut

    Je pense que ton problème viens du vecteur up de ta camera.
    Tu as toujours le même vecteur up alors qu'il varie en fonction de ton angle "vertical".

    Tu devrais pouvoir résoudre ton problème en regardant du coté des coordonnées sphériques.

    Désolé de pas pouvoir t'aider plus, mais ca fait longtemps que je n’ai pas utilisé la trigo
    PS : Tu as de la chance, j'ai retrouve un prog que j'ai fais pour bien visualisé la camera
    Touche 1 : Vue extérieur pour voir les mouvements de la camera et ses vecteur
    Touche 2 : Vue a partir de la camera
    Click gauche : Rotation autour du point de vue
    Click droit : Rotation autour de la camera (déroutant au début et je suis même pas sur de l'avoir fini )

    Bonne chance
    Fichiers attachés Fichiers attachés

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 116
    Par défaut
    Ok je pense avoir pigé conceptuellement mon erreur...

    ^
    | <- point fixé par le vecteur UP
    |
    |
    |
    |-------------- O <- centre de rotation de la caméra

    Techniquement si la caméra fait une rotation verticale, ce point UP est différent comme tu le dis. Mais alors voilà ma question, à quoi sert de définir le point de visé (ici O centre de rotation) dans le glulookat si on doit aussi changer le UP ?

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    Imagine ta camera comme un référentiel.

    Le point visé te permet de définir un axe (avec la notion de « devant » et « derrières » pour savoir si tu marche à devant ), le vecteur up un second axe pour savoir ou se trouve le « haut » (notion humain, mais fort utile pour savoir si un objet s’envole ou si il tombe ) et un troisieme (pour les cotés « gauche » et « droit » ) peut être trouver par produit vectoriel des autres et avoir ainsi un repère orthonormé.

    Ca c’est pour les coordonnées cartésiennes.

    Pour ma part j’ai utilisé 3 angles (un pour chaque axe) et une distance.

    En prenant comme vecteurs (1,0,0), (0,1,0) et (0,0,1), comme angles (0,0,0) et une distance de d, tu peux trouver la formule pour passer de ce système de coordonnées vers les coordonnées cartésiennes et inversement.

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/09/2013, 08h13
  2. Tournez ligne autour d'un point fixe
    Par hamzazerr dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 04/04/2013, 14h56
  3. Rotation GluLookAt autour d'un point central
    Par Dross dans le forum C++
    Réponses: 5
    Dernier message: 11/07/2011, 11h05

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