Bonjour, alors voilà je vous présente mon problème. Je fais un projet où j'ai une liste de voxel stocké dans un fichier et j'aimerais en fait à partir de cette liste faire un aperçu où je pourrais tourner autour/zoomer, etc...

Le problème c'est que je peux arriver bien vite avec un grand nombre de voxel (1 million par exemple).

En gros bourrin (et ca ne marche que pour un nombre de voxel inférieur à 60 000), j'arrive à afficher mon objet mais disons que niveau fluidité, je suis loin d'être satisfait...

J'utilise Java3D pour le rendu, voici mon code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
    public void Affichage(){
        setLayout(new BorderLayout());
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        c = new Canvas3D(config);
        add("Center",c);
        SimpleUniverse u = new SimpleUniverse(c);
        BranchGroup scene = createSceneGraph(u);
        u.getViewingPlatform().setNominalViewingTransform();
        u.addBranchGraph(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
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
    public BranchGroup createSceneGraph(SimpleUniverse u) {
 
        BranchGroup objRoot = new BranchGroup();
        BoundingSphere largeBounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),4000.0); // Aire de la scène 4000m, centrée en 0/0/0
 
        // Permet de redéfinir la distance de la vue d'un objet (par défaut à 10m)ici on a mis à 4000m
        View view = u.getViewer().getView();
        view.setBackClipDistance(4000);
 
        Vector3f ldir = new Vector3f(1.0F,1.0F,-1.0F);
        Color3f lcouldl = new Color3f(1.0F,1.0F,1.0F);
        DirectionalLight dl = new DirectionalLight(lcouldl,ldir);
        dl.setInfluencingBounds(largeBounds);
        objRoot.addChild(dl);
 
        Color3f lcoulal = new Color3f(0.2F,0.2F,0.1F);
        AmbientLight al = new AmbientLight(lcoulal);
        al.setInfluencingBounds(largeBounds);
        objRoot.addChild(al);
 
        TransformGroup objTrans = new TransformGroup();
        objRoot.addChild(objTrans);
        Transform3D t = new Transform3D();
        t.setTranslation(new Vector3d(0.0F,0.0F,-8.0F)) ;
        objTrans.setTransform(t);
        TransformGroup objTr2 = new TransformGroup();
        objTrans.addChild(objTr2);
        Transform3D tt = new Transform3D();
        objTr2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objTr2.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        objTr2.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
        objTr2.setTransform(tt);
        Appearance a = new Appearance();
        Material m = new Material();
        m.setDiffuseColor(1.0f,1.0f,1.0f);
        m.setSpecularColor(1.0f,1.0f,1.0f);
        m.setAmbientColor(1.0f,1.0f,1.0f);
        m.setShininess(25.0f);
        a.setMaterial(m);
 
        for(int i=0;i<pts_ligne.pp.size();i++) {
            Point n=pts_ligne.pp.get(i);
            TransformGroup objTran = new TransformGroup();
            objTr2.addChild(objTran);
            Transform3D t1 = new Transform3D();
            t1.setTranslation(new Vector3d( n.x, n.y , n.z)) ;
            objTran.setTransform(t1);
            objTran.addChild(new Box(1,1,1,a));
            //pts2[i] = new Vector3d( n.x, n.y , n.z);
        }
 
        BoundingSphere bounds;
        bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),100.0);
 
        MouseRotate behavior = new MouseRotate(objTr2);
        behavior.setFactor(0.01); // sensibilité de la rotation
        objTr2.addChild(behavior);
        behavior.setSchedulingBounds(bounds);
 
        MouseZoom behavior2 = new MouseZoom(objTr2);
        behavior2.setFactor(0.25); // sensibilité du zoom
        objTr2.addChild(behavior2);
        behavior2.setSchedulingBounds(bounds);
 
        MouseTranslate behavior3 = new MouseTranslate(objTr2);
        behavior3.setFactor(0.25); // sensibilité de la translation
        objTr2.addChild(behavior3);
        behavior3.setSchedulingBounds(bounds);
 
        objRoot.compile();
        return objRoot;
    }
En clair c'est ce bout de code qui affiche mes voxels :
pts_ligne.pp étant ma liste de points (voxel) stockés


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
        for(int i=0;i<pts_ligne.pp.size();i++) {
            Point n=pts_ligne.pp.get(i);
            TransformGroup objTran = new TransformGroup();
            objTr2.addChild(objTran);
            Transform3D t1 = new Transform3D();
            t1.setTranslation(new Vector3d( n.x, n.y , n.z)) ;
            objTran.setTransform(t1);
            objTran.addChild(new Box(1,1,1,a));
            //pts2[i] = new Vector3d( n.x, n.y , n.z);
        }
Je pourrais pas améliorer mon affichage avec une autre technique, ou encore avec une autre API que java3D ?

Merci d'avance pour vos réponses