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 réaliste dans une scène avec glTranslated et glRotated


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut Déplacement réaliste dans une scène avec glTranslated et glRotated
    J'ai un problème de déplacement de mon point de vue dans ma scène.
    Je suis parti du principe que c'est ma scène qui bouge réellement (à l'envers), et non pas le point de vue, mais l'effet obtenu doit être le même.

    Je m'explique :
    Dans mon code, si je fais les translations avant les rotations, je n'ai pas de problème au niveau des translations.

    Mais, les rotations se font à partir du centre (du point de départ), et non autour du point où je suis.

    Si j'inverse l'ordre des glTranslated et glRotated, les rotations fonctionnent comme je le souhaite, (la scène tourne autour du point où je suis), mais les translations ne sont pas affectées par la rotation.

    L'objet va en 1 au lieu d'aller en 2.

    Comment faire pour avoir un déplacement, comme si j'étais dans la scène ?
    - Que quand je tourne, je pivote sur moi-même (et non autour du point de départ).
    - Quand j'avance, que j'aille devant moi, quelle que soit la rotation précédente (et non pas avancer en crabe ou pire).
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  2. #2
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 582
    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 582
    Par défaut
    Citation Envoyé par Lung Voir le message
    Je suis parti du principe que c'est ma scène qui bouge réellement (à l'envers), et non pas le point de vue, mais l'effet obtenu doit être le même.
    c'est bien ça qu'il faut faire, il n'y a pas d'autre méthode, la caméra n'existe pas
    il faut donc résonner comme si c'était le monde entier qui était déplacé/tourné dans les directions inverses à celles du déplacement de la caméra

    Citation Envoyé par Lung Voir le message
    Comment faire pour avoir un déplacement, comme si j'étais dans la scène ?
    - Que quand je tourne, je pivote sur moi-même (et non autour du point de départ).
    - Quand j'avance, que j'aille devant moi, quelle que soit la rotation précédente (et non pas avancer en crabe ou pire).
    tu dois mémoriser la position et l'orientation de ta "caméra" pour t'en servir à chaque itération
    > lorsque tu effectues tes rotations sur toi même, tu dois les faire par rapport l'origine (puisque tu tournes sur toi même) et non par rapport à la position où la "caméra" se trouve
    > lorsque tu te déplaces, tu dois te déplacer en fonction de l'orientation de la "caméra", et donc modifier les coordonnées sur lesquelles ton orientation influe (et non pas une seule coordonnée)

    tu calcules le sinus et le cosinus de ton angle d'orientation et tu te déplaces de (en prenant x et z comme coordonnées latérale et profondeur) :
    en prenant en compte une vitesse de déplacement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x = x + (vitesse * cosinus)
    y = y + (vitesse * sinus)
    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.

  3. #3
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    c'est bien ça qu'il faut faire, il n'y a pas d'autre méthode, la caméra n'existe pas
    il faut donc résonner comme si c'était le monde entier qui était déplacé/tourné dans les directions inverses à celles du déplacement de la caméra
    Ok. Je suis sur la bonne piste, c'est déjà ça ...

    Citation Envoyé par shenron666 Voir le message
    > lorsque tu te déplaces, tu dois te déplacer en fonction de l'orientation de la "caméra", et donc modifier les coordonnées sur lesquelles ton orientation influe (et non pas une seule coordonnée)
    Je soupçonnais un truc de ce genre.

    Citation Envoyé par shenron666 Voir le message
    tu calcules le sinus et le cosinus de ton angle d'orientation et tu te déplaces de (en prenant x et z comme coordonnées latérale et profondeur) :
    en prenant en compte une vitesse de déplacement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x = x + (vitesse * cosinus)
    y = y + (vitesse * sinus)
    Je ne connais pas du tout, mais je vais tester dans ce sens ...

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  4. #4
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    tu calcules le sinus et le cosinus de ton angle d'orientation et tu te déplaces de (en prenant x et z comme coordonnées latérale et profondeur)
    Jusque là, je suis d'accord.

    Citation Envoyé par shenron666 Voir le message
    en prenant en compte une vitesse de déplacement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x = x + (vitesse * cosinus)
    y = y + (vitesse * sinus)
    Mais, là, je ne comprend plus.
    Tu pourrais détailler un peu ...

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  5. #5
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 582
    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 582
    Par défaut
    si on considère tes axes de la manière suivante :
    X : axe latéral, positif vers la droite
    Y : axe vertical, positif vers le haut
    Z : axe de profondeur, positif vers le fond

    si tu veux te déplacer dans ton monde, tu vas jouer sur les axes X et Z
    imagines ton repère en vue de dessus :
    X horizontal vers la droite
    Z vertical vers le haut

    on va dire que lorsque ton angle est à 0, ton vecteur de déplacement est confondu avec l'axe Z
    si tu avances, tu modifies uniquement Z
    dZ (déplacement sur Z) = cosinus(angle en radian) = 1
    dX (dépalcement sur X) = sinus(angle en radian) = 0

    imagines que tu tournes sur ta droite, tu modifies l'angle de rotation de ta caméra, tu influes moins sur Z et un peu sur X

    tu peux t'aider de l'article wikipedia sur le Cercle trigonométrique qui illustre ce que j'ai écrit

    edit : quand au paramètre vitesse, c'est un paramètre que tu décides, qui sert à modifier la vitesse de déplacement et surtout à régler ton déplacement en fonction du nombre d'images par secondes de ton appli, histoire de te déplacer à vitesse constante quelle que soit la machine où tourne ton appli
    par simplicité, ignores le au début, tu peux le rajouter par la suite sans avoir de modifs lourdes à faire
    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.

  6. #6
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    salut

    sans vouloir compliquer le problème:

    le plus simple je trouve est de conserver pour la caméra:
    - float3 position
    - float3 up
    - float3 to
    - float3 left

    (en plus ce sont les arguments que tu passes à gluLookAt)

    - pour avancer de X: position += X (addition de vecteurs)
    - pour tourner à gauche de x degrés: to.rotate(x,up) // tourner to de x degré autour de up, left.rotate(x,up)
    - pour lever la tête de x degrés: to.rotate(x,left), up.rotate(x,left)
    - tu peux aussi implémenter le tangage (tourner la tête sur le côté)

    au final la seule difficulté est de savoir faire tourner un vecteur de x degrés autour d'un autre, en fait ça se résoud facilement avec un produit scalaire (mais tu peux aussi récupérer une fonction qui le fait si vraiment tu detestes l'algèbre linéaire et la trigo donc la 3D )

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    salut, un déplacement FPS de base sur un plan plat (formé par les axes Ox Oz)

    Rendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    glRotatef(angleX,1.0f,0.0f,0.0f);
    glRotatef(angleY,0.0f,1.0f,0.0f);
    glTranslatef(-posX,-HEIGHT,-posZ);
    Update :
    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
    // avance
    If key up pressed
    {
        posX += SPEED * deltaTime * sin(angleY);
        posZ += -SPEED * deltaTime * cos(angleY);
    }
     
    // recule
    If key down pressed
    {
        posX += -SPEED * deltaTime * sin(angleY);
        posZ += SPEED * deltaTime * cos(angleY);
    }
     
    // straffe a gauche
    If key left pressed
    {
        posX += -SPEED * deltaTime * cos(angleY);
        posZ += -SPEED * deltaTime * sin(angleY);
    }
     
    // straffe a droite
    If key right pressed
    {
        posX += SPEED * deltaTime * cos(angleY);
        posZ += SPEED * deltaTime * sin(angleY);	
    }
     
    // changement de l'angle de vue
    If mouse moved
    {
        angleY += mouseXDelta * ROT_SPEED;
        angleX += mouseYDelta * ROT_SPEED;
        angleX = min(90.0f,max(-90.0f,angleX)); // pour pas se retrouver la tete en bas
    }
    avec :
    HEIGHT : la hauteur du mec
    SPEED : sa vitesse de déplacement
    ROT_SPEED : sa vitesse de rotation

    Apres on peut facilement adapter ce petit bout de code a un déplacement dans l'espace et non plus sur un plan
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

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

Discussions similaires

  1. Tabulation dans une form avec entrée
    Par Cl@rk dans le forum Windows Forms
    Réponses: 4
    Dernier message: 23/05/2008, 12h09
  2. Déplacement / zoom dans une scène
    Par foruma dans le forum Flash
    Réponses: 4
    Dernier message: 15/11/2006, 10h57
  3. TForm dans une DLL avec utilisation d'Interface
    Par guedelmalin dans le forum Langage
    Réponses: 13
    Dernier message: 17/06/2005, 11h58
  4. Réponses: 1
    Dernier message: 11/05/2005, 17h28
  5. navigation dans une jsp avec javascript
    Par petitelulu dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/11/2004, 18h55

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