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

Delphi Discussion :

GLScene : Sauvegarder et restaurer l'orientation d'une caméra


Sujet :

Delphi

  1. #1
    Membre régulier Avatar de ALEX77
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 138
    Points : 76
    Points
    76
    Par défaut GLScene : Sauvegarder et restaurer l'orientation d'une caméra
    Bonjour

    J'utilise GLScene sous Delphi 7 et je commence à peine à m'amuser avec

    Dans mon petit projet, je souhaite sauvegarder la position et l'orientation de la caméra à l'aide d'un raccourci clavier SHIFT+F1 par exemple et la revenir à cette même position avec CTRL+F1 par exemple. Un peu comme des signets mais pour les vues caméra.

    J'ai presque réussi, la position est bien reprise mais pour ce qui est de l'orientation, c'est pas encore ça.

    J'ai en tout 5 signets pour gérer mes vues.

    J'ai crée un type TCameraView et un autre TViews qui regroupe les 5 signets de vues possibles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    type TCameraView = RECORD
                        assigned : boolean;
                        x,y,z : single; // position
                        dX, dY, dZ : single; // direction
                        uX, uY, uZ : single; // Up
                        tA, rA, pA : single; // angles Turn, Roll, Pitch
                       END;
     
         TViews = array[1..5] of TCameraView;
    Pour ce qui est de sauvegarder la position de la caméra, je procède comme ceci :
    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
     
    procedure TForm1.SaveView(n: integer);
    begin
     with Views[n] do
     begin
      assigned:=true;
      X:= GLSceneViewer1.Camera.Position.X;
      Y:= GLSceneViewer1.Camera.Position.Y;
      Z:= GLSceneViewer1.Camera.Position.Z;
     
      dX:= GLSceneViewer1.Camera.Direction.X;
      dY:= GLSceneViewer1.Camera.Direction.Y;
      dZ:= GLSceneViewer1.Camera.Direction.Z;
     
      uX:= GLSceneViewer1.Camera.Up.X;
      uY:= GLSceneViewer1.Camera.Up.Y;
      uZ:= GLSceneViewer1.Camera.Up.Z;
     
      pA:= GLSceneViewer1.Camera.PitchAngle;
      rA:= GLSceneViewer1.Camera.RollAngle;
      tA:= GLSceneViewer1.Camera.TurnAngle;
     
     end;
    end;
    Pour ce qui est de restaurer la vue avec position, orientation etc... j'utilise cette procédure :
    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
     
    procedure TForm1.ShowView(n : integer);
    begin
     with Views[n] do if Assigned then
     begin
      GLSceneViewer1.Camera.Position.X := X;
      GLSceneViewer1.Camera.Position.Y := Y;
      GLSceneViewer1.Camera.Position.Z := Z;
     
      GLSceneViewer1.Camera.Direction.X := dX;
      GLSceneViewer1.Camera.Direction.Y := dY;
      GLSceneViewer1.Camera.Direction.Z := dZ;
     
      GLSceneViewer1.Camera.Up.X := uX;
      GLSceneViewer1.Camera.Up.Y := uY;
      GLSceneViewer1.Camera.Up.Z := uZ;
     end;
    end;
    Hélas, il faut que j'utilise plusieurs fois de suite (au moins 4 ou 5 fois) l'appel à ShowView(n) pour que la vue se rétablisse correctement.

    Existe-t-il n moyen de faire ça sans appeller 5 ou 6 fois de suite cette même procédure car lorsqu'on modifie Direction.X, .Y ou .Z on modifie du coup, les autres valeurs changent aussi ; même chose pour Up.

    Quelqu'un a t-il une idée ? ça serait cool de faire une F.A.Q sur GLScene

    Merci pour vos idées

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par ALEX77
    Existe-t-il n moyen de faire ça sans appeller 5 ou 6 fois de suite cette même procédure car lorsqu'on modifie Direction.X, .Y ou .Z on modifie du coup, les autres valeurs changent aussi ; même chose pour Up.
    Salut
    Je ne connais pas trop GLScene mais il n'y aurait pas un Update ou quelque chose dans le genre à appeler une fois ta caméra positionnée?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  3. #3
    Membre régulier Avatar de ALEX77
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 138
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par Pedro
    Salut
    Je ne connais pas trop GLScene mais il n'y aurait pas un Update ou quelque chose dans le genre à appeler une fois ta caméra positionnée?
    Salut Pedro

    Non ça n'a rien à voir avec un Update. Il s'agit de restaurer les coordonnées pour la direction de la caméra : X, Y, et Z. Si par exemple on a pour valeurs au moment où je les sauvegarde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Camera.Direction.X:= 0.317;
    Camera.Direction.Y:= -0.289;
    Camera.Direction.Z:= -0.904;
    Et bien le fait de les restaurer donnera des valeurs très différentes car le fait de modifier une de ces valeurs modifie également les deux autres...

    C'est là mon problème...

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    car le fait de modifier une de ces valeurs modifie également les deux autres...
    Comment le sais-tu ?
    Je veux dire, quand un truc me retourne des valeurs strange, je truffe le code de l'ami ShowMessage(valeur_à_surveiller), d'autres fois j'inclus un mémo et plein de Memo1.Lines.Add(valeur_à_surveiller).
    Ça aide bien à voir où ça merdouille.

    Par ailleurs, tu ne nous montres pas comment tu appelles "Save et ShowView(n : integer);", or ça pourrait être utile à la compréhension.
    HTH,
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Salut,

    Je me rappelle plus bien d'OpenGL, parceque ca commence à dater, mais il me semble qu'il existe une fonction pour sauvegarder ta matrice de position de la caméra, et une autre pour la réafficher.

    @+.
    For crying out loud !

  6. #6
    Membre régulier Avatar de ALEX77
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 138
    Points : 76
    Points
    76
    Par défaut
    Salut

    Citation Envoyé par Jipété
    Comment le sais-tu ?
    Je veux dire, quand un truc me retourne des valeurs strange, je truffe le code de l'ami ShowMessage(valeur_à_surveiller), d'autres fois j'inclus un mémo et plein de Memo1.Lines.Add(valeur_à_surveiller).
    Ça aide bien à voir où ça merdouille.

    Par ailleurs, tu ne nous montres pas comment tu appelles "Save et ShowView(n : integer);", or ça pourrait être utile à la compréhension.
    HTH,
    Je le sais car j'ai placé pour déboguage une barre d'état sur ma form avec un timer qui renvoie en permanence les valeurs de position, de direction et de up de la caméra. Un bouton permet de sauvegarder la position de la caméra, les commandes ZQSD comme dans un FPS permettent d'avancer/reculer et la souris permet de bouger comme dans un FPS.

    L'appel à "Save" est du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TForm1.ButtonClick...
    begin
     SaveView(1); // c'est tout
    end;
    On peut donc se promener avec la caméra et si on souhaite revenir au point de la caméra sauvé il suffit de cliquer sur un deuxième button qui fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     ShowView(1); // c'est tout
    Et c'est là que cela ne va pas, il faut que je clique plusieurs fois sur ce bouton pour retrouver la position d"origine.

    Citation Envoyé par PadawanDuDelphi
    mais il me semble qu'il existe une fonction pour sauvegarder ta matrice de position de la caméra, et une autre pour la réafficher
    C'est ce que j'aimerais bien découvrir mais hélas je n'ai découvert aucun exemple parmis les démos de GLScene je les ai toutes faites et pas la moindre trace d'utilsation des matrices....

  7. #7
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Question:

    Est-ce que la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void gluLookAt(GLdouble ex, GLdouble ey, GLdouble ez, GLdouble cx, GLdouble cy, GLdouble cz, GLdouble upx, GLdouble upy, GLdouble upz);
    n'est pas suffisante pour ton application ?

    Sinon regarde du côté de glu{push,pull}Matrix.

    @+.
    For crying out loud !

  8. #8
    Membre régulier Avatar de ALEX77
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 138
    Points : 76
    Points
    76
    Par défaut
    Effectivement il y a bien un truc avec "matrix" et j'ai essayé cette propriété du composant TGLCamera : TGLCamera.Matrix

    J'ai donc changé mon code et mes types TViews en conséquence.

    J'ai fait un essai avec une variable matrix1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // pour sauver la matrice de la caméra
    matrix1:=Camera.Matrix;
     
    // pour la restaurer
    Camera.Matrix:=matrix1;
    On dirait que ça fonctionne enfin, tout à l'air d'y être, position, orientation.

    Je pense que c'est ça

    Merci pour vos conseils

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

Discussions similaires

  1. sauvegarder et restaurer une collection
    Par lahcentsdi dans le forum SharePoint
    Réponses: 5
    Dernier message: 17/12/2007, 16h29
  2. Réponses: 5
    Dernier message: 14/12/2007, 10h12
  3. [SQL] Sauvegarde et restauration d'une partie de BDD en XML
    Par Ministar dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/10/2007, 13h38
  4. Réponses: 5
    Dernier message: 02/02/2007, 11h29
  5. Réponses: 4
    Dernier message: 03/02/2006, 12h42

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