Wie soll ich mit winzigen Objekten in einer Physik-Engine umgehen?

13

Ich mache eine 3D-Physik-Engine zum Würfeln. Bisher war ein Würfel 1x1x1m groß und die Schwerkraft 9,82 m / s ^ 2. Dies sieht natürlich nicht realistisch aus, da die Würfel auf alles etwas langsam reagieren.

Um dies zu beheben, habe ich versucht, einfach alle Größen zu ändern, damit ein Würfel etwa 0,02 m entlang einer Seite liegt. Dadurch erhielten meine inversen Massen und inversen Trägheitsmatrizen sehr große Werte, was zu numerischer Instabilität führte.

Was ist der beste Weg, um damit umzugehen? Kann ich den Maßstab so hoch halten, dass ein Würfel 1x1x1 ist und nur die Masse oder Größe der einwirkenden Kräfte ändert? Oder sollte ich etwas anderes optimieren?

Ich denke, dasselbe Problem könnte auftauchen, wenn Sie ein Spiel mit sehr großen physischen Körpern wie Raumschiffen oder etwas anderem gemacht haben. Ich hoffe, dass jemand zuvor auf etwas Ähnliches gestoßen ist.

Mikael Högström
quelle
Ich bin hier kein Experte, aber wie können wir ohne Code wissen, wo das Problem liegt? Ich liege jedoch wahrscheinlich falsch, da Box2D die gleichen Probleme hat.
JCORA
1
(In Anbetracht aller positiven Stimmen muss es eine konventionelle Art geben, diese Dinge zu kodieren, und die Leute scheinen zu wissen, was für ein Problem Sie haben. Ich glaube, ich habe mich geirrt.)
jcora
1
Ja, ich dachte, es könnte einen konventionellen Weg geben, damit umzugehen. Meines Erachtens handelt es sich nicht um ein Codeproblem, sondern um ein Problem mit numerischer Genauigkeit. Was ich will, ist kein Code-Schnipsel zur Lösung meines Problems, sondern eine Erklärung für eine Herangehensweise an das Problem.
Mikael Högström
Meinst du Gleitkomma-Präzision?
Jcora
In gewissem Sinne ja. Die Inverse der Trägheitsmatrix, die ich bei der Kollisionsbehandlung verwende, erhält sehr große Werte. Es ist nicht wirklich schlecht konditioniert, da die Pivot-Elemente große Werte erhalten und es nicht viel Addition gibt, aber irgendwie muss es ein Problem mit der numerischen Genauigkeit geben, da die Simulation schnell außer Kontrolle gerät.
Mikael Högström

Antworten:

1

Du könntest

  • die Schwerkraftkonstante erhöhen? Spiele verwenden oft 2 * 9,81 m / s ^ 2. Ich kann mich nicht erinnern, wo ich das gelesen habe, aber Spiele verwenden normalerweise nichtsinnige Einheiten. Unabhängig davon, welche Konstanten sich richtig anfühlen (macht das Spiel Spaß). Die Verwendung einer realistischen Konstante lässt die Physik langsam und fließend erscheinen.
  • Führen Sie die Simulation schneller aus. Wenn Sie einen festen Zeitschritt verwenden, wird die Animationsrate erhöht.
  • Schwimmer mit höherer Präzision verwenden?
torbjoernwh
quelle
Der zweite Punkt wird nichts anderes tun, als die Simulation flüssiger zu machen, oder sie sogar zu unterbrechen, wenn die Simulation zu schnell ausgeführt wird (ich bin mir nicht sicher, ob dies ein realistisches Problem ist, aber wenn die Welt Schritte vor Ablauf einer Millisekunde zurücklegt, ist die Zeit abgelaufen) Differenz wäre immer 0, und nichts würde funktionieren). Möglicherweise möchte er auch keinen Speicherplatz für Schwimmer mit höherer Präzision verschwenden.
JCORA
1
Spiele nutzen oft die doppelte Schwerkraft? Sagt wer?
GameDev-er
Ich kann die Geschwindigkeit oder Genauigkeit nicht ändern, aber ich werde versuchen, die Schwerkraft zu ändern.
Mikael Högström
Durch die Änderung der Schwerkraftkonstante bewegen sich die Würfel im Allgemeinen schneller, was den Eindruck erweckt, dass sich alles in einem kleineren Maßstab befindet. Dadurch wird das Verhalten auch bei Mikrokollisionen, die für die Beschleunigung zwischen Bildern erforderlich sind, nervöser. Ich denke, ich muss es nur optimieren :)
Mikael Högström
4

Falls Sie Probleme mit kleinen Zahlenwerten haben, schlage ich vor, dass Sie einfach alles verkleinern. Sie könnten sogar keine "echten" Maßeinheiten verwenden, sondern nur einige "generische" Einheiten, die nur im Motor sinnvoll sind.

Die erste Option, die Verkleinerung, würde erfordern, dass Sie Millimeter oder Zentimeter als Basismaßeinheit verwenden. Die Dimensionen Ihres Würfels würden dann nicht an Präzision verlieren.

Die zweite Lösung ist im Grunde dasselbe, aber dann müssten Sie nicht über die tatsächlichen Einheiten nachdenken.

Warum änderst du nicht einfach die Masse des Würfels?

jcora
quelle
Da die einzigen Kraftgeneratoren, die ich habe, auf Schwerkraft- / Beschleunigungsmessern basierende Massenänderungen sind, ändert sich das Verhalten nicht. Ihr Vorschlag könnte umgekehrt verwendet werden (vielleicht haben Sie das so gemeint), indem Sie kleinen Objekten eine größere Masse geben, ihre inversen Massen näher an eine heranrücken und so die numerische Instabilität verringern. Dies führt jedoch zu den gleichen Problemen wie das Erhöhen der Schwerkraftkonstante.
Mikael Högström
0

Ich dachte, ich sollte meine endgültige Lösung des Problems mitteilen. Das Erhöhen der Schwerkraftkonstante, wie vorgeschlagen, ließ die Würfel sich tatsächlich schneller bewegen, was den Eindruck einer korrekten Skalierung erweckte. Dies erhöhte jedoch die Probleme des Mikrospringens. Ich fügte Mikrokollisionen hinzu, die das Problem milderten, obwohl sie es nicht perfekt lösten. Beachten Sie, dass dies nur für "kleine" Objekte zu einem Problem wird. Wenn Sie das umgekehrte Problem haben und sehr große Objekte (Raumschiffe oder ähnliches) simulieren möchten, treten überhaupt keine Probleme mit dem Mikrosprung auf und Sie können sich damit herumschlagen diese Lösung.

So fand ich die höchste Schwerkraft, die ich haben konnte, ohne viel zu viel "Microbouncing" zu bekommen. Dann benutzte ich eine einfache Erschütterungserkennung am Telefon, die auf große Änderungen der Beschleunigungsmesser-Messwerte reagierte und Impulse auf alle Objekte ausübte, wenn solche Erschütterungen erkannt wurden. Es ist nicht perfekt, aber da es die Würfel schnell bewegt, wenn das Telefon geschüttelt wird, vermittelt es den Eindruck von "winzigen" Würfeln. Es ist ein bisschen hacken, aber es muss gehen :) Hier ist ein Clip des Motors in Aktion.

Mikael Högström
quelle