2016-03-31 4 views
2

Ich habe eine sehr einfache Java3D-Anwendung, sie enthält zwei Würfel, von denen einer den anderen umkreist.Java3D - Ist es möglich, eine viewingPlatform zu haben, die ein sich bewegendes Objekt verfolgt

Wie so:

enter image description here

Wie Sie sehen können, die Standardposition für die Aussichtsplattform ist von einer ‚Art‘ Vogelperspektive.

Der Code, der wie so sieht

TransformGroup cameraTG = u.getViewingPlatform(). 
        getViewPlatformTransform(); 
Vector3f translate = new Vector3f(); 
Transform3D T3D = new Transform3D(); 
translate.set(0.0f, 0.0f, 20.0f); 
T3D.setTranslation(translate); 
cameraTG.setTransform(T3D); 

Meine Frage ist, ist es möglich, die Aussichtsplattform, um den größeren Würfel zu verfolgen (die Würfel, um den kleineren Platz dreht). Oder direkter: Kann sich die Aussichtsplattform um einen bestimmten Körper drehen?

Weitere Informationen: Mein Ziel ist es, ein Miniatur-Sonnensystem zu haben, das die Sonne, die Erde und den Mond enthält. Und ich mag es aus der Sicht der Erde sehen (fast wie ein Blick von der ISS)

enter image description here

Hilfe oder Zeiger wäre fantastisch. Bitte zögern Sie nicht, nach weiteren Informationen zu fragen, wenn nötig.

+1

beide in einem Knoten gesetzt und gelten sowohl für – gpasch

Antwort

2

Sie haben ein schönes Beispiel hier http://java3d.nl/Tutorials/Java/Java3d/Controlthecamera_12.php

Die ursprüngliche http://java3d.nl Website ist nicht mehr verfügbar, aber Sie können immer noch die Cache-Version aus dem Internet Archive verwenden: https://web.archive.org/web/20131218022035/http://java3d.nl/Tutorials/Java/Java3d/Controlthecamera_12.php

  this.camera = this.universe.getViewingPlatform().getViewPlatformTransform(); 

     //Add things to the universe 
     this.root = new BranchGroup(); 
     this.root.addChild(new ColorCube(0.2)); 
     this.universe.addBranchGraph(root); 

Meine Idee wie diese ist :

BranchGroup b=new BranchGroup(); 
b.addChild(cube); 
b.addChild(camera); 

dann in einer Schleife, wo Sie den Block drehen:

while(true) { 
    ... b.getChild()......... etc 
    apply transform 
} 

oder genauer gesagt

for(j=0; j<group.numChildren(); j++) { 
    Node ni=group.getChild(j); 
    if(ni instanceof TransformGroup) { 
     Transform3D tdi=new Transform3D(); 
     TransformGroup tgi=(TransformGroup)group.getChild(j); 
     tgi.getTransform(tdi); 
     Transform3D rotation = new Transform3D(); 
     rotation.rotX(Math.toRadians(0.001*i)); 
     tdi.mul(rotation); 
     tgi.setTransform(tdi); 
    } 
} 
+0

verwandeln Arrrr! Ich sehe jetzt! Vielen Dank @gpasch, das ist eine massive Hilfe. Und danke für das Beispiel, ich habe Stunden damit verbracht, ein solches Beispiel zu finden, aber ohne Erfolg. Danke noch einmal –

0

Es gibt eine einfachere Lösung. Wenn Sie versuchen, den Blick des Betrachters mit Winkeln und Drehung zu steuern, können Sie einfach sagen, welchen 3D-Punkt Sie betrachten möchten. Im ViewingTransform, können Sie "LookAt (...)" nennen:

 TransformGroup viewingTransformGroup = simpleUniv.getViewingPlatform().getViewPlatformTransform(); 
    Transform3D viewingTransform = new Transform3D(); 
    Point3d eye = viewersLocation; 
    Point3d center = gazePoint; 
    Vector3d up = new Vector3d(0,1,0); //assumes +y-axis points up 
    viewingTransform.lookAt(eye, center, up); 
    viewingTransform.invert(); 
    viewingTransformGroup.setTransform(viewingTransform);