Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Fehlersuche bei Physik-Problemen

Wenn Sie mit einer Physik-Engine arbeiten, können Sie auf unerwartete Ergebnisse stoßen.

Während viele dieser Probleme durch die Konfiguration behoben werden können, sind einige von ihnen das Ergebnis von Fehlern in der Engine. Für bekannte Bugs im Zusammenhang mit der Physik-Engine, siehe offene Physik-bezogene Probleme auf GitHub. Ein Blick in geschlossene Issues kann ebenfalls helfen, Fragen zum Verhalten der Physik-Engine zu beantworten.

Objekte bewegen sich mit hoher Geschwindigkeit durcheinander hindurch

Dies ist als Tunneling bekannt. Das Aktivieren von Kontinuierliche CD in den RigidBody-Propertys kann dieses Problem manchmal beheben. Wenn dies nicht hilft, gibt es andere Lösungen, die Sie ausprobieren können:

  • Machen Sie Ihre statischen Kollisions-Shapes dicker. Wenn Sie zum Beispiel einen dünnen Boden haben, unter den der Spieler nicht gelangen kann, können Sie den Collider dicker machen als die visuelle Darstellung des Bodens.

  • Ändern Sie die Shape des sich schnell bewegenden Objekts in Abhängigkeit von seiner Bewegungsgeschwindigkeit. Je schneller sich das Objekt bewegt, desto größer sollte die Shape für die Kollision außerhalb des Objekts sein, damit es zuverlässiger mit dünnen Wänden kollidieren kann.

  • Erhöhen Sie Physik-Ticks pro Sekunde in den erweiterten Projekteinstellungen. Dies hat zwar andere Vorteile (wie z.B. eine stabilere Simulation und eine geringere Eingabeverzögerung), erhöht aber die CPU-Auslastung und ist für Mobil-/Webplattformen möglicherweise nicht praktikabel. Multiplikatoren des Default-Wertes von 60 (wie 120, 180 oder 240) sollten für ein flüssiges Erscheinungsbild auf den meisten Displays bevorzugt werden.

Gestapelte Objekte sind instabil und wackelig

Obwohl es wie ein einfaches Problem aussieht, ist eine stabile RigidBody-Simulation mit gestapelten Objekten in einer Physik-Engine schwer zu implementieren. Dies wird durch die Integration von Kräften verursacht, die gegeneinander wirken. Je mehr gestapelte Objekte vorhanden sind, desto stärker sind die Kräfte, die gegeneinander wirken. Dies führt schließlich dazu, dass die Simulation wackelig wird und die Objekte nicht mehr aufeinander liegen können, ohne sich zu bewegen.

Eine Erhöhung der Physiksimulationsrate kann dieses Problem beheben. Erhöhen Sie dazu Physik-Ticks pro Sekunde in den erweiterten Projekteinstellungen. Beachten Sie, dass dies die CPU-Auslastung erhöht und für Mobil-/Webplattformen möglicherweise nicht praktikabel ist. Multiplikatoren des Standardwertes von 60 (wie 120, 180 oder 240) sollten für ein flüssiges Erscheinungsbild auf den meisten Displays bevorzugt werden.

Skalierte Physik-Bodys oder Kollisions-Shapes kollidieren nicht korrekt

Godot unterstützt derzeit keine Skalierung von Physik-Bodys oder Kollisions-Shapes. Als Abhilfe können Sie die Ausdehnungen des Shapes ändern, anstatt seinen Maßstab zu ändern. Wenn Sie möchten, dass sich die Skalierung der visuellen Darstellung ebenfalls ändert, ändern Sie die Skalierung der zugrunde liegenden visuellen Darstellung (Sprite2D, MeshInstance3D, ...) und ändern Sie die Ausdehnung der Kollisions-Shape separat. Vergewissern Sie sich in diesem Fall, dass die Shape der Kollision kein Child der visuellen Darstellung ist.

Da Ressourcen standardmäßig gemeinsam genutzt werden, müssen Sie die Kollisions-Shape-Ressource eindeutig machen, wenn Sie nicht wollen, dass die Änderung auf alle Nodes angewendet wird, die dieselbe Kollisions-Shape-Ressource in der Szene verwenden. Dies kann durch den Aufruf von duplicate() in einem Skript für die Kollisions-Shape-Ressource vor der Änderung ihrer Größe geschehen.

Dünne Objekte sind wackelig, wenn sie auf dem Boden liegen

Dafür kann es einen von zwei Gründen geben:

  • Die Kollisions-Shape des Bodens ist zu dünn.

  • Der Shape des RigidBodys ist zu dünn.

Im ersten Fall kann dies dadurch gemildert werden, dass die Shape des Bodens für die Kollision dicker gemacht wird. Wenn Sie zum Beispiel einen dünnen Boden haben, unter den der Spieler nicht gelangen kann, können Sie den Collider dicker machen als die visuelle Darstellung des Bodens.

Im zweiten Fall lässt sich dies in der Regel nur durch eine Erhöhung der Physiksimulationsrate beheben (da eine Verdickung der Shape zu einem Unterschied zwischen der visuellen Darstellung des RigidBodys und seiner Kollision führen würde).

In beiden Fällen kann auch eine Erhöhung der Physiksimulationsrate helfen, dieses Problem zu beheben. Erhöhen Sie dazu Physik-Ticks pro Sekunde in den erweiterten Projekteinstellungen. Beachten Sie, dass dies die CPU-Auslastung erhöht und für Mobil-/Webplattformen möglicherweise nicht praktikabel ist. Multiplikatoren des Default-Wertes von 60 (wie 120, 180 oder 240) sollten für ein flüssiges Erscheinungsbild auf den meisten Displays bevorzugt werden.

Zylinder-Kollisions-Shapes sind instabil

Während des Übergangs von Bullet zu GodotPhysics in Godot 4 mussten die Zylinder-Kollisions-Shapes von Grund auf neu implementiert werden. Zylinder-Kollisions-Shapes gehören jedoch zu den am schwierigsten zu unterstützenden Shapes, weshalb viele andere Physik-Engines keine Unterstützung für sie bieten. Derzeit gibt es mehrere bekannte Bugs bei Zylinder-Kollisions-Shapes.

Wir empfehlen die Verwendung von Box- oder Capsule-Shapes für die Kollision von Figuren. Boxen bieten im Allgemeinen die beste Zuverlässigkeit, haben aber den Nachteil, dass die Figur diagonal mehr Platz einnimmt. Capsule-Kollisions-Shapes haben diesen Nachteil nicht, aber ihre Shape kann präzises Platforming erschweren.

Die VehicleBody-Simulation ist instabil, insbesondere bei hohen Geschwindigkeiten

Wenn sich ein Physik-Body mit hoher Geschwindigkeit bewegt, legt er zwischen jedem Physik-Schritt eine große Strecke zurück. Wenn Sie beispielsweise die Konvention 1 Einheit = 1 Meter in 3D verwenden, legt ein Fahrzeug, das sich mit 360 km/h bewegt, 100 Einheiten pro Sekunde zurück. Bei der Default-Physiksimulationsrate von 60 Hz bewegt sich das Fahrzeug um ~1,67 Einheiten pro Physik-Tick. Das bedeutet, dass kleine Objekte vom Fahrzeug vollständig ignoriert werden können (aufgrund von Tunneling), aber auch, dass die Simulation bei einer so hohen Geschwindigkeit im Allgemeinen wenig Daten zur Verfügung hat.

Schnell fahrende Fahrzeuge können sehr von einer erhöhten Physiksimulationsrate profitieren. Erhöhen Sie dazu Physik-Ticks pro Sekunde in den erweiterten Projekteinstellungen. Beachten Sie, dass dies die CPU-Auslastung erhöht und für Mobil-/Web-Plattformen möglicherweise nicht praktikabel ist. Multiplikatoren des Default-Wertes von 60 (wie 120, 180 oder 240) sollten für ein flüssiges Erscheinungsbild auf den meisten Displays bevorzugt werden.

Kollisionen führen zu Erschütterungen, wenn sich ein Objekt über Tiles bewegt

Dies ist ein bekanntes Problem in der Physik-Engine, das dadurch verursacht wird, dass das Objekt an den Kanten eines Shapes anstößt, obwohl diese Kante von einem anderen Shape verdeckt wird. Dies kann sowohl in 2D als auch in 3D auftreten.

Die beste Möglichkeit, dieses Problem zu umgehen, besteht darin, einen "zusammengesetzten" Collider zu erstellen. Das bedeutet, dass Sie statt einzelner Tiles, die ihre Kollision haben, ein einziges Kollisions-Shape erstellen, das die Kollision für eine Gruppe von Kacheln darstellt. Normalerweise sollten Sie zusammengesetzte Collider auf pro-Insel-Basis aufteilen (was bedeutet, dass jede Gruppe von sich berührenden Tiles ihren eigenen Collider erhält).

Die Verwendung eines zusammengesetzten Colliders kann in bestimmten Fällen auch die Performance der Physiksimulation verbessern. Da die zusammengesetzte Kollisions-Shape jedoch sehr viel komplexer ist, kann dies nicht in allen Fällen einen Performance-Gewinn bedeuten.

Framerate sinkt, wenn ein Objekt ein anderes Objekt berührt

Dies liegt wahrscheinlich daran, dass eines der Objekte eine zu komplexe Shape für die Kollision verwendet. Konvexe Kollisions-Shapes sollten aus Performance-Gründen eine möglichst geringe Anzahl von Shapes verwenden. Wenn Sie sich auf die automatische Generierung von Godot verlassen, ist es möglich, dass Sie am Ende Dutzende, wenn nicht Hunderte von Shapes für eine einzige konvexe Kollisionsressource erstellt haben.

In einigen Fällen kann das Ersetzen eines konvexen Colliders durch ein paar primitive Shapes (Box, Kugel oder Capsule) zu einer besseren Performance führen.

Dieses Problem kann auch bei StaticBodys auftreten, die sehr detaillierte Trimesh (konkave)-Kollisionen verwenden. Verwenden Sie in diesem Fall eine vereinfachte Darstellung der Level-Geometrie als Collider. Dadurch wird nicht nur die Performance der Physiksimulation erheblich verbessert, sondern auch die Stabilität, da kleine Anbauten und Spalten nicht mehr von der Kollision berücksichtigt werden.

Die Physiksimulation ist unzuverlässig, wenn sie weit vom Ursprung der Welt entfernt ist

Dies wird durch Gleitkomma-Präzisionsfehler verursacht, die umso ausgeprägter werden, je weiter die Physiksimulation vom Ursprung der Welt entfernt ist. Dieses Problem wirkt sich auch auf das Rendering aus, was zu wackeligen Kamerabewegungen führt, wenn man weit vom Ursprung der Welt entfernt ist. Siehe Große-Welt-Koordinaten für weitere Informationen.