2011-01-03 6 views
1

Ich möchte das Ziel einer Orbit-Kamera vergrößern.Implementieren von Zoom auf eine Orbit-Kamera

Die Kamera mit einer Funktion wie diese manipuliert wird:

moveCamera(x,y,z); 

auf Winkel je die Werte x, y, sollte z unterschiedlich sein, eine korrekte Zoom-Funktion zu erhalten, aber ich kann nicht einen Weg finden, um es zu tun .

Ich benutze Funktionen wie getCameraposx, getTargetposy etc .. um die Koordinaten für mein Ziel und Kamera zu bekommen.

Zoom irgendwie funktioniert jetzt nach PigBens helfen, aber ich habe zu einem Problem geführt. Das Einzoomen ist kein Problem, aber nach dem Zoomen funktioniert das Zoomen nicht mehr. Und mit zu nah bin ich noch ziemlich weit weg.

Hier ist meine Zoom-Funktion.

void Camera::orbZoom(bool Zoo) 
{ 
    float x; 
     float y; 
     float z; 
     float xc; 
     float yc; 
     float zc; 
    float zoom; 

    x=getTargetposx(); 
    y=getTargetposy(); 
    z=getTargetposz(); 
    xc=getCameraposx(); 
    yc=getCameraposy(); 
    zc=getCameraposz(); 

    xc=xc-x; 
    yc=yc-y; 
    zc=zc-z; 

    if (ivan==true){ 
     zoom = 1.02; 
     if (xc<1){xc=+1.5;} 
     else if (yc<1){yc=+1.5;} 
     else if (zc<1){zc=+1.5;} 
      xc=xc*zoom; 
      yc=yc*zoom; 
      zc=zc*zoom; 
    } 
    if(ivan==false) { 
     zoom = 0.98; 
    xc=xc*zoom; 
    yc=yc*zoom; 
    zc=zc*zoom; 
    } 

    xc=xc+x; 
    yc=yc+y; 
    zc=zc+z; 
    camerapos.assign(xc,yc,zc); 

}

Ok, so das letzte, was nicht funktioniert hat, wie ich im letzten Kommentar schrieb. Ich denke, da ist noch etwas, das dieses Verhalten verursacht. Die Grenze für den Zeitpunkt, an dem es aufhört zu arbeiten, ist nur ein bisschen näher am Ziel als die Ausgangsposition der Kameras oder an der Startposition, nicht wirklich sicher. Aber wenn ich mit dem Herauszoomen anfange und nicht näher an die Startposition der Kamera herankomme, funktioniert es.

Ich denke, der Fehler ist in diesem Teil des Codes, aber ich könnte falsch liegen, wenn jemand einen anderen Teil sehen möchte einfach fragen. Alle anderen Kameraeinstellungen funktionieren ordnungsgemäß. Zwei Modi, Orbit und Tumble. Pitch, Gier und Roll funktioniert für beide Modi und strafing für den Tumble-Modus.

Hier sind zum Beispiel zwei dieser Funktionen.

Antwort

1

Die Zielposition von der Kameraposition subtrahieren, dann skalieren und dann die Zielposition erneut hinzufügen.

camera_position -= target_position; 
camera_position /= zoom_factor; 
camera_position += target_position; 

In Bezug auf Ihr zweites Problem. Meine Vermutung ist, dass es wegen der Mangel an Präzision in den Schwimmern ist. Wenn Sie zu einem bestimmten Punkt kommen, reicht eine Multiplikation mit 1,02 nicht aus, um den Gleitkommawert auf den nächsthöheren darstellbaren Wert zu ändern, sodass er sich überhaupt nicht ändert. Meine Tests zeigen, dass dies nicht passiert, bis der Schwimmer im 10e-44 Bereich ist, also müssen Sie einige ziemlich gigantische Einheiten verwenden, damit dies ein Problem ist. Ein paar mögliche Lösungen.

  1. Verwenden Sie Doubles anstelle von Floats. Sie werden immer noch das gleiche Problem haben. Aber es wird nicht bis zu einem viel viel engeren Zoom ins Spiel kommen.

  2. Verwenden Sie kleinere Einheiten. Ich gehe normalerweise nur mit 1.0 = 1 meter und ich habe nie zu diesem Problem geführt.

  3. Erzwingen Sie einen maximalen Zoom. Sie würden dies in Kombination mit den anderen 2 oben tun.

+0

Danke, ich vermutete, dass es so einfach sein würde. Ich habe versucht, Pythagoras zu verwenden, um den Abstand zwischen Kamera und Ziel zu berechnen, und dann, wenn ich die Distanz verkleinert oder vergrößert habe, neue Werte für x, y, z berechnen. – snackbar

+0

Die Verwendung von double double hat nichts daran geändert, wie nah der Zoom-Out-Fehler auftritt. Und ich arbeite bereits in einem kleinen Maßstab meine Werte auf x, y, z reichen von etwa -20 bis +20, vielleicht von -50 bis +50 Tops. – snackbar