# Java3D: mehrere ViewingPlaforms in Sonnensystem



## veritas696 (30. Mrz 2009)

Hallo zusammen,

ich bin relativer Anfänger in Java3D und hab folgendes Problem:

Ich entwickle zur Zeit ein Sonnensystem mit den verschiedene Planeten, deren Monden und der Sonne. Zur Ansicht des Universums verwendet ich eine Kamera die 2 Behavoirs besitzt (zum bewegen und zum schauen). Mit dieser Kamera kann ich mich momentan frei im Universum bewegen. 
Nun möchte ich per Tastendruck(auf Tastendrücke kann ich schon reagieren ;-)). die Kamera so verändern, daß sie so positioniert ist, daß sie auf einen Planeten Richtung Sonne schaut, also sagen wir hinter einem Planeten instaliert ist. 
Also 1) Wie kann ich also zwischen den verschiedenen Ansicht auf die Planeten und der normalen freibeweglichen Kamera hin und her wechseln?

und 2) Wie bekomm ich es hin, daß die Kamera in der "Planetenansicht" immer mit dem Planeten mitwandert und auf die Sonne gerichtet ist?

zum Verständnis hier meine Klasse Kamera:

die 3 Behaviors sind von Behavior abgeleitete Klassen.

[HIGHLIGHT="Java"]public class Camera extends BranchGroup {

  private TransformGroup transformGroup;

  FreeLookBehavior freeLookBehavior = null;

  FreeMoveBehavior freeMoveBehavior = null;
  PlanetLookBehavior planetLookBehavior = null;

  ////////////////////////////////////////////////////////////////////////////

  public Camera(TransformGroup tg) {
    transformGroup = tg;

    enableFreeCamera();
  }

  ////////////////////////////////////////////////////////////////////////////

  public void enableFreeCamera(/*SimpleUniverse u*/) {

    resetCamera(); // Kamera neu initialisieren

    // Initialisierung der Behaviors

    freeLookBehavior = new FreeLookBehavior(transformGroup);

    this.addChild(freeLookBehavior);

    freeLookBehavior.setSchedulingBounds(Universe.BigBounds);
    freeLookBehavior.setEnable(true);

    freeMoveBehavior = new FreeMoveBehavior(transformGroup);

    this.addChild(freeMoveBehavior);
    freeMoveBehavior.setSchedulingBounds(Universe.BigBounds);
    freeMoveBehavior.setEnable(true);
  }

  ////////////////////////////////////////////////////////////////////////////

  public void enablePlanetCamera(/*int PlanetId oder BranchGroup Planet ?*/) {
  // ... psoitionierung der Kamera wie bewerkstäligen ?
  }

  ////////////////////////////////////////////////////////////////////////////

  public FreeLookBehavior getLookBehavior() {
    return freeLookBehavior;
  }

  ////////////////////////////////////////////////////////////////////////////

  public FreeMoveBehavior getMoveBehavior() {
    return freeMoveBehavior;
  }

  ////////////////////////////////////////////////////////////////////////////

  public void setActivateLookBehavior(boolean active) {
    freeLookBehavior.setEnable(active);
  }

  ////////////////////////////////////////////////////////////////////////////

  public void setActivateMoveBehavior(boolean active) {
    freeMoveBehavior.setEnable(active);
  }

  ////////////////////////////////////////////////////////////////////////////

  public void setSpeed(double speed) {
    freeMoveBehavior.setSpeed(speed);
  }

  ////////////////////////////////////////////////////////////////////////////

  public double getSpeed() {
    return freeMoveBehavior.getSpeed();
  }

  ////////////////////////////////////////////////////////////////////////////

  private void resetCamera() {
    freeMoveBehavior.setEnable(false);
    freeLookBehavior.setEnable(false);
    planetLookBehavior.setEnable(false);

    this.removeChild(freeLookBehavior);
    this.removeChild(freeMoveBehavior);
    this.removeChild(planetLookBehavior);
  }
}[/HIGHLIGHT]


----------



## Ebenius (30. Mrz 2009)

Ich hab den ganzen Quelltext mal eben formatiert und von den ganzen Farbanweisungen Deiner IDE befreit. Vorsicht mit dem WYSIWYG-Editor im Forum, wenn man Quelltext einfügt. Notfalls zwischendrin immer nochmal in einen Texteditor (vll. Notepad) einfügen und daraus kopieren, um die lästigen Farbangaben und Formatanweisungen loszuwerden. Und dafür dann Highlight-Tags verwenden: 
	
	
	
	





```
[noparse][Highlight=Java]Quelltext[/Highlight][/noparse]
```
Ebenius


----------



## Marco13 (30. Mrz 2009)

Ich bin - in diesem Sinne - "relativer Aufhörer" in Java3D, d.h. habe schon lange nicht mehr aktiv daran gearbeitet, aber ... brauchst du wirklich mehrere ViewingPlatforms? Ich würde vermuten, dass es ausreicht, die Transform der ViewPlatformTransform passend zu setzen. Die Müßte man auch relativ leicht aus der Planetenbewegung berechnen können, so dass die Kamera am bewegten Planeten "klebt"...


----------



## veritas696 (30. Mrz 2009)

@Marco: ja da könnest du recht haben. Also benutze ich in der Funktion enablePlanetCamera() die transformGroup - Membervariable und wende auf diese dann die Transformation des Planeten an oder wie? Rotiert dann meine Kamera nicht auch um sich selbst wie der Planet?


----------



## Marco13 (30. Mrz 2009)

Hmja, an welche TransformGroup die Camera dann wie gehängt wird, muss man sich überlegen. Im Moment vermute ich, dass die Transformation für einen Planeten etwa sowas ist wie

```
sun
    rotate(0, yearRotation, 0)
        transform(0,0,planetDistance)
            rotate(0, dayRotation, 0)
                Planet
```
Für die Kamera bräuchte man dann sowas wie

```
sun
    rotate(0, yearRotation, 0)
        transform(0,0,planetDistance+someOffset)
            camera
```
Also, angenommen die Kamera schaut eigentlich intlang der negativen z-Achse, und wenn alle rotationen 0 sind, ist die Sicht von oben praktisch sowas wie

```
___
      /   \
     | sun |
      \___/
       
planetDistance       
       
       (P)
       
someOffset
       
        ^
      __|__ 
      \   /
       \C/
```
Dann muss die Kamera eigentlich nurnoch mit der "yearRotation" gedreht wird...


----------



## veritas696 (30. Mrz 2009)

Hab das jetzt mal versucht umzusetzen,
Ich habe mir in meiner Klasse Planet eine TransformGroup erstellt die die Position der Kamera besitzt. Ich habe mir an die Stelle eine weiße Kugel gemalt. Und das funktioniert auch wunderbar. Wenn ich nun diese TransformGroup an meine Kamera übergebe.(siehe Code) dann sehe ganz am Anfang des Programms wie meine Kamera hinter dem Planeten steht sich dann aber nicht mehr mit dem Planeten mitbewegt sondern dort stehen bleibt. Wie bekomme ich die Bewegung der Kamera hin? ViewT3D ist eine Membervariable der Klasse Kamera



```
public void enablePlanetCamera(Planet currentPlanet) 
{
TransformGroup ViewTG = currentPlanet.getCamTG();
ViewTG.getTransform(ViewT3D);
 
transformGroup.setTransform(ViewT3D);
 
}
```


----------



## Marco13 (30. Mrz 2009)

Die gleiche Rotation, die auf den Teil des Szenegraphen angewendet wird, der den Planeten enthält, muss auch auf die Camera angewendet werden. Poste ggf. mal ein Compilierbares(!!!) Beispiel.


----------



## veritas696 (30. Mrz 2009)

Hm, aber die weiße Kugel die sich in der CamTG befindet bewegt sich ja auch mit dem Planeten mit *grübbel*

Edit: Kann mit die Rotation nicht nur einmal verwenden, weil sie wurde ja dann schon als Child einer anderen TG zugeordnet!?

hm ich schau mal weiter...


----------



## Marco13 (30. Mrz 2009)

Hm - bin gerade nicht 100% sicher (ist alles so lange her  ) aber ... die Transform3D EINMAL zu setzen, reicht nicht: Entweder, sie muss bei jedem Animationsschritt gesetzt werden, oder die Kamera und der Planet müssen an der SELBEN TransformGroup hängen...


----------

