# 2D Grafiken auf Canvas3D



## Baerbel (11. Sep 2007)

Hallo,

verzweifelt wende ich mich mit meinem Problem an die Experten.
Ich würder gern auf meinem Canvas3D 2D Grafikobjekte darstellen. Allerdings zeigt das Canvas partou nur 3 Objekte an. Ich habe versucht die postrender/postswap Methoden per anonymer Klassendeklaration unterzujubeln. Nun habe ich wie überall beschrieben eine eigene Klasse von Canvas3d abgeleitet und die entsprechenden Methoden überschrieben. Bisher ohne Erfolg. 
Unten aufgeführte Methode war der letzte Versuch zunächst irgendetwas auf die Oberfläche zu zimmern. Nix! 
Die Methode wird brav abgearbeitet und leifert auch keine Exceptions.

```
public void postRender() {
       
       J3DGraphics2D gfx = getGraphics2D();
       
       for (int x=0;x<this.getWidth();x+=5)
           for (int y=0;y<this.getHeight();y+=5){
               gfx.setColor(new Color((float) Math.random(),(float) Math.random(),(float) Math.random()));
               gfx.drawLine(x,0,0,y);
           }
       
       gfx.flush(true);
   }
```

Gibt es irgendeine Einstellung die ein Zeichnen in 2D verhindert bzw. freischaltet? 

Innerhalb des Frames wird Canvas3D folgendermaßen aufgerufen:

```
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        canvas3DTop = new TTSCanvas(config); //Eigene von Canvas3D abgeleitete Klasse
        BranchGroup sceneTop = createTopSceneGraph();
        sceneTop.compile();
        SimpleUniverse simpleUTop = new SimpleUniverse(canvas3DTop);
        simpleUTop.getViewingPlatform().setNominalViewingTransform();
        simpleUTop.addBranchGraph(sceneTop);
        canvas3DTop.setSize(500,300);
        canvas3DTop.setDoubleBufferEnable(true);
        canvas3DTop.addMouseListener(new
                                     canvas3DTop_mouseAdapter(this));
        jSubSplitPane.add(canvas3DTop, JSplitPane.TOP);
```

Gruß und Dank
Kai


----------



## Marco13 (11. Sep 2007)

Ohne es getestet zu haben: Ein spontaner Gedanke wäre, die paint-Methode zu überschreiben

```
class X extends Canvas3D
{
    public void paint(Graphics g)
    {
        super.paint(g);
        g.drawLine(100,200,300,400);
    }
}
```
Aber das wäre wohl schon ein kleiner Hack, und ob das funktioniert, müsste man ausprobieren - bei Java3D wird ziemlich viel getrickst (Ich hab' mir mal den Code angesehen ... *schauder* ...)


----------



## kaie (11. Sep 2007)

Bei mir funktioniert's mit den folgenden Änderungen:

```
public void postRender() {
       super.postRender();
       J3DGraphics2D gfx = getGraphics2D();
       
       for (int x=0;x<this.getWidth();x+=5)
           for (int y=0;y<this.getHeight();y+=5){
               gfx.setColor(new Color((float) Math.random(),(float) Math.random(),(float) Math.random()));
               gfx.drawLine(x,0,0,y);
           }
       
       gfx.flush(false);
   }
```


----------



## Baerbel (11. Sep 2007)

Bei mir funktioniert weder die eine noch die andere Variante. 
@kaie: Wie wird denn bei dir das Canvas3D erstellt und initialisiert?

Gruß
Kai


----------



## kaie (11. Sep 2007)

Hier ein Ausschnitt aus meiner 3D-Klasse. Eigentlich sollte alles Wesentliche da drinstehen. Ich verwende die postRender-Methode, um das "Cockpit" eines Autos über die 3D-Ansicht zu zeichnen. Funktioniert bei mir auch tadellos. Falls es bei Dir nicht klappen sollte, würde ich auf Probleme mit der Grafikkarte, dem Grafiktreiber oder der Java3D-Version (OpenGL/DirectX?) tippen.

```
public class Ansicht3D
{
    public BranchGroup world;
    public Ansicht3D(Netz netz)
    {
        super(SimpleUniverse.getPreferredConfiguration());

        SimpleUniverse uni = new SimpleUniverse(this);
        uni.getViewingPlatform().setNominalViewingTransform();
        uni.getViewingPlatform().getViewPlatform().setActivationRadius(10000);

        world = new BranchGroup();
        world.setCapability(Group.ALLOW_CHILDREN_EXTEND);
        world.setCapability(Group.ALLOW_CHILDREN_WRITE);
        world.setCapability(Group.ALLOW_CHILDREN_READ);

        // Ansicht setzen
        TransformGroup viewTrans = uni.getViewingPlatform().getViewPlatformTransform();
        Transform3D v = new Transform3D();
        v.lookAt(new Point3d(-100, 25, 1000), new Point3d(0, 0, 0),
                new Vector3d(0, 0, 1));
        v.invert();
        viewTrans.setTransform(v);

        world.compile();
        uni.addBranchGraph(world);

        getView().setTransparencySortingPolicy(View.TRANSPARENCY_SORT_GEOMETRY);
        getView().setBackClipDistance(10000);
        getView().setSceneAntialiasingEnable(true);
    }

    public void postRender()
    {
        super.postRender();
        J3DGraphics2D g2 = getGraphics2D();
        // zeichnen
        g2.flush(false);
    }
}
```


----------



## Baerbel (14. Sep 2007)

Hallo,

es lag am OpenGL-Treiber. Habe das Programm mit der Option D3D ausgeführt und schon liefs. 

Vielen Dank
mfG
Kai


----------



## just4fun (2. Aug 2008)

Hallo, ich hab dazu ne Frage:
Bei mir geht das super.postRender(); nicht.
- Muss man für super.postRender(); etwas importieren?
- Liegt es daran, dass ich 'extends Applet' eingebaut habe?

Danke vielmals,
Finn


----------



## just4fun (4. Aug 2008)

Okay, ich habs: Man muss das ganze in eine neue Klasse schreiben.

Hier ist ein recht gutes Beispiel http://forums.java.net/jive/message.jspa?messageID=246731


----------

