2012-12-25 14 views
5

Próbuję przenieść kamerę w sferyczny ruch wokół modelu w moim świecie. Widziałem konwersję współrzędnych sferycznych (rho, theta, phi) na współrzędne kartezjańskie (x, y, z), ale nie jestem pewien, jak to ustawić. Oto, co próbowałem do tej pory, ale nie jest to ciągły orbitujący wokół modelu. Dochodzi do pewnego punktu, a potem rotacja wydaje się odwracać.Przenoszenie kamery wokół kuli

Initialize theta i phi:

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

Aktualizacja theta i phi każda ramka:

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

Konwersja theta i phi do współrzędnych kartezjańskich do kamery:

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); 

Następnie zaktualizować okiem kamery w punkcie a widok matrycy:

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

Uwaga: używam Java na Android z ramami libgdx i staram się kontrolować obrót przy użyciu na ekranie wirtualny joystick 2D i nadal potrzebuję znaleźć sposób mapowania joysticka na theta i phi.

Każda pomoc jest bardzo doceniana!

Odpowiedz

4

Niedawno zrobiłem coś takiego. This website bardzo mi pomógł, aby wyobrazić sobie, co muszę zrobić.

Co trzeba zrobić, to przekształcić swoje lokalne współrzędne joysticka (w stosunku do jego centrum), aby rozbić i wartości Yaw:

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

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

Następnie można użyć kwaternion do jej reprezentowania jest rotacja:

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

Następnie można zastosować kwaternion do aparatu widzenia matrycy przy użyciu wbudowanego w libgdx rotate(quaternion) metody:

camera.view.rotate(rotationQuat); 

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

To działało idealnie! Dziękuję Ci!! –

+0

Działa to tylko wtedy, gdy wyglądasz w oryginale. – lacas