2012-12-25 16 views
5

Ich versuche, meine Kamera in einer sphärischen Bewegung um ein Modell in meiner Welt zu bewegen. Ich habe gesehen, wie man Kugelkoordinaten (rho, theta, phi) in kartesische Koordinaten (x, y, z) umrechnet, aber ich bin mir nicht sicher, wie ich das einrichten soll. Hier ist, was ich bisher versucht habe, aber es ist nicht kontinuierlich um das Modell. Es kommt zu einem bestimmten Punkt und dann scheint sich die Rotation umzukehren.Move Kamera um Kugel

Initialize theta und phi:

private float theta = 0.0f; 
private float phi = 0.0f; 

aktualisieren theta und phi jeder Rahmen:

// This should move the camera toward the upper-right continuously, correct? 
theta = (theta+1.0f)%360; 
phi = (phi+1.0f)%360; 

Konvertieren theta und phi zu kartesischen Koordinaten für die Kamera:

camera.position.x = CAMERA_DISTANCE * (float)Math.sin(theta*MathHelper.PIOVER180) * (float)Math.cos(phi*MathHelper.PIOVER180); 
camera.position.y = CAMERA_DISTANCE * (float)Math.sin(theta*MathHelper.PIOVER180) * (float)Math.sin(phi*MathHelper.PIOVER180); 
camera.position.z = CAMERA_DISTANCE * (float)Math.cos(theta*MathHelper.PIOVER180); 

aktualisieren Sie dann die Kamera Blick auf Punkt und Blick Matrix:

camera.lookAt(0, 0, 0); 
camera.update(); 

Hinweis: Ich bin mit Java auf Android mit dem Libgdx Rahmen und ich versuche, um die Drehung zu steuern, um einen 2D-Bildschirm-virtuellen Joystick und ich muss noch eine Möglichkeit finden, den Joystick auf theta und phi abzubilden.

Jede Hilfe wird sehr geschätzt!

Antwort

4

Ich habe kürzlich etwas genau so gemacht. This website hat mir sehr geholfen, mir vorzustellen, was ich tun musste.

Was Sie tun müssen, ist Ihre lokale Joystick Koordinaten (bezogen auf es Mitte) umwandeln Nick- und Gierwerte:

public float getPitch() 
{ 
    return (position.X - center.X) * MathHelper.PIOVER180; 
} 

public float getYaw() 
{ 
    return (position.Y - center.Y) * MathHelper.PIOVER180; 
} 

Dann können Sie eine quaternion verwenden, sie zu vertreten ist Rotation:

public void rotate(float pitch, float yaw, float roll) 
{ 
    newQuat.setEulerAngles(-pitch, -yaw, roll); 
    rotationQuat.mulLeft(newQuat); 
} 

Dann können Sie die quaternion der Ansicht Matrix der Kamera anwenden mit Libgdx der in rotate(quaternion) Verfahren gebaut:

camera.view.rotate(rotationQuat); 

// Remember to set the camera to "look at" your model 
camera.lookAt(0, 0, 0); 
+0

Das hat perfekt funktioniert! Vielen Dank!! –

+0

Dies funktioniert nur, wenn Sie in origo schauen. – lacas