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

Langage Delphi Discussion :

[GLScene] Création dynamique d'objet


Sujet :

Langage Delphi

  1. #1
    En attente de confirmation mail Avatar de Matt2094
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    295
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 295
    Points : 237
    Points
    237
    Par défaut [GLScene] Création dynamique d'objet
    Bonjour à tous !

    Je me heurte à petit problème sous GLScene (avec Delphi6) : je voudrais créer une structure qui lit dans un fichier du genre XML et qui définit un environnement 3D à charger. Mais le problème, c'est que je ne sais pas du tout quelles propriétés il faut initialiser pour créer dynamiquement un TGlFreeForm ...

    Merci d'avance.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 160
    Points : 167
    Points
    167
    Par défaut je risque de te parraitre enervant...
    Mais disons aucunes, ou toutes si tu préfères.

    Je m'explique...

    Lorsque tu créer un TGLFreeform en runtime, il est déjà correctement initialisé, mais avec des valeurs par default.
    position x 0
    position y 0
    position z 0

    etc... etc...

    Il est a noter que sa liste de vertex est vide aussi.

    Donc tu as bien un freeform mais invisible.

    Apres, ben c'est selon ce que tu veux faire. Si tu veux qu'il soit visible ou non, il faut initialiser la propriété visible, si tu veux charger un modele dedans tu peux appeler trois methodes (loadfromfile,loadfromstream ou assign (je te deconseille assign qui est buggée et fait disparaitre les textures des autres objets)), enfin bref...

    Chaque propriété est importante puisqu'elle définit soit comment l'objet se comporte à la lumiere, soit son mode de texturage, soit ses coordonnées, son orientation etc... etc... etc...

    Tu peux faire l'impasse sur ce que tu veux, sachant que du coup tu ne sauvegarde/charge pas ce sur quoi tu as fait l'impasse.

    C'est enervant ce que je dis mais bon... je ne vois pas d'autre réponse.

    Personnellement je dirais: TOUTES les propriétés car qui peut le plus peut le moins. Et tant qu'a sauvegarder en XML autant le faire completement.

    Je te signale à ce propos que glscene sait sauvegarder des scenes completes (en XML je ne crois pas mais c'est a voir).

    EDIT: je m'appercoit qu'il y a peut-être une question sous jacente: Comment créer un TGLfreeform en runtime? Si c'est le cas fais le moi savoir je te donnerais des liens et tutoriaux et des conseils.

  3. #3
    En attente de confirmation mail Avatar de Matt2094
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    295
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 295
    Points : 237
    Points
    237
    Par défaut
    Je savais déjà qu'on pouvait sauvegarder des scènes complèetes avec un fichier .gls, mais ce que je cherche à faire, c'est quelque chose qui soit modifiable sans aucun logiciel, juste avec un ptit éditeur de texte. Mais mon problème, c'est que j'ai beau essayer de créer mon TGlFreeForm, je ne voix rien à l'écran ... Voici l'instructions que j'uitlise (j'ai aussi essayer avec ma form comme parent) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GlFreeForm1 := TGlFreeForm1.Create(GlDummyCube1)
    Ensuite, je l'initialise comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GlFreeForm1.LoadFromFile('monfichier.3ds');
    GlFreeForm1.Material.Texture.Disabled := false;
    GlFreeForm1.Material.Texture.Image.LoadFromFile('monimage.jpg');
    GlFreeForm1.Visible := true;
    Mais je ne voix absolument rien à l'écran ... même pas les axes ...

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 160
    Points : 167
    Points
    167
    Par défaut
    Citation Envoyé par Matt2094
    Je savais déjà qu'on pouvait sauvegarder des scènes complèetes avec un fichier .gls, mais ce que je cherche à faire, c'est quelque chose qui soit modifiable sans aucun logiciel, juste avec un ptit éditeur de texte. Mais mon problème, c'est que j'ai beau essayer de créer mon TGlFreeForm, je ne voix rien à l'écran ... Voici l'instructions que j'uitlise (j'ai aussi essayer avec ma form comme parent) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GlFreeForm1 := TGlFreeForm1.Create(GlDummyCube1)
    Ensuite, je l'initialise comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GlFreeForm1.LoadFromFile('monfichier.3ds');
    GlFreeForm1.Material.Texture.Disabled := false;
    GlFreeForm1.Material.Texture.Image.LoadFromFile('monimage.jpg');
    GlFreeForm1.Visible := true;
    Mais je ne voix absolument rien à l'écran ... même pas les axes ...

    1 verifie que ton dummy cube est visible dans le champ de ta camera en lui mettant un show axes à true

    Ensuite voilà comment je ferais moi pour creer ton freeform

    Declaration:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    model3D:TGLBaseSceneObject;
    GLFreeForm1:TGLFreeForm;
    Ensuite Creation de l'objet (attention la syntaxe n'est pas instinctive)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    model3D:=GlDummyCube1.AddNewChild(TGLFreeForm);
    Voilà l'objet est bien créé mais avec une interface de base (TGLBaseSceneObject)

    ensuite j'utilise un transtypage pour recup l'interface complete du freeform

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GLFreeForm1:=model3D as TGLFreeForm;
    Voilà maintenant ton objet FreeForm1 est pret avec la bonne interface

    et ensuite ton code devrait marcher:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GlFreeForm1.LoadFromFile('monfichier.3ds');
    GlFreeForm1.Material.Texture.Disabled := false;
    GlFreeForm1.Material.Texture.Image.LoadFromFile('monimage.jpg');
    GlFreeForm1.Visible := true;
    Bon voila... Y'a peut etre plus simple mais ca , ca marche a chaque fois.

    A CONDITION: que tu aie bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GLSceneViewer1.Invalidate;
    dans ton cadencer, que ton cadencer soit actif , que ta camera soit bien placée et que le dummycube soit dans le champ.

    Bon je vais me faire une teuf chez de potos...
    Si ca marche pas ou si t'as des questions je serais de retour vers minuit.

    Ha oui pendant que j'y pense mefie toi du scalling de l'objet:

    En effet dans le monde openGl tout est relatif... une unité opengl c'est ben... c'est ce que c'est.

    Donc il se peut aussi que ton objet soit très très très trop petit pour etre visible ou très très trop gros pour être visible.

    C'est facile a verifier...

    Tu creer un freeform en design time, tu le charges avec ton fichier .3Ds et s'il s'affiche à la bonne taille c'est bon.

    Sinon propriétés scale.x, scale.y et scale.z seront tes amis

  5. #5
    En attente de confirmation mail Avatar de Matt2094
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    295
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 295
    Points : 237
    Points
    237
    Par défaut
    J'ai pas compris grand chose, mais ça marche ! Merci beaucoup darkvadr ! Et bonne teuf !

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 160
    Points : 167
    Points
    167
    Par défaut
    Bon tout bien reflechit tu peux le faire en une seule passe

    Declaration:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GLFreeForm1:TGLFreeForm;
    L'astuce c'est le transtypage pendant la creation de l'objet (attention la syntaxe est encore moins instinctive)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GLFreeForm1:=GlDummyCube1.AddNewChild(TGLFreeForm) as TGLFreeForm;
    Voilà l'objet est bien créé AVEC la bonne interface.

    et ensuite ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GlFreeForm1.LoadFromFile('monfichier.3ds');
    GlFreeForm1.Material.Texture.Disabled := false;
    GlFreeForm1.Material.Texture.Image.LoadFromFile('monimage.jpg');
    GlFreeForm1.Visible := true;
    Bon voila... Y'a pas plus "simple" pour que ca marche.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 160
    Points : 167
    Points
    167
    Par défaut
    Maintenant le flag resolu est total!

  8. #8
    En attente de confirmation mail Avatar de Matt2094
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    295
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 295
    Points : 237
    Points
    237
    Par défaut
    Encore merci darkvadr !

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    bonjour,

    désolé de déterrer ce vieux sujet mais il concerne exactement un sujet de projet dans mes études.

    Or, quand je suis la méthode expliquée plus tot pour charger un .3ds, ça a marché une fois, et depuis incroyablement ça ne marche plus et j'ai une erreur "SIGSEGV" à chaque fois.

    mon code est très simple car c'est juste du test pour l'instant :

    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
    unit Unit1; 
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, glscene,
      glwin32viewer, GLFile3DS, GLObjects, GLVectorFileObjects, GLGeomObjects,
      Buttons;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        GLCamera1: TGLCamera;
        GLScene1: TGLScene;
        GLSceneViewer1: TGLSceneViewer;
        GLDummyCube1: TGLDummyCube;
        GLFreeForm1: TGLFreeForm;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
     
      private
        { private declarations }
      public
        { public declarations }
      end; 
     
    var
      Form1: TForm1;
     
    implementation
     
    { TForm1 }
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
         GLFreeForm1.LoadFromFile('plane.3ds');
    end;
     
    initialization
      {$I unit1.lrs}
     
    end.
    D'autre part je travaille en pascal sous lazarus, mais je pense que c'est pareil non ?

    merci

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

Discussions similaires

  1. Création dynamique d'objets
    Par Ensias dans le forum Langage
    Réponses: 4
    Dernier message: 01/03/2007, 21h48
  2. [C#] Création dynamique d'objets
    Par Gloups dans le forum Windows Forms
    Réponses: 7
    Dernier message: 16/08/2006, 01h52
  3. Création dynamique d'objets ?
    Par Arthur A. dans le forum C++
    Réponses: 6
    Dernier message: 15/06/2005, 23h55
  4. création dynamique d'objet, projet win32
    Par noinneh dans le forum MFC
    Réponses: 5
    Dernier message: 03/02/2005, 16h07
  5. [Reflexivite]création dynamique d'objet et Héritage
    Par norkius dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 26/10/2004, 11h37

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