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 :

Mouvement de camera par la sourie


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut Mouvement de camera par la sourie
    Bonjours à tous

    J'ai développer un système de camera avec glut semblable à celui d'un RPG (comme prototype) ou la camera peut tourner au tour du personnage centrale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //fonction au mouvement d'une sourie
     
    void engineMooseMoved (int x, int y)
    {
    	cartesian_coordinates Add ;
     
    	Add.x = x - CursorPosition.x ;
    	Add.y = y - CursorPosition.y ;
     
    	CursorPosition.x = x ;
    	CursorPosition.y = y ;
     
    	actualiseCameraRotation (Add.x, Add.y);
    }
    Seulement, quand le curseur arrive sur le bord de l'écrans, je ne peut plus faire pivoter ma camera.

    j'ai donc modifier mon code pour que à chaque mouvements de camera, le curseur soit mit au milieu de l'écran.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void engineMooseMoved (int x, int y)
    {
    	if ( x == ScreenMidle.x && y == ScreenMidle.y )
    		return ;
     
    	cartesian_coordinates Add ;
     
    	Add.x = x - ScreenMidle.x ;
    	Add.y = y - ScreenMidle.y ;
     
    	actualiseCameraRotation (Add.x, Add.y);
    	glutWarpPointer (ScreenMidle.x, ScreenMidle.y);
    }
    Seulement, les rotation de camera sont devenu sacadé. Je pense que cela est du à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glutWarpPointer (ScreenMidle.x, ScreenMidle.y);
    Est il possible de récupéré les mouvements relatif de la sourie avec glut ou bien, auriez vous une autre solution ?

    Merci de votre lecture ainsi que de vos réponses éventuel.

  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
    Le code a l'aire correct.

    Qu'entends-tu par saccadé ? La rotation tourne dans un sens puis dans l'opposé ou ça fais juste de gros sauts, dans le bon sens ?

    Si c'est le deuxième cas, as-tu essayé en passant des valeurs plus petites ? Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    forceX = (float)(x – ScreenMidle.x) / 5.0f ;
    PS : Merci pour ce post, ça m'a donné l'idée d'ajouter cette fonction à mon code.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    Et bien dans la première solution, c'est très fluide, mais la seconde est un vrai désastre, la rotation s'effectue dans le bon sens, même proportion d'angles, mais avec un temps de retard par rapport au mouvement de la sourie.

    Cela ne vient pas du monde, car le même monde marche très bien lorsque je replace pas le pointeur à chaque fois.

    J'ai essayer en divisant Axe.x et Axe.y, mais çà saccade toujours, sa influe juste sur l'angle de rotation.

    Est il possible de connaitre le mouvement de la sourie par raport à sa dernière position au lieu de le faire nous même par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Add.x = x - CursorPosition.x ;
    Add.y = y - CursorPosition.y ;

  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
    Est il possible de connaitre le mouvement de la sourie par raport à sa dernière position au lieu de le faire nous même par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Add.x = x - CursorPosition.x ;
    Add.y = y - CursorPosition.y ;
    Je ne connais pas GLUT, mais normalement c'est LA façon de faire. Par exemple avec la SFML on doit toujours faire ce calcul nous-mêmes. Je ne sais pas si ça a changé avec les nouvelles versions de SFML cependant.

    Sinon, juste une idée, essaye d'appeler engineMooseMoved après avoir récupéré la position du curseur si ce n'est pas déjà fait.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    Et bien, engineMooseMoved est théoriquement appeler après le mouvement du curseur, car je la met en faite en argument à l'initialisation de GLUT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glutPassiveMotionFunc (engineMooseMoved);
    Cela doit théoriquement être appeler avec comme argument la position du curseur des lors qu'il y à déplacement de la sourie, Seulement, à ce que j'en ai compris, c'est sur le même thread qui boucle pour chaque frames. Mais le problème n'est pas là, car si je ne remet pas le curseur au centre de l'écrans, cela marche très très bien.

    Auriez vous une façon très rapide de chronomètrer la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glutWarpPointer (ScreenMidle.x, ScreenMidle.y);
    Je me demandai, si je programai moi même la fonction de déplacement du curseur, cela serai peut être plus rapide. Si glut peut le faire, il doit être possible de le refaire en c++.

    Je me demandai au passage, j'ai aussi des bugs avec les touche Z, Q, S et D (pour le déplacement du personnage), surtout quand j'appui sur 2 touche en même temps (d'abord Z puis Q par exemple), pour obtenir un déplacement en diagonale. Puis relâche la seconde en première (Q dans notre exemple). La fonction engineKeyUp specifier à l'initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glutKeyboardUpFunc (engineKeyUp);
    n'est pas appeler car les matrices ne sont pas modifier et le deplacement reste donc le même tandis que si je relâche la première (Z dans notre exemple) ou bien même si je fais que des déplacement non diagonal, cela marche impeccablement.

    Je me disais : à ce moment là, pourquoi ne pas crée un thread exclusif sur les modification clavier et sourie, mais comment faire ? et qu'en pensez vous ?

  6. #6
    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
    Je me demandai au passage, j'ai aussi des bugs avec les touche Z, Q, S et D (pour le déplacement du personnage), surtout quand j'appui sur 2 touche en même temps (d'abord Z puis Q par exemple), pour obtenir un déplacement en diagonale.
    Pour réaliser cela, moi j'ai fait de cette façon, voici un pseudo-code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    bool Z = 0,
          Q = 0,
          S = 0,
          D = 0;
     
    /* Lors-que la touche Z a été appuyée on mets Z à 1, et si D a été,
    on le met à 1 également, de cette façon on a ces deux bool qui sont true
    en même temps, on a un semblent de touches appuyées en même temps */

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. surimpression d'images par survol souris
    Par zebra3 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 26/09/2006, 11h17
  2. recuperer l'enregistrement d'un dbgrid pointe par la souris
    Par bidochon dans le forum Bases de données
    Réponses: 2
    Dernier message: 15/09/2006, 16h32
  3. Réponses: 5
    Dernier message: 05/09/2006, 21h45
  4. [J2SE] selection dans jList par click souris
    Par rupteur dans le forum Composants
    Réponses: 6
    Dernier message: 01/12/2005, 13h36
  5. Couleur du pixel pointé par la sourie
    Par algerian dans le forum Windows
    Réponses: 4
    Dernier message: 16/08/2005, 19h22

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