# Java3D: Behaviors



## koskowsky (19. Okt 2008)

*Hallo,*

Ich habe mich mit dem Interactions-Tutorial von Sun befasst und möchte nun eine ganz einfache Navigation erstellen mit der man sich im SimpleUniverse "bewegen" kann. Dazu habe ich zwei Klassen geschrieben, eine Main und eine Klasse abgeleitet von Behavior. Wie kann ich meine Behavior-Klasse nun in die Main Klasse integrieren damit ich nicht die Objekte sondern die "Kamera" bewege? 
Hier der Code (Ich habe ihn vereinfacht damit er übersichtlicher ist):

```
package j3d;

import javax.swing.JFrame;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.TransformGroup;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.universe.SimpleUniverse;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.BoundingSphere;
import javax.vecmath.Point3d;
import com.sun.j3d.utils.geometry.ColorCube;

public class Main {

    public static void main(String[] args) {
        // Fenster erstellen
        JFrame frame = new JFrame("3D Navigation mit Behaviors");
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setLocation( 100, 100 );
        frame.setSize( 500, 400 );
        // Canvas3D-Objekt erstellen
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas = new Canvas3D( config );
        frame.add( canvas );
        // SimpleUniverse-Objekt erzeugen
        SimpleUniverse universe = new SimpleUniverse( canvas );
        universe.getViewingPlatform().setNominalViewingTransform();        
        // BranchGroup erstellen
        BranchGroup objRoot = new BranchGroup();
        // Behavior-Objekt
        TransformGroup cam = universe.getViewingPlatform().getViewPlatformTransform();
        Camera camera = new Camera( cam );
        camera.setSchedulingBounds( new BoundingSphere( new Point3d(), 1000 ) );
        // Farbwürfel
        ColorCube wuerfel = new ColorCube( 0.4 );
        objRoot.addChild( wuerfel );
        // BranchGroup dem Universum übergeben
        universe.addBranchGraph( objRoot );
        // Fenster sichtbar machen
        frame.setVisible( true );
    }
}
```


```
package j3d;

import javax.media.j3d.Behavior;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.Transform3D;
import java.awt.event.KeyEvent;
import javax.media.j3d.WakeupOnAWTEvent;
import java.util.Enumeration;

public class Camera extends Behavior {
    
    private TransformGroup targetTG = null;
    private Transform3D rotation = new Transform3D();
    private double angle = 0.0d;
    
    public Camera( TransformGroup targetTG ) {
        // Referenz auf das Object of change
        this.targetTG = targetTG;
    }
    
    public void initialize() {
        // Trigger
        this.wakeupOn( new WakeupOnAWTEvent( KeyEvent.KEY_PRESSED ) );
    }
    
    public void processStimulus( Enumeration criteria ) {
        // Rotieren
        angle += 0.1;
        rotation.rotY( angle );
        targetTG.setTransform( rotation );
        // Trigger
        this.wakeupOn( new WakeupOnAWTEvent( KeyEvent.KEY_PRESSED ) );
    }
}
```

Ich hoffe Ihr könnt mir helfen. *Danke!*


----------



## Marco13 (19. Okt 2008)

Spontan sieht das erstmal so aus, als ob du da die Kamera bewegst. Wie soll sich das denn äußern? Man kann ja nicht unterscheiden, ob sich eine Kamera bewegt, oder ob die Welt sich (an der Kamera vorbei) bewegt?!?


----------



## koskowsky (19. Okt 2008)

Ja spontan schon. Aber wenn man den ersten Codeabschnitt anschaut dann stellt man fest das die TransformGroup der ViewingPlatform an gar kein Objekt angehängt ist. Ich weiss eben nicht wie ich das machen soll...


----------



## Marco13 (19. Okt 2008)

Ach ja - braucht man auch nicht, die ghört schon zum Universe. Aber sowas wie
objRoot.addChild(camera);
fehlt noch, damit das Behavior auch was tut...


----------



## koskowsky (20. Okt 2008)

Super   Jetzt funktionierts. *Danke*


----------

