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] Problème de Picking


Sujet :

3D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 7
    Par défaut [Java3D] Problème de Picking
    Bonjour,

    J'ai une application basée sur Java3D qui permet de charger des fichiers 3D CAD, et sélectionner des surfaces de l'objet. L'application doit permettre de fermer un fichier ouvert et d'en ouvrir un autre.
    Tout fonctionne bien pour un premier objet 3D: affichage, sélection (par PickCanvas), .... Par contre, lorsque je ferme cet objet, et en ouvre un autre, il s'affiche correctement, mais la sélection souris ne marche pas: java.lang.IllegalStateException: Picking can only work if BranchGroup is alive

    Je suppose que je ferme mal le BranchGroup associé à l'objet précédent, ou que je définis mal le BranchGroup correspondant au nouveau fichier ouvert, mais je ne vois pas comment...

    Voici des extraits de mon code:

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    public class Scene3D extends MouseAdapter implements ComponentListener {
     
        private static Scene3D instance = new Scene3D();
     
        private static String filename = "";
        private BranchGroup objRoot = null;
        private BranchGroup scene = null;
        private SimpleUniverse myWorld;
        private RefreshCanvas3D canvas;
        private PickCanvas pickCanvas = null;
        private Locale maLocale;
        private Wavefront objFile;
     
     
        public static Scene3D getInstance() {
            return instance;
        }
     
        public Scene3D() {
            super();
            canvas=new RefreshCanvas3D(SimpleUniverse.getPreferredConfiguration());
            myWorld=new SimpleUniverse(canvas);
            myWorld.getViewingPlatform().setNominalViewingTransform();
            objRoot = new BranchGroup();
            objRoot.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
            objRoot.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
            objRoot.compile();
              myWorld.addBranchGraph(objRoot);
     
            this.maLocale = myWorld.getLocale();
     
        }
     
        public void chargeObjet(String filename) {
            //
     
            scene=createScene(filename);
            scene.compile();
     
            objRoot.addChild(scene);
     
        }
     
        public BranchGroup createScene(String filename) {
            BranchGroup scene = new BranchGroup();
     
            pickCanvas = new PickCanvas(canvas, scene);
               pickCanvas.setMode(PickCanvas.GEOMETRY);
              canvas.addMouseListener(new PickMouseListener(this, pickCanvas));
     
            scene.setCapability(BranchGroup.ALLOW_DETACH);
            //creation lumiere ambiante de couleur blanche
            BoundingSphere bounds = new BoundingSphere(new Point3d(), 1000);
            Light ambientLight = new AmbientLight(new Color3f(Color.white));
            ambientLight.setInfluencingBounds(bounds);
            scene.addChild(ambientLight);
     
            //creation lumiere directionnelle de couleur blanche
            Light directionalLight = new DirectionalLight(new Color3f(Color.white), new Vector3f(4, -4, -4));
            directionalLight.setInfluencingBounds(bounds);
            scene.addChild(directionalLight);
     
            //Creation du groupe de transformation sur lequel vont s'appliquer les comportements
              TransformGroup transformMouse = new TransformGroup();
     
              // Le groupe de transformation sera modifie par le comportement de la souris
              transformMouse.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
              transformMouse.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
     
            // Creation comportement rotation a la souris
            MouseRotate rotate = new MouseRotate(transformMouse);
            rotate.setSchedulingBounds(new BoundingSphere());
            scene.addChild(rotate);
     
            // Creation comportement deplacement a la souris
            MouseTranslate translate = new MouseTranslate(transformMouse);
            translate.setSchedulingBounds(new BoundingSphere());
            scene.addChild(translate);
     
            // Creation comportement zoom a la souris
            MouseZoom zoom = new MouseZoom(transformMouse);
            zoom.setSchedulingBounds(new BoundingSphere());
            scene.addChild(zoom);
     
            //System.out.println("date 2 avant chargement wavefront " + new Date().getTime());
            objFile = new Wavefront(filename);
            float scale = objFile.getScaleFactor();
            Transform3D t3d=new Transform3D();
            t3d.setScale(scale);
     
            TransformGroup transformScene=new TransformGroup(t3d);
     
            transformScene.addChild(objFile.createObjets3D());
            nbSurfaces = objFile.getNbSurfaces();
            nbObjets = objFile.getNbObjets();
            transformMouse.addChild(transformScene);
     
             scene.addChild(transformMouse);
     
            return scene;
        }
    }
    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
    public class PickMouseListener implements MouseListener {
     
        private PickCanvas pickCanvas;
        private Scene3D scene;
     
        public PickMouseListener(Scene3D s, PickCanvas pick) {
            super();
            pickCanvas = pick;
            scene = s;
        }
     
     
        public void mouseClicked(MouseEvent e) {
     
            if (SwingUtilities.isLeftMouseButton(e)) {
     
            pickCanvas.setShapeLocation(e);
            PickResult result = pickCanvas.pickClosest();
            ....
        }
    }
    A la création de l'application, je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    JPanel zoneAffichage = new JPanel();
    RefreshCanvas3D canvas = Scene3D.getInstance().getCanvas();
    zoneAffichage.add(canvas, BorderLayout.CENTER);
    à l'ouverture d'un fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Scene3D.getInstance().chargeObjet(filename);
    A la fermeture d'un fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Scene3D.getInstance().getScene().detach();

    Quelqu'un peut-il m'aider?
    Merci d'avance!!
    Cdlt
    Casano

  2. #2
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    essaye de mettre la variable scene = null;

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 7
    Par défaut
    Citation Envoyé par slim_java Voir le message
    essaye de mettre la variable scene = null;
    J'ai essayé à la fermeture de mettre scene = null, cela ne change rien; J'ai toujours l'erreur lorsque je fais PickResult result = pickCanvas.pickClosest();

  4. #4
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 7
    Par défaut
    J'ai rajouté qq tests sur PickCanvas:
    Dans la classe Scene3D:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scene.setName("scène3d");
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    boolean alive = pickCanvas.getBranchGroup().isLive();
    String name = pickCanvas.getBranchGroup().getName();
    boolean alive2 = scene.getScene().isLive();
    String name2 = scene.getScene().getName();
    dans la classe PickMouseListener.

    Il s'avère que:
    pour sélection sur le premier objet ouvert:
    alive et alive2 = true
    name et name2 = "scène3d"
    -> logique, le BranchGroup de pickCanvas est scene de la classe Scene3D
    Après fermeture et ouverture d'un autre objet 3D:
    name et name2 = "scène3d"
    alive = false (d'où erreur picking) et alive2 = true
    Ces 2 branchgroups ont l'air d'etre différents même s'ils ont le même nom....
    Comment cela peut-il être possible?

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    J'ai l'impression que c'est un problème de variable locale qui masque une donnée membre. Mais tu ne donnes pas tout ton code, alors difficile à dire.
    Commence par mettre des visibilités correctes à tes méthodes. Par exemple "createScene" ne devrait-elle pas être en "private" ?
    Ensuite, toujours dans cette méthode, pourquoi utiliser une variable locale "scene" qui masque la donnée membre de la classe ? Ca ne peut générer que des erreurs de compréhension quand tu vas relire ton code dans 6 mois, et peut-être générer des bugs à l'exécution dû à la non maitrise des subtilité de masquage.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 7
    Par défaut
    Bonjour,

    POur aller plus loin dans les investigations, revoici mon code (un peu modifié):

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    public class Scene3D extends MouseAdapter implements ComponentListener {
     
        private static Scene3D instance = new Scene3D();
     
        private static String filename = "";
        private BranchGroup objRoot = null;
        private BranchGroup scene = null;
        private SimpleUniverse myWorld;
        private RefreshCanvas3D canvas;
        private PickCanvas pickCanvas = null;
        private Locale maLocale;
        private Wavefront objFile;
     
     
        public static Scene3D getInstance() {
            return instance;
        }
     
        public Scene3D() {
            super();
            canvas=new RefreshCanvas3D(SimpleUniverse.getPreferredConfiguration());
            myWorld=new SimpleUniverse(canvas);
            myWorld.getViewingPlatform().setNominalViewingTransform();
            objRoot = new BranchGroup();
            objRoot.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
            objRoot.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
            objRoot.compile();
            myWorld.addBranchGraph(objRoot);
     
            this.maLocale = myWorld.getLocale();
     
        }
     
        public void chargeObjet(String filename) {
            //
     
            scene = null;
            pickCanvas = null;
    	createScene(filename);
     
    	pickCanvas = new PickCanvas(canvas, scene);
     
    	pickCanvas.setMode(PickCanvas.GEOMETRY);
    	canvas.addMouseListener(new PickMouseListener(this, pickCanvas));
     
    	scene.compile();
    	scene.setName(filename);
    	objRoot.addChild(scene);
     
        }
     
        private void createScene(String filename) {
             scene = new BranchGroup();
     
            scene.setCapability(BranchGroup.ALLOW_DETACH);
            //creation lumiere ambiante de couleur blanche
            BoundingSphere bounds = new BoundingSphere(new Point3d(), 1000);
            Light ambientLight = new AmbientLight(new Color3f(Color.white));
            ambientLight.setInfluencingBounds(bounds);
            scene.addChild(ambientLight);
     
            //creation lumiere directionnelle de couleur blanche
            Light directionalLight = new DirectionalLight(new Color3f(Color.white), new Vector3f(4, -4, -4));
            directionalLight.setInfluencingBounds(bounds);
            scene.addChild(directionalLight);
     
            //Creation du groupe de transformation sur lequel vont s'appliquer les comportements
             TransformGroup transformMouse = new TransformGroup();
     
              // Le groupe de transformation sera modifie par le comportement de la souris
                 transformMouse.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
              transformMouse.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
     
            // Creation comportement rotation a la souris
            MouseRotate rotate = new MouseRotate(transformMouse);
            rotate.setSchedulingBounds(new BoundingSphere());
            scene.addChild(rotate);
     
            // Creation comportement deplacement a la souris
            MouseTranslate translate = new MouseTranslate(transformMouse);
            translate.setSchedulingBounds(new BoundingSphere());
            scene.addChild(translate);
     
            // Creation comportement zoom a la souris
            MouseZoom zoom = new MouseZoom(transformMouse);
            zoom.setSchedulingBounds(new BoundingSphere());
            scene.addChild(zoom);
     
            //System.out.println("date 2 avant chargement wavefront " + new Date().getTime());
            objFile = new Wavefront(filename);
            float scale = objFile.getScaleFactor();
            Transform3D t3d=new Transform3D();
            t3d.setScale(scale);
     
            TransformGroup transformScene=new TransformGroup(t3d);
     
            transformScene.addChild(objFile.createObjets3D());
            nbSurfaces = objFile.getNbSurfaces();
            nbObjets = objFile.getNbObjets();
            transformMouse.addChild(transformScene);
     
             scene.addChild(transformMouse);
     
            return scene;
        }
    }
    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
     
    public PickMouseListener(Scene3D s, PickCanvas pick) {
            super();
            pickCanvas = pick;
            scene = s;
        }
     
     
        public void mouseClicked(MouseEvent e) {
     
            if (SwingUtilities.isLeftMouseButton(e)) {
                boolean alive = pickCanvas.getBranchGroup().isLive();
    	    String name = pickCanvas.getBranchGroup().getName();
    	    boolean alive2 = scene3d.getScene().isLive();
    	    String name2 = scene3d.getScene().getName();
                pickCanvas.setShapeLocation(e);
                PickResult result = pickCanvas.pickClosest();
            ....
        }
    }
    A la création de l'application, je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    JPanel zoneAffichage = new JPanel();
    RefreshCanvas3D canvas = Scene3D.getInstance().getCanvas();
    zoneAffichage.add(canvas, BorderLayout.CENTER);
    à l'ouverture d'un fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Scene3D.getInstance().chargeObjet(filename);
    A la fermeture d'un fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Scene3D.getInstance().getScene().detach();
    Scene3D.getInstance().setScene(null);
    dans la classe PickMouseListener.

    Il s'avère que:
    pour sélection sur le premier objet ouvert dont filename est objet1:
    alive et alive2 = true
    name et name2 = "objet1"
    -> logique, le BranchGroup de pickCanvas est bien scene de la classe Scene3D

    Après fermeture et ouverture d'un autre objet 3D dont filename est objet2:
    name = "objet1" et name2 = "objet2"
    alive = false (d'où erreur picking) et alive2 = true

    Le branchGroup de pickCanvas est donc resté celui associé au premier objet.
    Comment cela peut-il être possible, alors que je fais bien
    pickCanvas = new PickCanvas(canvas, scene);?
    Comment faire pour que pickCanvas soit créé correctement?

    Merci pour votre aide
    Cdlt

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

Discussions similaires

  1. [JAVA3D] Problème Picking
    Par juliens9 dans le forum 3D
    Réponses: 6
    Dernier message: 18/10/2007, 17h37
  2. Problème de picking
    Par Darz4 dans le forum OpenGL
    Réponses: 3
    Dernier message: 04/12/2006, 22h45
  3. Problème de picking
    Par DestinyWar45 dans le forum OpenGL
    Réponses: 2
    Dernier message: 23/11/2006, 21h52
  4. Problème de "Picking"
    Par maxetime dans le forum OpenGL
    Réponses: 10
    Dernier message: 29/09/2006, 13h36
  5. problème de picking (C++)
    Par khayyam90 dans le forum OpenGL
    Réponses: 5
    Dernier message: 14/08/2005, 14h56

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