This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Ein Kollisionsobjekt (collision object) kann mehrere eingebettete Kollisionsformen (collision shapes) enthalten. In der 3D-Physik können dazu auch Hüllen und Dreiecksmeshes aus glTF- oder GLB-Dateien gehören. Du kannst auch eine Kachelkarte (tile map) oder eine Ressource für eine konvexe Form über die Eigenschaft Collision Shape des Kollisionsobjekts verwenden.
Die primitiven Formen sind Quader, Kugel und Kapsel. Du fügst eine primitive Form hinzu, indem du mit der rechten Maustaste auf das Kollisionsobjekt klickst und Add Shape auswählst:

Ein Quader hat eine Position, eine Drehung und Abmessungen (Breite, Höhe und Tiefe):

Eine Kugel hat eine Position, eine Drehung und einen Durchmesser:

Eine Kapsel hat eine Position, eine Drehung, einen Durchmesser und eine Höhe:

Kapselformen werden nur bei Verwendung der 3D-Physik unterstützt (konfiguriert im Bereich Physics der Datei game.project).
Komplexe Formen können die Geometrie einer Kachelkarte oder Daten einer konvexen Hülle (convex hull) verwenden. Seit Defold 1.13.2 können 3D-Kollisionsobjekte auch Hüllen und Dreiecksmesh-Formen aus Meshes in glTF- oder GLB-Szenen erstellen.
Verwende eine Form vom Typ Hull für eine konvexe Annäherung an ein Mesh oder eine Form vom Typ Mesh, wenn Kollisionen dessen Dreiecken folgen müssen, einschließlich konkaver Bereiche wie Öffnungen in der Levelgeometrie.
3D.Das ausgewählte Mesh liefert seine lokale Geometrie; Transformationen von glTF-Knoten werden nicht angewendet. Mesh-Kollisionsformen werden vom Bullet-3D-Backend unterstützt, auch für statische und nicht statische Kollisionsobjekte. Von den 2D-Physik-Backends werden sie nicht unterstützt.
Auf die Geometrie eines Dreiecksmeshes kann über die Laufzeit-APIs für Formen nur lesend zugegriffen werden. Bearbeite das Quellmesh und erstelle einen neuen Build, um seine Dreiecke zu ändern. Informationen zur Skalierung des Spielobjekts findest du unter Kollisionsformen skalieren.
Defold enthält eine Funktion, mit der du ganz einfach Physikformen für die Kachelquelle (tile source) einer Kachelkarte erzeugen kannst. Das Handbuch zu Kachelquellen erklärt, wie du einer Kachelquelle Kollisionsgruppen hinzufügst und Kacheln den Kollisionsgruppen zuweist (Beispiel).
So fügst du einer Kachelkarte Kollisionen hinzu:

Beachte, dass die Eigenschaft Group hier nicht verwendet wird, da die Kollisionsgruppen in der Kachelquelle der Kachelkarte definiert sind.
In der 3D-Physik kannst du eine Hülle direkt aus einem Mesh erstellen, indem du den oben beschriebenen Arbeitsablauf im Editor verwendest. Die ältere Ressource .convexshape wird ebenfalls unterstützt und kann mit einem externen Editor aus Punkten erstellt werden:
.convexshape).Das Dateiformat für konvexe Hüllen verwendet dasselbe Datenformat wie alle anderen Defold-Dateien, nämlich das Protobuf-Textformat. Eine konvexe Hüllform definiert die Punkte der Hülle. In der 2D-Physik sollten die Punkte gegen den Uhrzeigersinn angegeben werden. Im 3D-Physikmodus wird eine abstrakte Punktwolke verwendet. 2D-Beispiel:
shape_type: TYPE_HULL
data: 200.000
data: 100.000
data: 0.0
data: 400.000
data: 100.000
data: 0.0
data: 400.000
data: 300.000
data: 0.0
data: 200.000
data: 300.000
data: 0.0
Das obige Beispiel definiert die vier Ecken eines Rechtecks:
200x300 400x300
4---------3
| |
| |
| |
| |
1---------2
200x100 400x100
Es gibt verschiedene externe Werkzeuge, mit denen sich Kollisionsformen erstellen lassen:
Das Kollisionsobjekt und seine Formen erben die Skalierung des Spielobjekts. Um dieses Verhalten zu deaktivieren, entferne das Häkchen im Kontrollkästchen Allow Dynamic Transforms im Bereich Physics von game.project. Beachte, dass nur eine gleichmäßige Skalierung unterstützt wird und der kleinste Skalierungswert verwendet wird, wenn die Skalierung nicht gleichmäßig ist.
Die Größe primitiver Formen kann zur Laufzeit mit physics.set_shape() geändert werden. Diese Funktion ersetzt weder die Vertices einer Hülle noch die Geometrie eines Dreiecksmeshes. Beispiel:
-- set capsule shape data
local capsule_data = {
type = physics.SHAPE_TYPE_CAPSULE,
diameter = 10,
height = 20,
}
physics.set_shape("#collisionobject", "my_capsule_shape", capsule_data)
-- set sphere shape data
local sphere_data = {
type = physics.SHAPE_TYPE_SPHERE,
diameter = 10,
}
physics.set_shape("#collisionobject", "my_sphere_shape", sphere_data)
-- set box shape data
local box_data = {
type = physics.SHAPE_TYPE_BOX,
dimensions = vmath.vector3(10, 10, 5),
}
physics.set_shape("#collisionobject", "my_box_shape", box_data)
Auf dem Kollisionsobjekt muss bereits eine Form des richtigen Typs mit dem angegebenen Bezeichner vorhanden sein.
Kollisionsformen in der 3D-Physik können um alle Achsen gedreht werden.
Kollisionsformen in der 2D-Physik können nur um die z-Achse gedreht werden. Eine Drehung um die x- oder y-Achse führt zu falschen Ergebnissen und sollte vermieden werden, auch wenn die Drehung um 180 Grad die Form im Wesentlichen entlang der x- oder y-Achse spiegelt. Um eine Physikform zu spiegeln, wird empfohlen, physics.set_hlip(url, flip) und physics.set_vlip(url, flip) zu verwenden.
Du kannst das Physik-Debugging aktivieren, um die Kollisionsformen zur Laufzeit zu sehen.