# Teilgraphen bewegen



## RobDom (18. Aug 2007)

Hallo,

ich versuche einen komplexen Graphen aufzubauen, bei dem man einzelne Teilgraphen einzeln
bewegen kann (z.B. Körper, Arm, Hand, Finger, etc.). Im Moment sieht es so aus, dass ich einfach
mehrere TransformGroups hintereinander hängen habe, damit sich die Bewegungen der übergeordneten
Körperteile auch auf die dahinterhängenden auswirkt.


Mein Problem ist, 

1. dass ich diese Bewegungen nicht über Maus oder Key steuern will, 
sondern z.B. über die Werte einer Scrollbar, eines Textfeldes und später auch aus einem 
Datenstream ansteuern will.  
2. dass diese Körperteile auch erst zur Laufzeit vom User erstellt werden.


Was ich schon habe:

1. Eingabemaske für die Userdaten (Körperteile werden aus Grundformen über Parametereingabe erstellt),
dabei werden die Daten in einem Mehrdimensionalen Array gespeichert.
2. Alle mathematischen Berechnungen (Matrizen für alle Raumrotationen, Raumtranslationen, Skalierung).


Was mir fehlt (also meine eigentlichen Fragen):

1. Ein sinnvoller Aufbau (z.B. Baumstruktur), bei dem ich schnell eine bestimmte Transformation
im SceneGraph finden kann (Anzahl und Verkettungsebene sind zur Entwicklungszeit unbekannt) ???
2. Die so gefundene Transfomation zu verändern und über Werte aus Scrollbar, etc. zu steuern
--> Muss ich dafür ein eigenes Behaviour schreiben, oder geht dass auch einfach mit Capability
setzen und Trafo überschreiben ??? (Wenn ja wie finde ich eine Trafo; kann nur auf Nodes zugreifen ???)
3. Das ganze muss, da es ein sehr komplexer Graph werden soll (mit geladenen VRML Dateien, etc.)
und sehr schnell und flüsig laufen muss, auch sehr ressourchenschonend programmiert werden.
Tipps dafür ???


Vielen Dank für jegliche Hilfe


----------



## Marco13 (19. Aug 2007)

Ja, eine sehr abstrakte Frage. Aber zu 1. und 2.: Kannst du dir nicht eine Map erstellen, die irgendeinen Identifier auf den jeweiligen TransformGroup mappt? Dort könntest du dann einfach mit setTransform die gewünschte Transformation setzen. Für die Steuerung braucht man wohl nicht unbedingt Behaviors - man sollte jederzeit die Transform setzen können. Allerdings würde ich nochmal gezielt nach einer Verbindung zwischen AWT Events (Event dispatch Thread) und Behaviors suchen - ob's da irgendeine elegante Verbnidungsmöglichkeit gibt.


----------



## RobDom (21. Aug 2007)

...wollte mir eigentlich die TransformGroup entwerde über deren Namen,
oder deren Position (Zweig und Tiefe im Baum) merken, aber mappen ist
bestimmt auch eine gute Idee. Das schau ich mir mal an.

Was meinst Du mit Verbindungen zwischen Events und Behavior??

Ich löse bisher im Prinzip das Neuzeichnen und damit auch das Berechnen der Matrizen 
und das setzten der Transformationen über den Thread aus.

Noch eine Frage:
Bin auf der Suche nach fertigen Navigationen (Behaviors), die mehr als die Standards
enthalten, also (walking, flying, pointing, looking, inkl. Resetfunktion, feste 90° Sprünge, etc)


Vielen Dank schhon mal ;-)


----------



## Marco13 (21. Aug 2007)

"...über *den* Thread" - Ja, entscheidend ist eben, über welchen. Wenn man ein Fenster aufmacht laufen schon 10 Threads oder so, und wenn man Java3D drin hat, sind es nochmal zig Threads mehr. Es ging darum, dass z.B. MouseEvents oder Slider-Bewegungen vom EventDispatchThread verarbeitet werden, aber Behaviors werden von einem Java3D-eigenen Rendering-Thread abgearbeitet. (Und ob ein Neuzeichnen nun ein update der der Transforms auslöst, oder umgekehrt, konnte ich damals auch nach langem Suchen im Java3D-Quellcode nich erschließen... da geht's ziemlich drunter und drüber :wink: ). Ein Problem, das auftreten _könnte_ wäre eben, dass man z.B. 2 Objekte "simultan" mit einem Slider bewegen will, sie aber manchmal um einen Frame versetzt erscheinen, weil der Event vom Slider zu einem "ungünstigen Zeitpunkt" an den Szenegraphen weitergereicht wurde. Ich weiß nicht, ob sowas für deine Anwendung überhaupt relevant ist. Mit Behaviors wäre jedenfalls sichergestellt, dass die Eingaben immer "synchronisiert" verarbeitet werden. Allerdings gibt es für einen Slider kein Behavior, und spontan weiß ich nicht auswendig, wie man eine (garantiert synchronisierte) Verbindung zwischen Slidern und dem Java3D Szenegraphen herstellen kann - deswegen der Tipp, mal danach zu suchen - wie gesagt, nur FALLS das für dich relevant ist.


----------



## RobDom (18. Sep 2007)

... ja das ist sogar sehr relevant!

- Woher weisst Du eigentlich was von welchem Thread abgearbeitet wird und hat man da Einfluss drauf??

- Es geht nicht nur um Slider, sondern auch um Datenstreams, Textfelder, Mouse, Tastatur, etc...
  Also würde ich eine synchrone Abarbeitung gerne irgendwie generell für alle Fälle regeln.
  Irgendwelche Ideen (z.B. über Behaviour) ??


Auf jeden Fall schon mal Danke für die Tipps, ich glaube dadurch bin ich auf den richtigen Weg
gestoßen, an das Problem ranzugehen ;-)


----------



## Marco13 (18. Sep 2007)

Das Wissen über die Threads ist eine Mischung aus "Allgemeinbildung" :wink: und stundenlangem Stöbern im Java3D-Quellcode. Wie gesagt: Das ist ziemlich komplex. Sort laufen spezielle Java3D-Threads, die Massenweise(!) irgendwelche ominösen Nachrichten in der Gegend rumschicken, und nachzuvollziehen, WANN genau dort WAS abgearbeitet wird, ist fast unmöglich.  Es ist schon eine Weile her, dass ich mich damit rumgeschlagen habe. Aber ganz allgemein: Mit Behaviors sollte man das _eigentlich_ irgendwie snychronisiert hinkriegen. Wie diese "synchronisation" bei Datenstreams(!?!) aussehen soll, musst du aber wissen  :?


----------

