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 (eviter les quaternions)


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut Camera (eviter les quaternions)
    Bonjour bonjour

    Alors j'ai épuré le net à la recherche d'une réponse sans la trouvé :'(

    Donc je viens la posé ici


    J'ai une caméra que je veux deplacer, mais aucun moment l'utilisateur n'aura l'occasion de faire lui meme ce deplacement. Donc je me disais qu'un simple :

    gluLookAt(pos.x, pos.y, pos.z, target.x, target.y, target.z, 0.0, 1.0, 0.0);

    Ca marchait bien jusqu'a ce que je ma position sur X et change, et la malheur, l'a caméra se met a pencher . Donc je me dis qu'il faut taquiner un vecteur indiquant l'axe supérieur. J'ai testé 2 3 formules mais j'ai pas trouvé.
    Ayant régulièrement vu parler des quaternions, j'ai voulu voir, mais ca me parait un peu violent pour mon simple probleme. En plus j'ai pas trouvé un cours bien clair a par celui de néhé, mais alors moi et l'anglais


    Donc voila, j'espere que vous saurez

  2. #2
    Membre émérite
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Par défaut
    Alors un simple example trouvé sur NeHe je crois voici comment avec GlRotatef et Translatef:
    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
     
    float px = 0,
           py = 0,
           pz = 0,
           vitesse = 2,
           distance = 0,
           direction = 0;
     
    //alors pour bouger devant il faut ceci:
     
    dans la boucke()
    {
     if ( touchegaucheappuyée ) direction -= 0.2;
     if ( touchedroiteappuyée ) direction += 0.2;
     if ( touchehautappuyée )
     {
         px += (float)sin(direction * 0.0174532925f) * vitesse;
         pz += (float)cos(direction * 0.0174532925f) * vitesse;
     }
     
     glTranslatef(0,0,-distance); // si distance vaut ZERO, alors c'est une cam FPS, si il est plus grand que ZERO alors c'est a la 3eme personne, et il faut jouer sur la distance
     glRotatef(-direction,0,1,0);
     glTranslatef(px,py,pz);
     
     // tes objets
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut
    Désolé mais je ne recherche pas du tout une caméra de type FPS. C'est plutot pour regarder un plateau de jeu. Et la caméra parcours donc le chemin entre l'ancien point et le nouveau point. Le joueur n'appuie donc jamais sur une touche pour deplacer la camera. C'est juste une action qui declenche le mouvement.

  4. #4
    Membre émérite
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Par défaut
    Ah oui dsl, j'avais pas bien lu :o ,
    alors, si elle penche c'est parsce qu'elle ne sui pas le target,
    qui lui change de position je suppose (? ) et sa position de la cam,
    ne change pas (?).
    Donc je crois qu'il faut bouger posx, posy,posz en meme temps que target,
    et elle ne penchera plus.

    Ou alors j'ai toujours toujours pas compri ..

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut
    Oui les 2 changent en meme temps mais ils ne parcourent pas forcement la meme distance

  6. #6
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 125
    Par défaut
    Mais c'est une caméra de type poursuite?

    Enfin, qu'est ce que tu veux faire vraiment, je vois pas trop là.....

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut
    Bah en gros

    Je regarde un point à une position précise.

    Et je veux regarder un autre point d'une autre position.

    Mais des que l'autre point a une coordonnée sur X, la camera se met a "pencher". Donc je vois de travers.

  8. #8
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 819
    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 819
    Par défaut Re: Camera (eviter les quaternions)
    Salut,

    Citation Envoyé par Glosialabolas
    Donc je me dis qu'il faut taquiner un vecteur indiquant l'axe supérieur
    Le vecteur indiquant le "haut" est donné par les trois coordonnées 0.0,1.0,0.0 de ta ligne de code.

    Donc ce n'est pas normal que ça tourne, ton vecteur ne bougeant pas... il n'y aurait pas un petit glRotate qui trainerait dans ton code et qui perturberait?
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut Re: Camera (eviter les quaternions)
    Citation Envoyé par plegat
    Salut,

    Citation Envoyé par Glosialabolas
    Donc je me dis qu'il faut taquiner un vecteur indiquant l'axe supérieur
    Le vecteur indiquant le "haut" est donné par les trois coordonnées 0.0,1.0,0.0 de ta ligne de code.

    Donc ce n'est pas normal que ça tourne, ton vecteur ne bougeant pas... il n'y aurait pas un petit glRotate qui trainerait dans ton code et qui perturberait?
    J'avais recherché mais non c'etait pas ca
    Ce qui me parait le plus etrange, c'est que ca arrive que quand je met une valeur sur X.

  10. #10
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 819
    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 819
    Par défaut
    Alors il va falloir nous montrer un peu de code...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut
    Voici ma classe camera (comme vous pouvez le voir c'est pas bien compliqué :p)

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    /* Camera.cpp
     * 
     * 
     * 
     */
     
    #include "Camera.hpp"
    #include <iostream>
     
    using namespace std;
    Camera::Camera()
    {
    	superior_axis.set_point(0.0, 1.0, 0.0);
    }
     
    Camera::~Camera()
    {
     
    }
     
    void Camera::see()
    {
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
    	gluLookAt(position.x, position.y, position.z, target.x, target.y, target.z, superior_axis.x, superior_axis.y, superior_axis.z);
    }
     
    void Camera::move_to(Point p, Point t, float s)
    {
    	step_position.x = (p.x - position.x) / s;
    	step_position.y = (p.y - position.y) / s;
    	step_position.z = (p.z - position.z) / s;
    	step_target.x = (t.x - target.x) / s;
    	step_target.y = (t.y - target.y) / s;
    	step_target.z = (t.z - target.z) / s;
    	step = s;
    }
     
    void Camera::inc()
    {
    	position.x += step_position.x;
    	position.y += step_position.y;
    	position.z += step_position.z;
    	target.x += step_target.x;
    	target.y += step_target.y;
    	target.z += step_target.z;
    	step -= 1.0;
    }
     
    bool Camera::end()
    {
    	if (step == 0.0)
    		return true;
    	else
    		return false;
    }
     
    void Camera::set_position(Point p)
    {
    	position = p;
    }
     
    void Camera::set_target(Point t)
    {
    	target = t;
    }

  12. #12
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 819
    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 819
    Par défaut
    Il ne semble pas y avoir de problème dans cette classe, à première vue... ça doit être dans l'affichage de ton monde 3D...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut
    j'ai juste une fonction display qui affiche la camera au debut puis affiche ce qu'il faut apres. Et je viens de faire un autre essai. Si la valeur y > 0, la camera regarde vers le bas

  14. #14
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 819
    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 819
    Par défaut
    Citation Envoyé par Glosialabolas
    j'ai juste une fonction display qui affiche la camera au debut puis affiche ce qu'il faut apres.
    On n'affiche pas la caméra, on la place... par contre c'est tout ce que tu affiches ensuite qui risque de créer un déplacement du point de vue... ou des objets plutôt! Est-ce qu'il y a des rotations à coup de glRotate dans l'affichage ensuite?
    Enfin, en gros, pour résumer, si le problème n'est pas dans la définition de la caméra, il est dans la définition du placement des objets...

    Citation Envoyé par Glosialabolas
    Et je viens de faire un autre essai. Si la valeur y > 0, la camera regarde vers le bas
    Je ne vais pas dire que c'est logique, mais si avec y>0 elle regardait en haut, c'est normal qu'en négatif elle regarde en bas...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut
    Citation Envoyé par plegat
    On n'affiche pas la caméra, on la place... par contre c'est tout ce que tu affiches ensuite qui risque de créer un déplacement du point de vue... ou des objets plutôt! Est-ce qu'il y a des rotations à coup de glRotate dans l'affichage ensuite?
    Enfin, en gros, pour résumer, si le problème n'est pas dans la définition de la caméra, il est dans la définition du placement des objets...
    Les seuls rotation que je fais sont a la création des différents objets que j'appel par la suite grace a glCallList, mais si il y'avait eu un probleme a ce niveau la, je pense que ca se serait repercuté bien avant. Et J'utilise toujours les fonctions Push et Pop Matrix pour eviter ce genre de problemes.

    Citation Envoyé par plegat
    Je ne vais pas dire que c'est logique, mais si avec y>0 elle regardait en haut, c'est normal qu'en négatif elle regarde en bas...
    Oui pas faux en effet

  16. #16
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 819
    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 819
    Par défaut
    Citation Envoyé par Glosialabolas
    Les seuls rotation que je fais sont a la création des différents objets que j'appel par la suite grace a glCallList, mais si il y'avait eu un probleme a ce niveau la, je pense que ca se serait repercuté bien avant. Et J'utilise toujours les fonctions Push et Pop Matrix pour eviter ce genre de problemes.
    Il doit manquer un Pop... le dernier, pour tout redresser!
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut
    Tout vérifié et c'est pas ca :'(

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut
    Je rajoute un bout de code de ma fonction display

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void Game::show()
    {
            cam->see();
            if (!cam->end())
                    cam->inc();
            glPushMatrix();
            glTranslatef(0.0, 0.0, -h - w / 40.0);
            glCallList(LEVEL);
            glPopMatrix();
     
    ...
     
    }
    Au debut l'affichage de la camera charge la matrice identité. Et donc si le probleme se trouverait dans la liste "LEVEL", il y'aurait une des repercutions donc je me serais surement rendu compte.
    En plus si je commente cette partie, le probleme reste le meme

  19. #19
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    Est-ce que tu as regardé dans l'ordre des rotations que tu effectues ?
    Une rotation sur Y suivie d'une rotation sur X ne donnera pas le même résultat qu'une rotation sur X suivie d'une rotation sur Y

    concernant tes axes, Y est la verticale et Z la profondeur ?
    ou ils sont définis autrement ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut
    Citation Envoyé par shenron666
    Est-ce que tu as regardé dans l'ordre des rotations que tu effectues ?
    Une rotation sur Y suivie d'une rotation sur X ne donnera pas le même résultat qu'une rotation sur X suivie d'une rotation sur Y

    concernant tes axes, Y est la verticale et Z la profondeur ?
    ou ils sont définis autrement ?
    J'ai vérifié toutes les rotations, chacune est entourée de son Push et son frere Pop. De plus, si une tel erreur etait présente, je m'en serais rendu compte lorsque je dessine d'autre chose a l'ecran je pense.

Discussions similaires

  1. Eviter les warnings "unused parameter"
    Par Le Furet dans le forum C
    Réponses: 9
    Dernier message: 03/10/2005, 22h29
  2. Eviter les doublons
    Par cyrill.gremaud dans le forum ASP
    Réponses: 5
    Dernier message: 14/09/2005, 12h37
  3. Réponses: 4
    Dernier message: 13/08/2004, 18h39
  4. [langage] 2 fichier dans 1 en evitant les doublons
    Par remixxl dans le forum Langage
    Réponses: 6
    Dernier message: 26/07/2004, 17h05
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 00h04

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