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; } }A la création de l'application, je fais:
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(); .... } }
à l'ouverture d'un fichier:
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);A la fermeture d'un fichier:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Scene3D.getInstance().chargeObjet(filename);
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
Partager