# Java 3d Objekte überdecken 2d Komponenten



## aze (29. Sep 2009)

Hi

Ich hab in meinen Programm einige 2D Komponenten(Swing) und 3D Komponenten(Java 3d).Wenn ich die 3d Komponenten kommt es vor ,dass sie die 2d Komponenten überdecken(siehe Screenshot).Wie kann ich das verhindern ?

Schöne Grüße

Aze


----------



## Marco13 (29. Sep 2009)

Was sind das für 3D Components? Falls anwendbar: Ändere GLCanvas in GLJPanel...


----------



## aze (29. Sep 2009)

Es handelt sich bei dem Gebiß ,das man sieht um ein JPanel mit einen 3dCanvas. 

GLCanvas und GLJPanel hören sich nach JOGL an.Werden die auch in Java 3D benutzt ?


----------



## Marco13 (29. Sep 2009)

Ach so, "das" Java3D  OK, da bekommt man einen Canvas, der erstmal einen Canvas3D, und der ist heavyweight - das mit Swing zu vermischen ist grundsätzlich nicht so problemfrei. Ein paar Hinweise dazu findet man hier Mixing heavy and light components Wie man dem im konkreten Fall abhelfen kann, ist aus der Ferne schwer zu sagen - der Canvas liegt da irgendwie so "frei im Raum" - wo sollte der denn eigentlich sein? Sind die in JInternalFrames? Falls ja: Das funtioniert erstmal nicht. Bei Java3D 1.5 https://java3d.dev.java.net/binary-builds.html gibt es aber einen experimentellen JCanvas3D, der Lightweight sein soll - das wäre einen Versuch wert...


----------



## aze (30. Sep 2009)

Danke Marco

Ich werde es bei Gelgenheit mal ausprobieren und hier meine Erfahtungen schreiben.


----------



## aze (5. Okt 2009)

Hi

Ich habe es mal ausprobiert,aber leider klappt es nicht.Wie transformiere ich meinen Canvas3D in einen JCanvas3D ?

In den Code den ich von meinen Vorgänger bekommen habe,und den ich leider nicht verstehe,da ich mich mit 3D Programmierung nicht so gut auskenne,wird ein Canvas3d durch folgende Methode erzeugt: 


```
private Canvas3D createCanvas()
    {
        GraphicsConfigTemplate3D tmpl = new GraphicsConfigTemplate3D();

        GraphicsEnvironment env =     GraphicsEnvironment.getLocalGraphicsEnvironment();

        GraphicsDevice device = env.getDefaultScreenDevice();

        GraphicsConfiguration config = device.getBestConfiguration(tmpl);

        CapturingCanvas3D ret = new CapturingCanvas3D(config);

        return ret;
        
    }
```

Aus den Canvas wird ein View erzeugt:


```
private View createView(Canvas3D c) {
        PhysicalBody body = new PhysicalBody();
        PhysicalEnvironment environment = new PhysicalEnvironment();
        View view = new View();
        view.addCanvas3D(c);
        view.setBackClipDistance(1000.0);
        view.setPhysicalBody(body);
        view.setPhysicalEnvironment(environment);
        return view;
    }
```

Und aus dem View eine Branchgroup:


```
private BranchGroup createViewgroup(View v) {
        BranchGroup viewRoot = new BranchGroup();
        viewTransform = new TransformGroup();
        viewTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        viewTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        Transform3D transform = new Transform3D();
        transform.set(new Vector3d(0, 0, 18));
        viewTransform.setTransform(transform);
        viewRoot.addChild(viewTransform);

//        AmbientLight al = new AmbientLight(new Color3f(0.3f, 0.3f, 0.3f));
//        al.setInfluencingBounds(new BoundingSphere(new Point3d( 0.0, 0.0, 0.0 ),1000.0));
//        viewTransform.addChild(al);

        AmbientLight al = new AmbientLight(new Color3f(.4f, 0.4f, 0.4f));
        al.setInfluencingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0));
        viewTransform.addChild(al);

        DirectionalLight dLight = new DirectionalLight(new Color3f(0.4f, 0.4f, 0.4f), new Vector3f(1.0f, -1.0f, -2.0f));
        dLight.setInfluencingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0));
        viewTransform.addChild(dLight);

        PointLight pLight = new PointLight(true, new Color3f(0.4f, 0.4f, 0.4f), new Point3f(220.0f, -220.0f, 220.0f), new Point3f(0.3f, 0.0f, 0.0f));
        pLight.setInfluencingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0));
        viewTransform.addChild(pLight);

        ViewPlatform vp = new ViewPlatform();
        v.attachViewPlatform(vp);
        viewTransform.addChild(vp);

        viewRoot.compile();
        return viewRoot;
    }
```

Und die dann einen Locale Object angefügt :


```
locale.addBranchGraph(createViewgroup(createView(canvas3D)));
```


----------



## aze (6. Okt 2009)

Hi

Ich hab es nun so hinbekommen dass die leichtgewichtigte Komponente gezeichnet wird.sie überdeckt keine anderen Komponenten und das ist schon mal gut.Allerdings verschwindet sie immer wenn ich auf irgendeine andere Komponente klicke und erscheint erst wieder wenn ich mit der Maus über sie rüberfahre.Ich würde aber gerne dauerhaft dort sehen wo ich sie platziere.


----------



## aze (7. Okt 2009)

Jetzt bleibt die Komponente auch dauerhaft erhalten  Es musste nur getBounds überschrieben werden.


----------

