Seite 2 von 2

Re: PB Physic Engine - Entwicklung und Doku

Verfasst: 05.10.2013 19:11
von Chimorin
Sorry für die späte Antwort, bin grade am Suchen nach den Werten für optimale Massen (Ich glaube, dass es zwischen 0,05 und 20 war).

Eine Kraft, bzw. ein Impuls wirkt zwischen 2 RenderWorld()-Aufrufen. D.H. meiner Meinung nach, dass die Zeit, mit der RenderWorld(ElapsedPhysicallyTime) gefüttert wurde, nach
a = F / m
und p / m = v
mit -> s = v*t + 1/2*a*t² berechnet wird. "t" ist dabei die eingefütterte Zeit. Was allerdings der Standartwert ist, weiß ich nicht (vllt. 16 oder 17ms wegen 60Hz?!)
Ich benutze das immer so:

Code: Alles auswählen

frameZeit = RenderWorld(frameZeit)
RenderWorld() bekommt als vergangene Zeit die Zeit, die seit dem vorletzten Bild zum letzten vergangen ist.

Re: PB Physic Engine - Entwicklung und Doku

Verfasst: 12.10.2013 02:31
von Regenduft
Bananenfreak hat geschrieben:"t" ist dabei die eingefütterte Zeit. Was allerdings der Standartwert ist, weiß ich nicht (vllt. 16 oder 17ms wegen 60Hz?!)
Ca. 17 ms sind richtig, außer wenn Du (z.B.) einen Framedrop hast; dann ist es entsprechend das Doppelte.
Bananenfreak hat geschrieben:Ich benutze das immer so:

Code: Alles auswählen

frameZeit = RenderWorld(frameZeit)
Öhm... das ist doch doppelgemoppelt... oder? Parameter und Rückgabewert sollten immer gleich sein. Der Rückgabewert ist eigentlich nur interessant, wenn Du keinen Parameter angibst.

Re: PB Physic Engine - Entwicklung und Doku

Verfasst: 12.10.2013 10:21
von Chimorin
Nope, du musst das zeitlich sehen.

Re: PB Physic Engine - Entwicklung und Doku

Verfasst: 12.10.2013 16:53
von Regenduft
Jetzt stehe ich auf der Leitung... Habe keine Ahnung was Du mit "du musst das zeitlich sehen" meinst...
Denke mal Du beziehst Dich auf folgendes:
Regenduft hat geschrieben:
Bananenfreak hat geschrieben:Ich benutze das immer so:

Code: Alles auswählen

frameZeit = RenderWorld(frameZeit)
Öhm... das ist doch doppelgemoppelt... oder? Parameter und Rückgabewert sollten immer gleich sein. Der Rückgabewert ist eigentlich nur interessant, wenn Du keinen Parameter angibst.
Laut PB-Doku definierst Du mit dem Parameter "frameZeit" doch, wie viel Zeit seit dem letzten Aufruf von RenderWorld() vergangen ist. Der Rückgabewert "frameZeit" entspricht laut PB-Doku ebenso der Zeit, welche seit dem letzten Aufruf von RenderWorld() vergangen ist. Wo ist da mein Denkfehler? :?

Re: PB Physic Engine - Entwicklung und Doku

Verfasst: 12.10.2013 19:01
von Chimorin
Du fütterst die Engine mit der Zeit des VORletzten Frames, der Rückgabewert ist die Zeit des letzten Frames.
Bei jeder Funktion wird zuerst die Funktion mit den gegebenen Parametern ausgeführt, erst danach wird ein Wert zurückgegeben.
frameZeit (t1) = RenderWorld(frameZeit (t0))

Re: PB Physic Engine - Entwicklung und Doku

Verfasst: 12.10.2013 22:05
von Regenduft
Danke, jetzt habe ich's geschnallt! :allright:
Da ist wohl die PB-Doku etwas ungenau, denn da heißt es beide Male "vergangene Zeit seit dem letzten Frame".

Da kann man ja dann supereinfach Zeitraffer/Zeitlupe zusammenbasteln!

Code: Alles auswählen

frameZeit = RenderWorld(frameZeit * ZeitFaktor)
Allerdings kann man in Deinem einfachen Beispiel dann doch trotzdem den Parameter weglassen, oder? Wenn ich im Beispiel-Code "Bridge.pb" das RenderWorld() mit dem folgenden Code ersetze, dann erhalte ich bei "#TestCode = 1" und "#TestCode = 2" exakt die selben Ergebnisse - sowohl optisch, als auch von den per Debugger ausgegebenen Werten her:

Code: Alles auswählen

      #TestCode = 1
      Delay(3000)
      CompilerSelect #TestCode
        CompilerCase  1 : Debug RenderWorld()
        CompilerCase  2 : t = RenderWorld(t) : Debug t
      CompilerEndSelect
      If exitcounter = 4 : ShowDebugOutput() : CallDebugger : End : EndIf : exitcounter + 1
Ich hatte mal versucht mit GrabSprite() und GrabDrawingImage() Screenshots zu machen, allerdings schlug beides fehl. Zum einen gab GrabSprite() Null rück; zum anderen gab ScreenOutput() bei StartDrawing(ScreenOutput()) Null rück. Sehr seltsam...

Re: PB Physic Engine - Entwicklung und Doku

Verfasst: 14.10.2013 08:12
von Chimorin
Den Unterschied zwischen meinem Code und einem RenderWorld() ohne Parameter bemerkst du meiner Meinung nach* nur bei kleinen FPS-Zahlen. Mein Code füttert die Engine mit einer variablen Zeit, die bei kleinen FPS-Zahlen eben größer ist. Sonst ruckelt ein Spiel nicht, sondern läuft in erster Linie viel langsamer ab.

*Meiner Meinung nach: Schreibe ich so, weil es ja sein kann, dass ein RenderWorld ohne Parameter die Physikzeit selber ausrechnet und nicht eine Konstante mit dem Wert 17 benutzt oder so...

Re: PB Physic Engine - Entwicklung und Doku

Verfasst: 14.10.2013 16:47
von Regenduft
Da hat wohl einer meinen Code-Schnipsel nicht angeguckt. ;-)

RenderWorld() ohne Parameter rechnet definitiv die Physikzeit selbst aus! Ich habe im Code in der Hauptscheife ein Delay(3000) eingefügt und es gab trotzdem keinen merklichen Unterschied! Ein Konstanter Wert kann also ausgeschlossen werden.

Re: PB Physic Engine - Entwicklung und Doku

Verfasst: 16.10.2013 15:37
von Chimorin
Was dein Testcode macht ist in jedem Fall das selbe.
Fall 1:
Du debuggst die Zeit seit dem letzten Aufruf.

Fall 2:
Du schreibst die Zeit seit dem letzten Aufruf in eine Variable, diese wird debuggt.
=> Du debuggst die Zeit seit dem letzten Aufruf.

Re: PB Physic Engine - Entwicklung und Doku

Verfasst: 16.10.2013 18:06
von Regenduft
+ das optisch genau das gleiche herauskommt. (Wie gesagt: Screenshots haben leider nicht funktioniert und ich hatte keine Lust mich jetzt damit zu beschäftigen warum)