Zeitunabhängige interpolation bei 3D Bewegung



  • Hi,

    ich habe gerade ein kleines mathematisches Problem in meinem 3D Spielchen.
    Ich habe eine Kamera welche einem beweglichen Objekt folgt. Die Kamera soll allerdings nicht "starr" am Objekt befestigt sein, sondern den Bewegungen des Objekts etwas verzögert folgen. Genauer gesagt ist mein Objekt ein bewegliches Auto, und da sieht es blöd aus wenn die Kamera sich immer starr hinter meinem Auto befindet.

    Im moment mache ich die Berechnung der aktuellen Kameraposition wie folgt:

    //Berechne Gewichtungsfaktor:	
    float alpha = clamp( frametime * 3.0f, 0.0f, 1.0f); 
    Vector3d vCamPos = vDesiredPos * alpha + vLastCamPosition*(1.0f-alpha);
    vLastCamPosition = vCamPos;
    

    Wobei jeder Variable die mit einem kleinen v anfängt ein 3-Dimensionaler Vektor ist. "frametime" ist die Zeit die das letzte Bild zum rendern gebraucht hat, also 1/(Bilder pro Sekunde).

    Leider ist die Berechnung meines Gewichtungsfaktor alt <> neu (alpha) nicht ganz Zeitunabhängig. Bei hohen Frameraten (frametime < 0.01) "lagt" die Kamera etwas mehr hinterher als bei niedrigen Frameraten (frametime > 0.1).
    Jemand eine Idee wie ich den Gewichtungsfaktor besser berechnen kann?

    Ich sollte noch hinzufügen dass die clamp() Funktion nur zur Sicherheit da ist, alpha wird erst dann auf 1.0 begrenzt wenn die frametime >= 0.3 ist, was ca. 3 Bildern pro Sekunde entsprechen würde und daher eh nicht praktikabel ist.



  • Dann musst du so tun als wäre eine Feder zwischen Auto und Kamera gespannt. Die Beschleunigung bzw. Kraft die beiden Objekte zusammenzieht oder auseinanderdrückt ist dann Abhängig von dem Abstand zwischen Auto und Kamera. Mit $$F=-c \cdot \Delta l$$ sollte das einfach sein. Siehe hier.


Anmelden zum Antworten