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

3D Java Discussion :

[Java3D] Questions de débutant


Sujet :

3D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 246
    Par défaut [Java3D] Questions de débutant
    Bonjour,
    Je travail sur un projet Java3D qui consiste à représenter des Arbres Octaux.
    En gros un cube peut être plein, vide ou divisé en 8 cubes.


    Là c'est l'interface du logiciel.
    On peut tourner la caméra autour du cube, modifier dynamiquement l'arbre, etc...

    J'ai fini en quelques sortes, mais je me demande si toutes les techniques que j'utilise sont valable ou si j'ai fais que de la merde.

    Voilà la structure de la représentation 3d :


    Tout en haut il y a un TransformGroup avec un Transform3D (t3d) dedans, composé de 2 Transform3D un pour la rotation en X (t3dX) et un pour la rotation en Y (t3dY).
    Je les .mul :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    t3dY=new Transform3D();
    t3d.mul(t3dX);
    t3d.mul(t3dY);
    t3d.getScale(vt3d);
    A chaque fois que je modifie le zoom, la position X ou Y, je refais ça.

    Si il y autant de BranchGroup c'est parce que sur un BranchGroup compilé on peut pas virer autres choses que des BranchGroup.

    CC c'est des ColorCube et avant chaque ColorCube il y a un Vector3D qui donne les positions en X, Y et Z.


    1. Existe-t-il une meilleure façon de gérer la caméra (rotation X, Y et zoom) ?
    2. Est-ce que ma structure blindé de BranchGroup est bonne ?
    3. Est-ce qu'utiliser les Vector3D pour positionner les cubes c'est la bonne façon de faire.

    Parce que là ça marche sans problème, j'ai jamais un seul bug avec l'affichage 3D.
    Enfin si sous Windows des fois le Canvas3D n'apparaît plus :


    Ou le menu passe derrière le Canvas3D :


    Mais au niveau du dessin des cubes ça va.

    4. Comment faire pour empêcher le Canvas3D de disparaître et comment l'empêche de passer devant le menu ?
    5. Là j'utilise des ColorCube, mais j'aimerais utilisé une autre classe qui hérite de Shape3D, parce que les ColorCube sont moches, existe-t-il un moyen de faire une box par exemple et choisir les couleurs de chaque côté et colorier les arrêtes aussi ?
    6. J'ai un problème pour générer la javadoc, j'ai téléchargé la doc de java3d, dans Eclipse pour les 3 jars concerné je donne l'adresse de la doc et elle est validate (il y a package_list) mais pourtant il ne connait toujours pas javax.media.j3d.

    Merci d'avoir lu mes questions.
    Si vous avez une seule piste pour une seule de ces questions merci de me les faire parvenir ce serait vraiment sympa.
    Bonne journée.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    Le problème du menu qui passe sous le canvas peut être du au mélange Swing (Pour ton interface) / AWT pour ton (Canvas3D)

  3. #3
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765

  4. #4
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 246
    Par défaut
    Ok merci beaucoup je vais déjà pouvoir régler ce problème grâce à vous.

  5. #5
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 246
    Par défaut
    Est-il possible de créer un jar qui fasse tourner Java3D même si on ne l'a pas dans le JRE qui exécute le jar ?
    Parce que j'aimerais qu'on puisse lancer le jar sur n'importe quel PC avec JRE6.

    Là j'ai mis des librairies dans le projet (les 3 de Java3D et celle de JDom, mais bon je pense passer à Dom et virer JDom) apparemment c'est utile pour compiler le projet, mais pas pour l’exécuter.

    Par exemple sous linux ça me met ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.UnsatisfiedLinkError: no j3dcore-ogl in java.library.path
    Sauf quand je l’exécute avec java de jdk 1.7 où j'ai installé Java3D.

    Si vous avez une idée ou une solution, ce serait gentil de me la faire parvenir, merci.
    Ça doit bien être possible d'inclure des jar dans un projet pour pouvoir l’exécuter partout.

    Merci.

    Edit :
    J'ai essayé d'ajouter libj3dcore-ogl.so et libj3dcore-ogl-cg.so au projet mais sans succès.
    J'utilise Eclipse, j'ai fait build path -> Configure Build Path -> Add Library (les .so était dans le projet).
    J'ai toujours la même erreur.

    Ah mais en fait les .so c'est comme les .dll, du coup je pense que c'est pas possible d’exécuter du Java3D sans installer Java3D.

  6. #6
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Le plus simple serait de faire un déploiement par Web Start.

    Tel qu'indiqué ici: http://stackoverflow.com/questions/4...d-dependencies

    Une installation en bonne et due forme nécessitera l'installation de Java3D en parallèle. Tu peux éventuellement fournir un installeur qui séquencerait les diverses opérations, mais pas un package auto suffisant...

  7. #7
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 817
    Par défaut
    Citation Envoyé par thierrybenji Voir le message
    Ah mais en fait les .so c'est comme les .dll, du coup je pense que c'est pas possible d’exécuter du Java3D sans installer Java3D.
    C'est aussi "pas possible" qu'avec des dll... comme le dit le message d'erreur, il ne trouve pas les *.so dans le java.library.path, donc il suffit de renseigner le java.library.path correctement...

    un peu de lecture
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  8. #8
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 246
    Par défaut
    J'ai mis un validate() à la création et un revalidate() sur le JDesktopPane à chaque fois que j'ajoute un JInternalFrame à l'intérieur.
    Et rien que ça c'est efficace.

    Le Canvas3D ne disparait plus et il est même derrière le menu.
    C'est pas encore top à 100%, mais ça fonctionne déjà beaucoup mieux.

    En fait ce qui est étrange, c'est que je dois déplacer le JInternalFrame dans le JDesktopPane pour que le menu passe au dessus.
    On dirait que lorsqu'on déplace un JInternalFrame ça appelle une sorte de méthode un peu du genre de UpdateUI() ou un truc comme ça.

  9. #9
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 246
    Par défaut
    Je comprend plus rien là, j'ai viré tout les validate() et revalidate() que j'avais mis et ça change rien, ça fonctionne toujours pareils :

    http://youtu.be/XCoAXYxGQvo

    Je n'ai pas de problème d'affichage, sauf quand je viens de créer une internalframe et que je vais dans le menu.
    Mais dès que je déplace l'internalframe ça fonctionne correctement.

    Est-ce que vous savez sur quoi et à quel moment je devrais faire un revalidate() ?

    Mais apparemment sous Linux ça fonctionne parfaitement, assez bien sous Windows, mais alors sous Mac apparemment c'est moins bien.

    Edit :
    En exécutant avec JRE7 au lieu de JRE6 le canvas3D devient souvent gris, si on va dans le menu ou si on sélectionne un autre arbre.

    Re edit :
    Il semblerait qu'avec un validate sur le JInternalFrame ça fonctionne.
    Puisque le canvas3D devient gris pendant une fraction de seconde.

    Re re edit :
    Ah non en fait, je devrais vous faire une vidéo pour que vous puissiez bien vous rendre compte.

    Re re re edit :
    http://youtu.be/tLkG5zwDXkc

    Alors là j'essaie de montrer tout les bugs d'affichage possible, sans validate(), revalidate(), repaint(), etc...
    A l'origine le menu passe sous le canvas3D, si on bouge l'internalFrame, le menu repasse au dessus, si on bouge le menu quand une internalframe est en dessous, le canvas3D disparait.
    Quand on sélectionne une internframe quand il y en a plusieurs parfois le canvas3d disparait.

    J'ai éssayé de plein de choses, comme par exemple faire un revalidate() sur tout les canvas3d à chaque fois que je sélectionne une internalframe, parfois mes essais semble réparer un peu le problème.

    Chez moi ça intervient quand j'utilise JRE7, en plus je crois qu'il est en 64 bits.
    Mais même il intervient chez des autres qui n'utilisent pas JRE7.

    Si vous avez une idée pour remédier à ces problèmes merci de m'en faire part.

  10. #10
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 246
    Par défaut
    Désolé double post.

    J'ai pu régler le problème de la JMenuBar en mettant ça au début du constructeur de ma classe qu'extends Frame :
    JPopupMenu.setDefaultLightWeightPopupEnabled(false);
    ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false);
    Par contre pour le canvas3d qui disparait c'est un peu plus chiant.
    C'est super aléatoire, apparemment selon les PC ça change.
    Et aussi selon le JRE utilisé.

    Edit :
    Je suis peut être enfin sur la piste de la solution, je viens de découvrir qu'il existait une classe JCanvas3D, je l'ai mis dans mon projet malheureusement elle n'est pas intégré dans le JPanel.

    Re edit :
    Maintenant l'affichage fonctionne correctement le JCanvs3D ne disparait jamais.

    Le code pour ceux que ça intéresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
    JCanvas3D jCanvas3D = new JCanvas3D(device);
    jCanvas3D.setPreferredSize(new Dimension(400,400));
    jCanvas3D.setSize(new Dimension(400,400));
    // Là ou met le canvas3D dans le JPanel
    SimpleUniverse simpleU = new SimpleUniverse(jCanvas3D.getOffscreenCanvas3D());
    simpleU.getViewingPlatform().setNominalViewingTransform();
    Tout fonctionne enfin !
    Merci beaucoup, sans ce topic je crois que je n'y serais pas arrivé.

    Ah oui et du coup, j'ai plus besoin des méthodes statiques, il ni a plus de conflit entre lightweight et heavyweight (Swing / AWT) maintenant je n'utilise plus rien d'AWT.

    =========================================
    J'ai fais tester l'application à un gars sous mac et avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
    JCanvas3D jCanvas3D = new JCanvas3D(device);
    //
    SimpleUniverse simpleU = new SimpleUniverse(jCanvas3D.getOffscreenCanvas3D());
    Il a eu l'erreur :
    java.lang.IllegalStateException: Canvas3D: Illegal operation in off-screen mode
    Et avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JCanvas3D jCanvas3D = new JCanvas3D(new GraphicsConfigTemplate3D());
    Il a eu l'erreur :
    java.lang.NoSuchMethodError: javax.media.j3d.GraphicsConfigTemplate3D.getStencilSize()
    Pourtant il a Java3D 1.5.2, mais je ne sais pas quel JRE il utilise et sous mac apparemment c'est un peu le bordel.

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 23/06/2005, 10h56
  2. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51
  3. [MFC] Quelques questions de débutant...
    Par Sephi dans le forum MFC
    Réponses: 4
    Dernier message: 20/02/2004, 17h25
  4. Questions de débutant
    Par J-P-B dans le forum XMLRAD
    Réponses: 12
    Dernier message: 24/07/2003, 15h19
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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