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
Defold ist im Kern eine 3D-Engine. Selbst wenn du ausschließlich mit 2D-Material arbeitest, erfolgt das gesamte Rendering in 3D, wird aber orthografisch auf den Bildschirm projiziert. Defold ermöglicht dir, vollständige 3D-Inhalte zu nutzen, indem du 3D-Assets oder Modelle (models) in deine Sammlungen (collections) einbindest. Du kannst reine 3D-Spiele ausschließlich mit 3D-Assets erstellen oder 3D- und 2D-Inhalte nach Belieben mischen.
Modellkomponenten werden genauso erstellt wie jede andere Komponente (component) eines Spielobjekts (game object). Dafür gibt es zwei Möglichkeiten:

Nachdem du das Modell erstellt hast, musst du einige Eigenschaften festlegen:
Neben den Eigenschaften Id, Position und Rotation gibt es die folgenden komponentenspezifischen Eigenschaften:
Zusätzlich zu den oben genannten Eigenschaften gibt es für jedes Mesh des Modells ein Feld, in dem du ein Material zuweisen kannst:
Je nach Material gibt es eine oder mehrere Textureigenschaften:
Sobald die Modellkomponente vorhanden ist, kannst du die Komponente und/oder das Spielobjekt, das sie enthält, mit den üblichen Werkzeugen des Scene Editor bearbeiten und verändern, um das Modell nach deinen Wünschen zu verschieben, zu drehen und zu skalieren.
Du kannst Modelle zur Laufzeit über verschiedene Funktionen und Eigenschaften verändern (Hinweise zur Verwendung findest du in der API-Dokumentation).

Defold bietet umfangreiche Unterstützung für die Steuerung von Animationen zur Laufzeit. Mehr dazu findest du im Handbuch zu Modellanimationen:
local play_properties = { blend_duration = 0.1 }
model.play_anim("#model", "jump", go.PLAYBACK_ONCE_FORWARD, play_properties)
Der Wiedergabecursor der Animation kann entweder von Hand oder über das System für Eigenschaftsanimationen animiert werden:
-- set the run animation
model.play_anim("#model", "run", go.PLAYBACK_NONE)
-- animate the cursor
go.animate("#model", "cursor", go.PLAYBACK_LOOP_PINGPONG, 1, go.EASING_LINEAR, 10)
Modelle können auch glTF-Animationen mit Morph-Zielen verwenden. Die Gewichtungen der Morph-Ziele werden wie andere Modellanimationen mit model.play_anim() animiert und können zur Laufzeit mit model.get_blend_weights() und model.set_blend_weights() gelesen oder überschrieben werden. Einzelheiten findest du im Abschnitt zu Morph-Zielen im Handbuch zu Modellanimationen.
Ein Modell hat außerdem verschiedene Eigenschaften, die mit go.get() und go.set() verändert werden können:
animationhash) (NUR LESBAR). Du änderst die Animation mit model.play_anim() (siehe oben).cursornumber).materialhash). Du kannst es mit einer Materialressourceneigenschaft und go.set() ändern. Ein Beispiel findest du in der API-Referenz.playback_ratenumber).textureNhash). Du kannst diese Eigenschaften mit go.get() lesen und mit einer Texturressourceneigenschaft und go.set() ändern. Defold unterstützt höchstens 16 Texturen pro Zeichenaufruf (draw call). Die Anzahl der von einem Shader nutzbaren Texturen kann auf Grafikadaptern mit einer niedrigeren Grenze für Textur-Sampler jedoch geringer sein.In 3D-Software kannst du üblicherweise Eigenschaften an den Vertices deiner Objekte festlegen, etwa zur Farbgebung und Texturierung. Diese Informationen werden in der glTF-Datei mit der Erweiterung .gltf oder .glb gespeichert, die du aus deiner 3D-Software exportierst. Je nach den Anforderungen deines Spiels musst du geeignete und leistungsfähige Materialien für deine Objekte auswählen und/oder erstellen. Ein Material kombiniert Shader-Programme mit einem Satz von Parametern für das Rendering des Objekts.
Es gibt einige integrierte Materialien, die du als Ausgangspunkt verwenden kannst:
Die integrierten Modellmaterialien verwenden ein lokales Koordinatensystem für Vertices. Bei Modellen mit Skinning ermöglicht dieses lokale Koordinatensystem dem Vertex-Shader, das Skinning auf der GPU mithilfe einer Knochenmatrix-Textur durchzuführen. Das lokale Koordinatensystem für Vertices ist auch für die Instanziierung von Modellen erforderlich. Ein benutzerdefiniertes Material für Modelle mit GPU-Skinning oder instanziierte Modelle sollte daher die Einstellung Local für das Vertex-Koordinatensystem verwenden.
Der Knochenmatrix-Cache verwendet eine RGBA32F-Textur. Wenn der aktive Grafikadapter dieses Texturformat nicht unterstützt, kann Defold keine animierte Modellkomponente erstellen, die ein Material mit lokalem Koordinatensystem verwendet. Bei OpenGL ES 2.0 und WebGL 1.0 hängt die Unterstützung daher von der Erweiterung des Adapters für Gleitkommatexturen ab. Für die Kompatibilität mit einem Adapter, dem diese Erweiterung fehlt, verwende ein benutzerdefiniertes Material mit Weltkoordinatensystem. Dieses verwendet CPU-Skinning und kann keine Modellinstanziierung nutzen. Die Abmessungen des Caches kannst du über die Projekteinstellungen für Model anpassen.
Wenn du benutzerdefinierte Materialien für deine Modelle erstellen musst, findest du Informationen dazu in der Materialdokumentation. Das Shader-Handbuch enthält Informationen zur Funktionsweise von Shader-Programmen.
Das Standardmaterial für model hat die folgenden Konstanten, die du mit go.set() oder go.animate() ändern kannst (weitere Details findest du im Handbuch zu Materialien). Beispiele:
go.set("#model", "tint", vmath.vector4(1,0,0,1))
go.animate("#model", "tint", go.PLAYBACK_LOOP_PINGPONG, vmath.vector4(1,0,0,1), go.EASING_LINEAR, 2)
tintvector4). Der vector4 stellt die Einfärbung dar, wobei x, y, z und w den Rot-, Grün-, Blau- und Alpha-Anteilen der Einfärbung entsprechen.Das standardmäßige Render-Skript ist auf 2D-Spiele zugeschnitten und funktioniert nicht mit 3D-Modellen. Indem du das standardmäßige Render-Skript kopierst und einige Codezeilen zum Render-Skript hinzufügst, kannst du jedoch das Rendering deiner Modelle aktivieren. Zum Beispiel:
function init(self)
self.model_pred = render.predicate({"model"})
...
end
function update()
...
render.set_depth_mask(true)
render.enable_state(graphics.STATE_DEPTH_TEST)
render.set_projection(stretch_projection(-1000, 1000)) -- orthographic
render.draw(self.model_pred)
render.set_depth_mask(false)
...
end
Einzelheiten zur Funktionsweise von Render-Skripten findest du in der Render-Dokumentation.