Camera-Drehung um ein Spielfeld
-
Das Spielfeld befindet sich zwischen Camera-Position und Camera-Look-at-Target. Die Kamera wird vom Programm über Eingaben im Kreis um das Spielfeld bewegt. Hierbei existieren zwei Kreise: a) Kamera-Position b) Kamera-Look-at-Target
Die Position bezüglich des Winkels Phi ist hierbei in den beiden Kreisen jeweils um 180° versetzt. Folgende Funktion bildet die beiden Kreise ab, liefert jedoch leider noch ein Flip-Flop-Verhalten, d.h. springt ständig zwischen zwei Areale hin und her (Y-Wert bleibt stabil, ein Kreis oben, einer unten auf Spielfeldebene):Camera-Position Camera-Target X: 491.913 Z: -599.2 XT: -341.201 ZT: 151.882 X: 137.386 Z: 287.805 XT: 14.7565 ZT: -766.83 X: 461.49 Z: -619.502 XT: -325.416 ZT: 163.638void circleCam(vector3df camPos, vector3df camTar, f32 degPhi, ICameraSceneNode* nodeCam) { f32 radius = sqrt( .25 * (camPos.X-camTar.X)*(camPos.X-camTar.X) + .25 * (camPos.Z-camTar.Z)*(camPos.Z-camTar.Z) ); f32 radPhi = 3.14159/180.0 * degPhi; vector3df camNewPos; camNewPos.X = (camTar.X-camPos.X)/2 + radius * cos(radPhi); camNewPos.Y = camPos.Y; camNewPos.Z = (camTar.Z-camPos.Z)/2 + radius * sin(radPhi); vector3df camNewTar; camNewTar.X = (camPos.X-camTar.X)/2 + radius * cos(radPhi+180); camNewTar.Y = camTar.Y; camNewTar.Z = (camPos.Z-camTar.Z)/2 + radius * sin(radPhi+180); nodeCam->setPosition(camNewPos); nodeCam->setTarget(camNewTar); }Die Funktion dreht sich genau um den Mittelpunkt der gedachten Verbindungslinie von Position und Target. Das möchte ich auch noch flexibilisieren, damit man den Blickwinkel auf das Spielfeld variieren kann.
Findet jemand den Fehler? Vielleicht liegt es daran, dass sich das Spielfeld bei (0,0,0) befindet. Ich denke, dass es etwas mit dem Vorzeichen bei "camTar.X-camPos.X" etc. zu schaffen hat.
Programm verwendet die Irrlicht Engine (sollte hier aber keine Rolle spielen).
-
Ich habe inzwischen eine vereinfachte Lösung gefunden, die hervorragend funktioniert:
void CGame::circleCam(f32 degPhi, ICameraSceneNode* nodeCam) { vector3df M(680,0,680); f32 radius = 1350.0f; // by experiment f32 radPhi = DEGTORAD * degPhi; vector3df camPosInit = vector3df( M.X - radius, 720, M.Z ); // by experiment vector3df camTarInit = vector3df( M.X + radius, 0, M.Z ); // by experiment vector3df camNewPos; camNewPos.X = M.X - radius * cos(radPhi); camNewPos.Z = M.Z - radius * sin(radPhi); vector3df camNewTar; camNewTar.X = M.X + radius * cos(radPhi); camNewTar.Z = M.Z + radius * sin(radPhi); camNewPos.Y = camPosInit.Y; camNewTar.Y = camTarInit.Y; nodeCam->setPosition(camNewPos); nodeCam->setTarget(camNewTar); }