2016-04-12 6 views
1

Ich habe gerade java3D gestartet und ich kann die Kamera nach oben/unten/links/rechts/vorwärts/rückwärts bewegen, aber ich kann nicht herausfinden, wie man die Kamera zu machen Winkeländerung, zum Beispiel, von der Vorfreude nach links zu ändern. Könnte mir jemand ein Beispiel geben? Außerdem sollte ich getViewingPlatform() setzen. GetViewPlatformTransform(). SetTransform (test.position); in meiner Hauptmethode, oder sollte ich etwas anderes machen?Wie dreh ich die Kamera/viewPlatform in Java 3d

Ich habe versucht, nur mit der Maus und Drehen der Ansicht OrbitBehavior Orbit = neue OrbitBehavior (Leinwand, OrbitBehavior.REVERSE_ROTATE);

orbit.setSchedulingBounds(new BoundingSphere()); 
orbit.setRotXFactor(2); 
orbit.setRotYFactor(2); 

Aber es funktioniert nicht, wenn ich getViewingPlatform add() getViewPlatformTransform() setTransform (test.position)..; an die While-Schleife in der Hauptmethode. Der Blickwinkel wird wiederholt zurückgesetzt.

+0

Bitte geben Sie an, was Sie versucht haben. – Reinard

Antwort

2

Anstatt den Betrachter (Kamera) mit Winkeln zu steuern, können Sie ihn steuern, indem Sie einen 3D- "Blickpunkt" definieren (der Punkt, auf den sich die Aufmerksamkeit richtet). Damit die Kamera nicht seitlich kippen kann, definieren Sie upDir = [0, 1, 0] (J3D setzt voraus, dass die y-Achse nach oben zeigt).

Dann ändern Sie die ViewingTransform, die in SimpleUniverse lebt.

Hier ist Beispielcode aus meiner App:

// ***********declare these variables in class where canvas3D lives ***** 
//J3D stuff 
public InteractiveCanvas3D canvas3D; 
public SimpleUniverse  simpleUniv; 
private Transform3D   viewingTransform; 
private TransformGroup viewingTransformGroup; 

public static Point3d viewersLocation; 
public static Point3d gazePoint; //point viewer is looking at 

// and initialize as follows: 

viewingTransformGroup = simpleUniv.getViewingPlatform().getViewPlatformTransform(); 
viewingTransform = new Transform3D(); 


//called to update viewer's location and gaze: 
// *********************** UpdateViewerGeometryJ3D 
public void UpdateViewerGeometryJ3D() { 
    Point3d eye = viewersLocation; 
    Point3d center = gazePoint; 
    Vector3d up = upDir; 
    viewingTransform.lookAt(eye, center, up); 
    viewingTransform.invert(); 
    viewingTransformGroup.setTransform(viewingTransform); 

ich vergessen, warum die Betrachtungstransformation invertiert werden muss. Hoffe das hilft.

+0

Ich habe eine Frage. Bewegst du dich nach links unten rechts und der Kamerawinkel ändert sich, bleiben die Richtungen gleich? Zum Beispiel, wenn ich vorwärts gehen würde, dann schaue nach rechts, aber halte dann die Vorwärts-Taste wieder, würde ich vorwärts in die neue Richtung (rechts) oder vorwärts in die alte Richtung (Start-Richtung) gehen? –

+0

Nein. Der Blickpunkt ("lookAt()") beeinflusst nicht die Bewegung des Betrachters, nur die Blickrichtung. Um eine Analogie zu den gummiumdeckenden Fahrern zu machen, sagen wir mal, es gibt ein Autofeuer auf der Autobahn. Die Fahrer orientieren sich am Standort des brennenden Autos (GazePoint). Sein Hals dreht sich weiter, um immer wieder auf den gleichen Fixpunkt zu schauen, an dem er vorbeikommt. Ich habe festgestellt, dass die "Moving Viewer + Fixed Look Point" -Technik dem Benutzer ein realistisches Gefühl gibt, in einem 3D-Raum zu sein. Es ist intuitiver, da es die Art nachahmt, wie Menschen ihre Aufmerksamkeit auf ein Objekt richten. – pbierre