# Behavior?



## flo_richi (3. Mai 2006)

Grüße euch!

Haba mal wieder ein 3D-Problem:
Ich habe einen Greifarm modeliert und diesen in Java3d eingebunden. Über einzelne Behavoir lässt sich jedes Gelenk wunderbar über die Tastatur steuern. 
Nun hat jedoch der Greifarm auch eine externe Schaltbox (sowie: Joystick)  mit die der Roboter gesteurt werden soll. Der "Joystick" hängt an der seriellenSchnittstelle und sendet die gewünschte Anforderung mit zb: g4-3° (d.h. Gelenk 4 soll sich um 3° drehen).

Nun habe ich kA wie ich das Behavior für die seriellSchnitt. schreiben soll? Oder wie ich es aufrufen soll? 
Nach dem ich das ganze compiliert habe und sich die Scene im "live" Modus befindet kann ich nicht mehr eine bestimmte Transformgroup rotieren (meines Wissens nach)!

Gibt es auch eine Möglichkeit einen Tastaturschalg zu emulieren? Also falls jetzt über die serielle ein Befehl reinkommt ich einfach mein bestehendes Tastenbehavior aufrufe (zb: Jetzt wurde Pfeil_runter "gedrückt")!?

Also wie kann ich jetzt der WakeUpCondition sagen das sie was machen soll wenn was über die Serielle kommt?


----------



## Illuvatar (3. Mai 2006)

flo_richi hat gesagt.:
			
		

> Nach dem ich das ganze compiliert habe und sich die Scene im "live" Modus befindet kann ich nicht mehr eine bestimmte Transformgroup rotieren (meines Wissens nach)!



Kannst du schon, wenn die Capabilities entsprechend gesetzt sind. Solltest du aber nicht, 1. kann das zu komischen Fehlern führen, 2. ist das performancemäßig mies.

Richtig geht das mit WakeupOnBehaviorPost. KSKB:


```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.util.*;
import com.sun.j3d.utils.universe.*;  //SimpleUniverse
import com.sun.j3d.utils.geometry.ColorCube;

public class Test extends JFrame implements ActionListener
{
  public static final int BUTTON_PRESSED_ID = 987;
  private Behavior b;
  public Test()
  {
    super ("Test");
    setSize (500, 500);
    setLayout (new BorderLayout());
    setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo (null);  //zentrieren
    JPopupMenu.setDefaultLightWeightPopupEnabled (false);
    setCloseMenuBar (this);
    //Jetzt kommt der 3D-Teil
    Canvas3D c3d = new Canvas3D (SimpleUniverse.getPreferredConfiguration());  //So am besten
    SimpleUniverse simpleU = new SimpleUniverse (c3d);  //Das VirtualUniverse, hier wird auch schon der View hinzugefügt
    BranchGroup bg = new BranchGroup();  //Haupt-BranchGroup
    TransformGroup transform = new TransformGroup();
    transform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    transform.addChild (new ColorCube (0.4f));
    b = new MyBehavior (transform);
    b.setSchedulingBounds (new BoundingSphere (new Point3d(), 1000));
    transform.addChild (b);
    bg.addChild (transform);
    bg.compile();  //Optimiert das Rendern
    simpleU.addBranchGraph (bg);  //Fügt den SceneGraph hinzu
    simpleU.getViewingPlatform().setNominalViewingTransform();  //Versetzt die Kamera so, dass man gleich etwas sehen kann
    //So einfach war das :)
    add (c3d, BorderLayout.CENTER);

    //JButton
    JButton rotate = new JButton ("Rotieren");
    rotate.addActionListener(this);
    add (rotate, BorderLayout.SOUTH);
    setVisible (true);
  }
  //Beenden-Menu
  private void setCloseMenuBar (JFrame f)
  {
    JMenuBar jmb = new JMenuBar();
    JMenu jm = new JMenu ("Datei");
    jmb.add (jm);
    JMenuItem close = new JMenuItem ("Beenden");
    jm.add (close);
    close.addActionListener (this);
    f.setJMenuBar (jmb);
  }
  public void actionPerformed (ActionEvent evt)
  {
    if ("Beenden".equals (evt.getActionCommand())){
      System.exit (0);
    }else if ("Rotieren".equals (evt.getActionCommand())){
      b.postId(Test.BUTTON_PRESSED_ID);
    }
  }
  //Startmethode
  public static void main (String[]args)
  {
    new Test();
  }
}
class MyBehavior extends Behavior
{
  double rot = 0;
  private TransformGroup transform;
  private WakeupCondition wc = new WakeupOnBehaviorPost(this, Test.BUTTON_PRESSED_ID);
  public MyBehavior(TransformGroup tg)
  {
    transform = tg;
  }
  public void processStimulus (Enumeration criteria)
  {
    //rotate
    Transform3D t3d = new Transform3D();
    rot += Math.PI / 7;
    t3d.rotY(rot);
    transform.setTransform(t3d);
    wakeupOn (wc);
  }
  public void initialize()
  {
    wakeupOn (wc);
  }
}
```


----------



## flo_richi (5. Mai 2006)

THX funktioniert optimal!


----------

