2012-04-13 10 views
4

ich eine Zeit verwenden Korrigierte Verlet Integration hier: http://www.gamedev.net/page/resources/_/technical/math-and-physics/a-simple-time-corrected-verlet-integration-method-r2200Zeit korrigiert Verlet Integration und zu groß Zeitschritte

Aber als mein Ball ist an einer Wand (horizontal Wand, Kugel auf ihn und die Beschleunigung nach unten gerichtet ist) für eine Irgendwann kann mein Spiel die Kollision nicht richtig erkennen und der Ball sinkt. Wenn ich eine feste Kappe auf deltatime wie 1/60 setze, scheint es zu funktionieren.

Ich denke, das Problem sind zu große Zeitschritte. Aber die zeitkorrigierte Verwindungsintegration ist gemacht, um zu große Zeitschritte zu vermeiden, ist es richtig? Wenn ja, warum brauche ich die Zeitbegrenzung?

Antwort

2

Von dem, was ich verstehe, hilft die zeitkorrigierte Verlet Integration nur, wenn Sie eine schwankende Framerate haben, aber es wird nicht helfen, wenn Ihre Basisframerate zu niedrig ist.

+0

Ich weiß nicht, ob meine Framerate ist zu niedrig, aber ich benutze einen Thread und jeden Zyklus mache ich die Verlet Integration. Die Zeitdifferenz zwischen 2 Zyklen des Fadens ist nicht festgelegt, dann schwankt sie. Es könnte sein, dass die Bildrate manchmal zu niedrig ist. Wenn ja, ist es richtig, die Kappe zu benutzen? – thebestneo

+0

Ich habe eine Funktion hinzugefügt, die steuert, wann die Kugel die Zelle wechselt. Wenn ein Ball die Zelle von 1 auf 2 ändert, prüft die Funktion beispielsweise, ob die letzte Zelle eine Wand hat. Wenn es wahr ist, wird der Ball zur letzten Zelle bewegt und seine Positionen und seine letzten Positionen werden gleichgesetzt (Kollision mit einer Wand -> Geschwindigkeit = 0). Aber manchmal, wenn ich nicht die deltatime Grenze habe, funktioniert es nicht. @ Lâm Tran Duy – thebestneo

+0

können Sie meine neue Antwort lesen? – thebestneo

6

Die im Artikel angegebene Gleichung ist fehlerhaft. Als ich es ableiten, ich diese:

x = x + (x – xl)*h/hl + a*h*(h + hl)/2 

statt seiner, was das ist:

x = x + (x – xl)*h/hl + a*h^2 

und hier ist ein Beispiel seine Karten mit: http://i.stack.imgur.com/TL6HT.png

+0

Können Sie klären, was die Variablen darstellen? – RenaissanceProgrammer

+2

h ist die Zeitschrittdauer (Deltazeit), hl ist der vorherige Zeitschritt (die vorherige Deltazeit .. l für 'last'), x und xl sind die Positionen, a ist die Beschleunigung. Außerdem war ich irgendwie in der Programmierermentalität, also ist es nicht wirklich eine "Gleichung", eher wie eine Zuweisungsoperation, bei der der Wert von x neu zugewiesen wird. Ich habe mir das nicht so lange angeschaut, daher kann ich den genauen logischen Fehler in dem Artikel nicht hervorheben, aber es ist irgendwo da, weil der Artikel, wie das verlinkte Bild zeigt, jede Integrationsmethode, die er demonstriert, falsch anwendet oder missbraucht. Ich habe gerade gezeigt, wie man Verlet richtig einsetzt. – Aru

+1

Wenn ich mich richtig erinnere, schickte ich eine E-Mail an die Seite, auf der der Artikel vor langer Zeit gehostet wurde, wie furchtbar irreführend und falsch es ist, aber es sieht so aus, als hätten sie es nie korrigiert oder entfernt, was für eine Schande. Ich hoffe, dass es nicht zu viele Menschen frustriert, sie vom Thema abbringt und ihr Lernen verzögert. – Aru