# j3d, kamera auf sphere, sowie kameraflüge



## jimbo0815 (1. Nov 2007)

hallo leute,

ich bin leider neuling in java3d und habe daher ein kleines problem: wie kann ich die ViewingPlatform auf eine Sphere setzen? ich möchte ein sonnensystem basteln, bei dem man wahlweise aus den weiten des alls und von der erde aus schauen können soll. ferner ist noch ein kameraflug geplant. könnt ihr mir ein paar ratschläge diesbezüglich geben?

gruß,
jimbo0815


----------



## dergrüne (1. Nov 2007)

Hi,

bin auch noch nicht solange mit Java3D vertraut, aber evtl. helfen dir meine Tips.

Wenn du die folgenden drei Zeilen einbaust, kannst du dich schonmal auf deinem canvas3D frei mit der Maus bewegen und auch zoomen.


```
OrbitBehavior orbit = new OrbitBehavior(c3d, OrbitBehavior.REVERSE_ALL);
	    orbit.setSchedulingBounds (new BoundingSphere ());
	    simpleU.getViewingPlatform().setViewPlatformBehavior (orbit);
```

c3d ist in dem Fall dein canvas3d.

Um einen Kameraflug zu machen gibt es imho zwei Möglichkeiten, entweder bastelst du dir eine Behaivor, der dann über eine Schleife die Vektoren verändert und du somit eine vorgefertigte Strecke abfliegen kannst.

Oder du steckst, das komplette Sonnensystem in einen PositionPathInterpolator, da kannst du auch eine Strecke definieren die in einer gewissen Zeit abgeflogen werden soll. Damit kannst du auch Beschleunigungen realieren, falst du an einem Planeten langsamer werden willst oder so. Ist zwar etwas kniffelig, den erst mit einem klicken zu starten geht aber.

Hoffe das konnte schonmal ein wenig helfen.

mfg


----------



## jimbo0815 (1. Nov 2007)

hi,

danke für die hilfe. ich habe habe nun folgendes problem. ich lege mit

```
orbit.setSchedulingBounds(new BoundingSphere(new Point3d(1.0,2.0,3.0),Double.MAX_VALUE));
simpleU.getViewingPlatform().setViewPlatformBehavior(orbit);
```

die kamera nach [1,2,3]. aber wenn ich diese zeilen ausführen lasse ändert sich nichts (als würden sie ignoriert, aber sie werden definitiv ausgeführt). ändere ich aber den blickwinkel mit

```
View v = simpleU.getViewer().getView();
v.setFieldOfView(irgendwas);
```
so wird diese änderung dargestellt. kann ich irgendwo einen parameter falsch gesetzt haben, sodass die änderungen von oben ignoriert werden?

gruß,
jimbo0815


----------



## merlin2 (1. Nov 2007)

Obige Zeilen ändern die Kameraposition nicht. _[1,2,3]_ ist der Mittelpunkt der Kugel, in der das OrbitBehavior reagiert.


----------



## jimbo0815 (1. Nov 2007)

oh stimmt. das habe ich total verwechselt.

wie bekomme ich dann aber eine translation hin?


----------



## BlindGuard (3. Nov 2007)

Dum Di Dum... Irgendwie werd ich das Gefühl nicht los, dass wir die gleiche Aufgabe machen müssen  :roll: 



Ich hänge hier aber auch grad rum und ärger mich wie sonst was, weil das alles nicht so funktioniert wie ich mir das vorgestellt habe... 
Die "Kamera" bewegen, ja, das hab ich hingekriegt.

```
//Mit der View rumspielen.
        Transform3D saveT3D = new Transform3D();
        viewPlatform.getViewPlatformTransform().getTransform(saveT3D);
        float pos = 25f;
        saveT3D.setTranslation(new Vector3f(0f, 15f, pos));
        saveT3D.setRotation(new AxisAngle4f(1f, 0f, 0f, (float) Math.toRadians(-30)));
        viewPlatform.getViewPlatformTransform().setTransform(saveT3D);
```
Das stellt die Kamera etwas weiter zurück und fixiert den Blickpunkt ungefähr wieder auf den 0,0,0 Punkt.
Das sollte bei dir dann auch so funktionieren.


Das Problem das sich jetzt stellt ist, dass ich nicht mehr auf meine "Objekte" zugreifen kann 

Also in Kurz: Wir sollen ein Sonnensystem modellieren. Mit drehenden Planeten und allem drum und dran.

Mein Problem ist grad noch, wie komm ich an die "Werte" der eingefügten Objekte?
Weil ich bau mir meinen Branch-Tree, dann da die TransformGroups rein mit den Planeten und die Rotationen usw....

Aber wenn ich jetzt mit meinem View zB einem Planeten gerne folgen würde. Wie mach ich das? Ich hab irgendwie das Gefühl, dass das Objekt (ein Planet zB) irgendwie "weg" ist, nachdem man den eingefügt hat..

Gibt es eine Möglichkeit, die aktuellen Koordinaten der Sphere herauszukriegen, NACH den ganzen Transformationen?

Weil dann wäre das kein Problem wenn ich dem irgenwie sagen könnte, Rotate, Translate, Schwing, Schwang und dann die Sphere dranhängen. Dann aus der TransformGroup raus und dann von aussen die aktuellen Koordinaten der Sphere abfragen.
Geht sowas? (Sorry, das der Text jetzt so lang geworden ist. Bin hier aber auch grad am Verzweifeln  )

Wäre über Tipps wirklich dankbar 

Bye,
BG


----------



## jimbo0815 (4. Nov 2007)

hallo, hmmm....klingt nach der guten alten goethe-uni 

danke soweit! ich habe mitlerweile aus diversen beiträgen in diesem forum kameraflüge realisiert, hänge aber ebenso daran, die aktuellen koordinaten meiner TransformGroups zu bestimmen und die kamera genau zu diesen fliegen zu lassen.

ein weiteres ungelöstes problem ist, dass ich keine ahnung habe, wie ich die kamera an ein objekt binden kann, in diesem fall wäre dies eine TransformGroup TransformGroup tgErde. die kamera soll mit der erde mitfliegen. ich habe stundenlang gegoogelt und natürlich auch selbst herumprobiert, doch leider habe ich bisher nichts brauchbares finden können.


----------



## jimbo0815 (8. Nov 2007)

ok, habs jetzt...
die positionen der planeten kann man über deren alphas bestimmen. wenn das alpha der erde alphaErde heisst, dann bekommst du über alphaErde.value einen wert zwischen 0 und 1, der angibt (prozentual), wie weit die bewegung des alphas, also die umdrehung um die sonne abgeschlossen ist. bei 1 läuft er wieder von 0 los. anhand dieses werts kann man den winkel ausrechnen, den die verbindung planet-sonne mit der x-achse aufspannt und wenn du dann noch den radius des kreises, den der planet beschreibt hinzunimmst kannst du daraus dessen koordinaten berechnen.

ich hoffe dies ist ein hilfreicher anstoß 
noch weiterhin "frohes schaffen"


----------



## BlindGuard (9. Nov 2007)

Puuhh.... ich glaub, da "schummel" ich lieber ein bisschen und kreiere ein stehendes Modell an dem ich die Kamera-Bewegung durchführe.
Das Thema ist ja immerhin "Lügen mit Bildern". 

Hast du das mit dem Bump-Mapping hingekriegt? Da häng ich ja ziemlich


----------



## jimbo0815 (9. Nov 2007)

Ich bin mir nicht sicher, ob es reicht wenn die Planeten sich nicht bewegen. Ich war heute beim Meister und er meinte, wir sollen auch die Kamera rotieren lassen, wenn sie auf der Erde sitzt, sodass die Sonnenfinsternis bei rotierender Erde zu sehen ist 

Nein, damit habe ich leider noch nicht angefangen. Kommt noch....eine gute Hilfe hierfür soll aber link sein. Wenn ich was habe werde ich mich melden.


----------



## BlindGuard (9. Nov 2007)

Also langsam glaub ich ja die haben 'ne Meise.. Ich sitz hier garantiert schon über 60 Stunden an dem Rotz und verzweifel immer wieder an diesem blöden Java3D... Blöde "Fingerübung"... 
Die Aufgaben letztes Jahr waren auch immer so überdimensioniert. Die sollten mal etwas realistischer werden... So ein Blödsinn....
Das mit dem Bump-Mapping hab ich auch schon mal gesehen... Aber so richtig schlau daraus werd ich nicht.. Naja, mal sehen.
Argh.....


----------



## Der Dritte (10. Nov 2007)

Da bist du sicher nicht der einzige, der solange an der Aufgabe sitzt!

Habe auch noch die Sonnenfinsternis vor mir und mir fehlt sogar noch die Idee, wie ich es lösen könnte 

Gruß


----------



## BlindGuard (10. Nov 2007)

Pfff.... ich kriegs jetzt seid 3 Tagen (ca. 20 Stunden) NICHT HIN meine scheiß Kamera in einen Interpolator zu verpacken...
Mit dem SimpleUniverse kommt man ja nicht weit, da man da die den ViewTransform nicht verändern kann. 
Hab jetzt den ganzen Tag gebraucht um mein eigenes Universum aufzustellen, da ich mich im ViewPlatform vs. ViewingPlatform Wirrwarr verloren habe. Und jetzt krieg ichs TROTZDEM NICHT HIN!

Ich KOTZE! Vor allem, wenn man so im Internet liest, findet man nur, dass die ViewPlatform von Java ja soooo schlecht dokumentiert ist. Das ist wohl wahr... Wieso zum Geier müssen wir's dann machen? Alter Schwede. Solch unrealistische Aufgabenstellungen. ich könnte echt kotzen!

Bye,
BG....


----------



## Illuvatar (10. Nov 2007)

Hmm eigenes Universe ist glaub ne ziemlich komplizierte Angelegenheit... hast du mal folgendes probiert?

 - Eigener Behavior, der bei jedem Frame ausgeführt wird:
 - Absolute Position des Objekts, an dem die Kamera hängen soll, herausfinden (getLocalToVWorld oder so)
 - Kamera da hin setzen (oder noch bissle nach hinten, so wie du es eben willst)


----------



## BlindGuard (10. Nov 2007)

> - Eigener Behavior, der bei jedem Frame ausgeführt wird:


Das probier ich gerade. Auf die Idee bin ich auch vor 'ner halben Stunde gekommen... Muss mich aber erst noch in den Behaviors zurechtfinden 


> Absolute Position des Objekts, an dem die Kamera hängen soll, herausfinden (getLocalToVWorld oder so)


Das ist auch ein Problem, da wir ja ca 15 Objekte haben und ich war so clever und lass mir die durch eine Methode erstellen. Das funzt auch super, nur leider habe ich, sobald die erst mal Live sind, keinerlei Möglichkeit die zu unterscheiden 

Alles blöder Kram....


----------



## Illuvatar (10. Nov 2007)

Also, wie du an das richtige Objekt rankommst, musst du wissen, aber das wird ja wohl irgendwie möglich sein 

Ein bisschen (ungetesteter, aber compilieren tut es ) Beispielcode für den Behavior:


```
class MyBehavior extends Behavior
{
    @Override
    public void initialize()
    {
        wakeupOn(new WakeupOnElapsedFrames(0));
    }

    @Override
    public void processStimulus(Enumeration arg0)
    {
        Transform3D bindTo = new Transform3D();
        deineTransformGroup.getLocalToVWorld(bindTo);
        universe.getViewingPlatform().getViewPlatformTransform().setTransform(bindTo);
        wakeupOn(new WakeupOnElapsedFrames(0));
    }
}
```

Edith meint: natürlich getLocalToVWorld, nicht getTransform


----------



## BlindGuard (11. Nov 2007)

Boaahhh... ich sehe Licht... Das gibts ja net.. Meine Kamera bewegt sich.. (Habe den Behaviour von hier verändert http://www.newdawnsoftware.com/tutorials/Tutorial04/index.html).
Dann schön mit LookAt die Objekte anvisieren und rumfliegen.

Sonnenfinsternis fertig, Planetensytem auch (naja, da muss ich noch mal die Rotationen überprüfen, aber eigentlich sollte es klappen).
Kamerafahrt mach ich wie gesagt am stehenden Objekt. Alles andere ist mir jetzt ZU stressig.
Fehlt nur noch das Bump-Mapping und Code-Optimierung morgen.. Mal gucken ob ich das hinkrieg 

Zu diesem "Wie finde ich mein Objekt wieder" Problem:
Die Sache ist die, ich habe meine Klasse, der gebe ich die einzelnen Daten (also Durchmesser, Entfernung, Rotationsachse usw...). Die ruf ich halt für jeden Planeten einmal auf und bekomme eine Branchgroup als Return, die ich dann in meinen Conten-Graph reinpacke.
Das Problem ist halt, dass die für mich dann so gut wie unerreichbar sind, da die Dinger ja keinen Namen haben (kann man Branchgroups durch feste Namen erreichbar machen? ???:L )
Und wenn ich mir einfach getAllChildren oder so geben lasse, dann hab ich da halt 15 Branchgroups als Return. Diese kann ich aber nicht unterscheiden 
Irgendeine Idee wie ich die "markieren" kann um sie später besser aufzufinden?

(Ooooohhhh gerade eine Idee.... evtl am Ende der Group eine Variable nach aussen schreiben lassen, die die aktuelle Position enthält? Ach verdammt... Dann brauch ich da ja auch schon wieder ein Behavior, oder? Also insgesamt dann 15 Behaviors. Für jeden Planet eine... Oh mann... da teste ich mal ein bisschen rum....)

Wünsche euch eine schöne Nacht und ähnliche Erfolgserlebnisse


----------



## Der Dritte (11. Nov 2007)

Wie hast du das mit der Sonnenfinsternis gemacht?

Ich bekomme leider die Kamera nicht fest auf die Erde installiert, so dass die Kamera mitdreht


----------



## Der Dritte (11. Nov 2007)

Der Dritte hat gesagt.:
			
		

> Wie hast du das mit der Sonnenfinsternis gemacht?
> 
> Ich bekomme leider die Kamera nicht fest auf die Erde installiert, so dass die Kamera mitdreht



und ich würde gerne meinen Blick zu ändern, das ich als Schauender nicht mehr so ein großes Blickfeld habe


----------



## Guest (11. Nov 2007)

BlindGuard hat gesagt.:
			
		

> > - Eigener Behavior, der bei jedem Frame ausgeführt wird:
> 
> 
> Das probier ich gerade. Auf die Idee bin ich auch vor 'ner halben Stunde gekommen... Muss mich aber erst noch in den Behaviors zurechtfinden
> ...



speicher die alphas in nem array oder so. wenn du die alphas hast kannst du alles berechnen.


----------



## Gast (14. Nov 2007)

Meine Kamera will auch nicht fliegen und Bumps... 3 Bücher, 5 Tuts und google voll, nur finde ich kaum etwas nützliches und was Bumpmaps angeht...


----------



## Gast (15. Nov 2007)

was Bumpmaps angeht...

...sollte man mal hier schauen:
http://paginas.terra.com.br/educacao/alessandroborges/java3d.html


----------

