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 :

Déplacement de la caméra


Sujet :

OpenGL

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Déplacement de la caméra
    Bonjour,
    cela fait un bout de temps que je travail sur un projet de réalisation de spirales de spirales.
    Malheureusement après avoir réussit à tout générer je n'arrive vraiment pas à comprendre l'impossibilité que j'ai à générer le déplacement de la caméra

    Pourriez-vous regarder ces différents éléments et me donner votre avis

    fonction init
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     sub init       #fonction "init"
    {
      glClearColor(1.0, 1.0, 1.0, 1.0);    #reglage de la couleur du fond d'ecran  
      glShadeModel(GL_SMOOTH);   
      glEnable(GL_DEPTH_TEST);
      glEnable(GL_LIGHTING);
      glEnable(GL_LIGHT0);  
    }
    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
    15
     
    sub display       #fonction "display"
    {
      glLoadIdentity();        #initialisation des parametres precedents
      gluLookAt(-150.0, 0.0, $distance, -150.0, 0.0, 0.0, 0.0, 1.0, 0.0);  #positionnement de la camera
      glEnable(GL_DEPTH_TEST);
      glPushMatrix();           #on sauvegarde les parametres de la camera
      glBegin(GL_LINES);
        ..............................
       glEnd();
     
     
      glPushMatrix();
      glPopMatrix();            #?????
      glutSwapBuffers();
    La fonction permettant la gestion de la souris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    sub souris {
      my ($bouton_souris, $etat_souris, $x_souris, $y_souris)=@_;
      if ($x_souris<=300)
      {
        print "\n deplacement a gauche";
        $distance=$distance-20;
        print "\, distance = $distance";
      }  
      print "\n souris : $x_souris $y_souris ( $bouton_souris >> $etat_souris )";
     
    }
    Et pour finir la fin du programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); #speficités de la fenetre
    glutInitWindowPosition (0, 0);     #reglage de la position initiale de la fenetre
    glutInitWindowSize(1024, 800);      #reglage de la taille de la fenetre
    glutCreateWindow ("Arianne");       #nomination et creation de la fentre
    init ();                           #initialisation
    glutDisplayFunc(\&display);        #fonction à apelé lorsqu'il faut "redessiner" la fenetre
    glutReshapeFunc(\&reshape);        #fonction à apeler lorsqu'il faut redimensionner ou bouger la fenetre
    glutMouseFunc(\&souris);
    glutIdleFunc(\&spinDisplay);
    glutMainLoop();

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut pleaze
    S'il vous plait,
    je suis sur ce foutu problème depuis maintenant plusieurs jour,
    je ne m'en sort vraiment pas !!!

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 118
    Points : 118
    Points
    118
    Par défaut
    Déjà, tu peut nous indiquer quel type de déplacement tu voudrai avoir et quel type de déplacement tu obtient en se moment....
    JC est bien notre dieu...(non non pas jesus christ mais John Carmack!!!)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Salut,

    avec
    gluLookAt(-150.0, 0.0, $distance, -150.0, 0.0, 0.0, 0.0, 1.0, 0.0); #positionnement de la camera


    je pense que le seul mouvement que tu vas obtenir c'est un déplacemnt sur l'axe des Z essentiellement et si ta caméra est orienté selon cet axe alors ta caméra va avancer ou réculer selon si distance est positif ou négatif.

    Si tu désires que ta caméra bouge selon un axe tu peux procéder de cette manière.

    soit X,Y, et Z la positon de ta caméra.
    V un vecteur de direction de ta caméra.
    et une vitesse

    il faudra que tu additione les composantes de V aux coordonées de la caméra en fonction de ta vitesse

    X += V.x * vitesse;
    Y += V.y * vitesse;
    Z += V.z * vitesse;


    Ensuite pour regarder dans la direction de ton vecteur tu peut ecrire
    gluLookAt(X,Y,Z, X + V.x, Y + V.y,Z + V.z, 0,1,0);
    Ton vecteur V est un vecteur de direction normalisé ou unitaire si tu préfère.

    En revanche pour suivre ta spirale, si ta caméra se situe sur le fil de la courbe alors si tu connais tous les points de ta courbe

    tu positionnes ta caméra sur un point de la courbe (P1) et tu pointe ta caméra sur le point suivant (P2).

    gluLookAt(P1.x,P1.y,P1.z, P2.x,P2.y,P2.z 0,1,0);

    Ensuite pour avancer tu positione ta caméra sur P2 et tu pointe sur P3 et ainsi de suite ...

    En espérant pouvoir t'aider...

    Sam

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut réponse
    Tout d'abord je veux vous remercier de votre aide.
    Je n'arrive vraiment pas à trouver de documents assez poussé sur l'opengl basé sur le perl. sniff, sniff, sniff
    Mais bon, je vais faire avec.
    En faite, ce que je ne comprend pas c'est qu'avant d'implémenter sur ce programme une caméra déplaçable, j'y était arrivé avec d'autres. En tatonnant, mais les résultats étaient de bonnes qualités ( simple déplacement au clavier ) mais bon, je commence....
    Je demande juste de l'aide pour effectuer un simple déplacement, n'importe lequel. Tout ce que je veux c'est avoir un exemple d'interaction sur ce programme. Avancer la caméra, reculer, pivoter qu'importe, tant que l'on me montre un exemple basé sur le programme......
    Si vous pouviez juste me montrer comment effectuer par exemple un zoom sur mes spirales.
    Comment changer la valeur de la variable $distance et appliquer ce changement sur mon dessin.....

    A l'aide, A L AIDE

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Ah désolé,

    je ne connais pas le perl !!!

    Pour bouger la caméra les explications que je t'ai donné devraient suffire au moins pour une translation de la caméra

    En revanche tu as plein d'exemple de code source sur google et si tu connais le C ou le C++ tu pourras trouver ce dont du as besoin.

    Pour le zoom sur tes spirales il faudrait que tu nous montre une copie d'écran de ton application, car ce n'est pas facile à appréhender comme ça.

    Sam

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Alors voila quelques images
    Voici une image obtenue en zoomt sur une spirale en modifiant la variable $distance ( en faite, z ) à la main.

    Je ne comprend toujours pas pourquoi, après avoir modifié la variable $distance, il ne veut pas redessiner mon dessin avec ses nouvelles coordonnées..
    Et pourquoi ma fonction reshape ne fonctionne pas...
    Merci de votre attention...
    Images attachées Images attachées  

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Pour augmenter ta variable Distance tu devrais
    - intercepter la position de la souris verticalement par exemple
    - soustraire la position précédente de la position courante
    - incrémenter ta variable distance avec cette différence de déplacement vertical.
    - Si la différence est trop grande alors tu peux diviser par deux le résultat ou en utilisant un autre coéfficient.

    J'espère que j'ai bien compris ce que tu désires.

    Voici un exmeple de code

    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
    OnMouseMove (Point ptMouse)
    {
         Point Difference;
         Difference.x = ptMouse.x - prevMousePosition.x;
         Difference.y = ptMouse.y - prevMousePosition.y;
     
         // Pour incrémenter ou dimminuer la distance
         Distance +=  Difference.y;
     
         // puis tu peux appeler ou routine pour signifier
         // à ton application de redessiner ta vue.
         .....
     
         // prevMousePosition est une variable globale par exemple
         prevMousePosition.x = ptMouse.x
         prevMousePosition.y = ptMouse.y
    }
    Cordialement.

    Sam

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut alors
    Merci pour le bout de code je vais l'implémenter.
    Mais alors voila tu as trouvé ce qu'il me fallait même plus

    Es ce que tu peux me donner la commande en c, en perl, en glut et opengl, comme tu veux, j'essayerai de m'en sortir...
    de ton commentaire :
    // puis tu peux appeler ou routine pour signifier
    // à ton application de redessiner ta vue.
    .....
    Je te remercie du fond du coeur.

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    glutPostRedisplay()

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut sniff sniff
    Bon alors j'ai fais ce que tu m'as dit et
    cela donne ces changements :

    pour la fonction souris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    sub souris {
      my ($bouton_souris, $etat_souris, $x_souris, $y_souris)=@_;
      if ($x_souris<=300)
      {
        $camera_z=$camera_z-200;
      }
      glutPostRedisplay();  
    }
    et pour la fonction de display
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sub display       #fonction "display"
    {
      glLoadIdentity();        #initialisation des parametres precedents
      gluLookAt($camera_x, $camera_y, $camera_z, -150.0, 0.0, 0.0, 0.0, 1.0, 0.0);  #positionnement de la camera
    et cela ne change en rien ce que je vois à l'écran, pas de zoom avant ni arrière......
    Mais je viens de remarquer quelque chose, lorsque je change la taille de ma fenêtre, toutes les spirales à l'écran se tranforment en un écran tout noir....

    pourtant voici ma fonction reshape
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    sub reshape     #fonction "reshape"
    {
      my ($w, $h) = @_;        #declaration de variables
      glViewport(0, 0, $w, $h);  #inscription du dessin dans un rectangle (fenetre, ici (0, 0) sont les coordonnés du coin inf gauche et ($w, $h) sont la taille du rectangle ) qui sera dans la fenetre general=>affichage de plusieur dessin dans une meme fenetre
      glMatrixMode (GL_PROJECTION);   #on utilise la matrice concernant les projections
      glLoadIdentity ();	# on defini la projection
      gluPerspective(45.0, $h ? $w/$h : 0, 1.0, $distance_vue);  #reglage de la projection
      glMatrixMode(GL_MODELVIEW);  #on revient a la matrice "view"
      glLoadIdentity();   #initialisation des parametres precedents
    }
    appelée par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glutDisplayFunc(\&display); 
    glutReshapeFunc(\&reshape);

  12. #12
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    $camera_z-200;
    -200 me parait énorme !

    et cela ne change en rien ce que je vois à l'écran, pas de zoom avant ni arrière......
    Mais je viens de remarquer quelque chose, lorsque je change la taille de ma fenêtre, toutes les spirales à l'écran se tranforment en un écran tout noir....
    On dirait un problème de rafraîchissement dans display.

    il y a bien ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	glClearColor(0,0,0,0);
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// Clear The Screen And The Depth Buffer

Discussions similaires

  1. Déplacement de la caméra
    Par Erwan28250 dans le forum Ogre
    Réponses: 6
    Dernier message: 09/03/2013, 17h20
  2. Problème de déplacement de ma caméra
    Par Alays dans le forum OpenGL
    Réponses: 1
    Dernier message: 15/11/2012, 19h52
  3. Déplacement de caméra
    Par Asmod_D dans le forum OpenSceneGraph
    Réponses: 34
    Dernier message: 21/09/2009, 08h36
  4. Calcul des paramètres du déplacement de la caméra
    Par DirtyBoy dans le forum OpenCV
    Réponses: 1
    Dernier message: 24/06/2009, 15h07
  5. Déplacement de caméra dans le monde
    Par korsakoff69 dans le forum DirectX
    Réponses: 9
    Dernier message: 08/09/2006, 11h31

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