Freigeben über


Objektmodellierung und -animation

In dieser Anleitung behandeln wir die Grundlagen des Erstellens eines Modells und des Erstellens von Animationen für Minecraft: Bedrock Edition. Als Beispiel modellieren und animieren wir einen kleinen Roboter, womit im Artikel Einführung in das Thema Hinzufügen von Objekten bereits angefangen wurde.

In diesem Tutorial wird Folgendes beschrieben:

  • Erstellen eines Modells für ein Objekt mit Blockbench
  • Anwenden von Texturen und Animationen auf ein Modell

Voraussetzungen

Es wird empfohlen, vor Beginn dieses Tutorials Folgendes abzuschließen:

Modell

Modelle in Minecraft verwenden ein bestimmtes Format, das die Form mit JSON definiert. Jedes Modell verwendet eine Textur, die über Render-Controller zugewiesen werden kann.

Um das Modell und die Textur zu erstellen, verwenden wir Blockbench, ein 3D-Modellierungsprogramm, das Modelle für die Bedrock Edition von Minecraft erstellen kann.

Einrichten des Modells

Wenn du Blockbench zum ersten Mal öffnest, siehst du eine Liste der verfügbaren Modellformate. Wähle Bedrock-Modell aus. Du siehst daraufhin ein Dialogfeld zu den Grundeinstellungen für das Projekt.

Projekteinstellungen für Bedrock Edition-Modelle in Blockbench

Der wichtige Teil ist Name der Kreaturen-Geometrie. Hier geben wir einen eindeutigen Namen für das Modell ein. Die beste Methode besteht darin, snake_case zu verwenden, also nur Kleinbuchstaben, Zahlen und Unterstriche sowie Punkte. Leerzeichen und andere Sonderzeichen werden nicht unterstützt. Für unser Modell geben wir einfach robot ein.

Wir können das Feld für den Dateinamen vorerst leer lassen, da wir diesen später festlegen, wenn wir das Modell exportieren. Die „Box UV"-Einstellung und die Texturgröße können ebenfalls standardmäßig unverändert gelassen werden, da wir sie später ändern werden. Die Schaltfläche „Bestätigen“ speichert diese Einstellungen.

Knochenstruktur

Das erste, was bei der Erstellung eines Modells zu berücksichtigen ist, ist die Knochenstruktur. Knochen sind der Teil des Modells, der animiert werden kann, und sie können in einer beliebig tiefen Hierarchie angeordnet werden. Die Knochen selbst sind unsichtbar, sie können aber Würfel enthalten, die das Modell formen.

Knochenauflistung in Blockbench

Es ist sinnvoll, für jedes Modell einen Stammknochen zu verwenden und alles andere darin zu platzieren. Dies bedeutet, dass du später das gesamte Modell auf einmal sowie bestimmte Teile davon animieren kannst. Erstelle eine neue Gruppe in Blockbench. „Gruppen“ und „Knochen“ sind in diesem Kontext im Wesentlichen dasselbe.

Du kannst mit der rechten Maustaste auf die Gruppe klicken oder F2 drücken, um sie umzubenennen. Der Name für einen Knochen sollte snake_case sein (also nur mit Kleinbuchstaben, Zahlen und Unterstrichen). Jeder Knochenname muss für zukünftige Zugriffe durch Animationen eindeutig sein.

Während wir das Modell in den folgenden Schritten aufbauen, solltest du dafür sorgen, dass die Struktur korrekt eingerichtet ist. Du kannst Gruppen herumziehen, um ihre Anordnung zu ändern, oder sie in anderen Gruppen ablegen. Dieser Screenshot zeigt die korrekte Knochenstruktur des fertigen Modells.

Form

Du kannst jetzt mit dem Erstellen der Form des Modells beginnen. Erstelle neue Würfel und verwende die Werkzeuge zum Verschieben, Ändern der Größe und Drehen, um sie anzupassen. Ein Trick zum schnelleren Hinzufügen von Würfeln besteht darin, einen bereits positionierten Würfel auszuwählen und Strg+D (duplizieren) zu drücken, um eine Kopie davon zu erhalten.

Texturlose Form eines Roboters in Blockbench

Du kannst Würfel präziser bewegen, indem du entweder die Umschalttaste, die Steuerungstaste oder beide gleichzeitig gedrückt hältst. Je nach Modellierungsstil kann es sinnvoll sein, sich vollständig an das Raster zu halten oder die Würfel nur in Halb- oder Viertelschritten zu bewegen.

Bedrock Edition-Modelle verwenden standardmäßig Box UV-Mapping. Dies bedeutet, dass das Textur-Mapping nur ganze Zahlen verwendet und bei Bedarf auf eine kleinere Zahl abgerundet wird. Um gestreckte oder unsichtbare Seiten zu vermeiden, solltest du sicherstellen, dass die Größe der Würfel ganzzahlig definiert ist.

Wenn du an symmetrischen Teilen wie etwa Gliedmaßen arbeitest, erstelle diese zuerst auf der rechten Seite und spiegle sie dann später nach links. Du kannst die Spiegelung vor oder nach der Erstellung der Textur vornehmen, je nachdem, ob du die gleiche Textur auf beiden Seiten haben willst.

Wenn du Knochen für bewegliche Teile des Modells erstellst, solltest du immer berücksichtigen, um welchen Punkt sich das Teil drehen soll. Wähle einen Knochen aus und drücke auf P, um das Drehpunkt-Werkzeug aufzurufen. Damit kannst du den Drehpunkt des Knochens verschieben. Du kannst dieses Tool auch für Würfel verwenden, wenn sich diese um einen bestimmten Punkt drehen sollen.

Texturierung

Vorlagen

Sobald die Form des Modells fertig ist, kannst du eine Texturvorlage erstellen. Die Vorlage ist eine Textur, die einen einzigartigen Raum für jeden Würfel und jede Seite des Modells bietet. Das UV-Mapping von Würfeln ist auch manuell möglich, die Erstellung einer Vorlage übernimmt jedoch diese Arbeit für dich und findet dabei das platzeffizienteste Layout. Denke daran, dass Minecraft keine hochauflösenden Bilder mag.

Gib beim Erstellen einer Textur robot als Texturnamen ein und aktiviere die Option „Vorlage“. Wähle im Vorlagendialogfeld die gewünschte Auflösung aus. 16x ist die Standardauflösung von Minecraft, aber du kannst nach Wunsch auch eine höhere Auflösung wählen.

Grundfarbe

Sobald die Vorlage erstellt wurde, kannst du in Blockbench zur Registerkarte „Paint“ (Zeichnen) wechseln. Dort findest du alle Werkzeuge, die du zum Ändern der Textur benötigst. Wählen das Farbeimer-Werkzeug aus, und lege den Füllmodus neben dem Werkzeug auf „Würfel“ fest. Wähle im Farbfenster auf der rechten Seite eine Farbe aus. Jetzt kannst du deine Würfel in individuellen Grundfarben einfärben.

Details

Du kannst jetzt mit der Arbeit an der Textur beginnen. Wenn du mit der Texturierung in deinem Bildbearbeitungsprogramm vertrauter bist, kannst du die Textur jetzt speichern, indem du auf das Speichersymbol neben der Textur klickst. Dann kannst du sie in deinem Bildeditor öffnen. Alle Änderungen werden in Blockbench angezeigt, sobald du die Textur speicherst. Wenn du jedoch lieber direkt an dem Modell arbeiten möchtest, kannst du die integrierten Malwerkzeuge in Blockbench verwenden.

Es gibt einige Tricks, um den Pinsel in Blockbench effizienter zu nutzen:

  • Um größere Flächen auszumalen, kannst du die Pinselgröße erhöhen.
  • Du kannst direkt in der 3D-Vorschau malen oder dies im UV-Editor auf der linken Seite tun.
  • Wenn du eine gerade Linie erstellen möchtest, klicke auf den Anfang der Linie und halte dann die Umschalttaste am Ende der Linie gedrückt.
  • Um sicherzustellen, dass du keine verdeckten Stellen auslässt, die durch Animationen sichtbar werden könnten, kannst du Würfel ausblenden. Klicke einfach auf das Augensymbol im Outliner.

Animationen

Animationen können die Form deines Modells animieren, aber sie können auch Sounds und Partikeleffekte wiedergeben. Im folgenden Abschnitt werfen wir einen Blick darauf, wie du deinem Objekt eine Animation hinzufügen, deine eigene Animation in Blockbench erstellen und schließlich Animationscontroller verwenden kannst.

Verwenden von Standardanimationen

Das Vanilla-Ressourcenpaket enthält generische Animationen, auf die du in deinem eigenen Paket verweisen kannst, ohne die Dateien tatsächlich zu kopieren. Diese Animationen können ein guter Ausgangspunkt für Vanilla-ähnliche Objekte sein, aber natürlich sind benutzerdefinierte Animationen viel leistungsfähiger. Du findest alle Vanille-Animationen im Vanilla-Ressourcenpaket hier.

In diesem Beispiel verwenden wir die look at-Animation. Diese Animation dreht den „Kopf“-Knochen. Deshalb ist es wichtig, dass der Kopf des Modells exakt den gleichen Namen verwendet.

Außerdem benötigt das Objekt eine look at-Komponente in ihrer Verhaltensdatei. Dies sind die Blick-Komponenten der Kuh. Wenn du möchtest, kannst du ein wenig mit den Zahlen herumspielen.

            "minecraft:behavior.look_at_player": {
                "priority": 7,
                "look_distance": 6,
                "probability": 0.02
            },
            "minecraft:behavior.random_look_around": {
                "priority": 9
            }

Nachdem das Verhalten eingerichtet ist, gehen wir zur Client-Objektdatei über. Achte darauf, dass die Formatversion für diese Datei auf 1.10.0 oder höher festgelegt ist, damit dies funktioniert.

Zuerst verknüpfen wir die Animation. Dies ist im Abschnitt „Animationen“ im Beschreibungs-Tag des Objekts möglich. Der zweite Teil hier (animation.common.look_at_target) ist der globale Bezeichner der Animation. Dieser Name ist in der Animationsdatei definiert und an einer beliebigen Stelle in diesem oder einem anderen Paket gültig. Der erste Teil (look_at_target) ist der Kurzname. Damit verweisen wir auf die Animation in der Objektdatei, und dieser Name ist nur im Bereich dieses Objekts gültig.

            "animations": {
                "look_at_target": "animation.common.look_at_target"
            }

Jetzt müssen wir die Animation wiedergeben. Für einfache Animationen, die immer aktiv sind, solange das Objekt vorhanden ist, müssen wir dazu nur den Kurznamen im Array „scripts/animate“ in der Client-Objektdatei auflisten.

            "scripts": {
                "animate": ["look_at_target"]
            }

Wenn du den Roboter jetzt im Spiel testest, siehst du, dass er den Kopf dreht und sich umsieht.

Erstellen einer Animation

In der Anleitung zum Hinzufügen von Objekten haben wir für den Roboter eine kleine „Fahren“-Animation erstellt. Jetzt erstellen wir eine Animation, die wiedergegeben wird, wenn der Roboter den Boden unter seinen Füßen (seinem Rad) verliert. Prüfe vor dem Erstellen einer Animation immer, ob es eine Möglichkeit gibt, sie auszulösen. Wir können dafür leicht eine Animation zum Gleichgewichtsverlust auslösen, da wir einfach mithilfe der MoLang-Abfrage query.is_on_ground testen können, wann der Roboter den Boden nicht mehr berührt.

Animationssteuerelemente in Blockbench

Einfache Animationen können im Texteditor erstellt werden. Für komplexere, auf Keyframes basierende Animationen vereinfacht Blockbench dies jedoch. Öffne das Modell und wechsle zur Registerkarte Animieren in der oberen rechten Ecke. Erstelle eine neue Animation im Fenster Animationen auf der linken Seite und nenne sie animation.robot.sway. Du kannst auch einen längeren Namen auswählen oder einen Namespace einschließen, um die Kompatibilität mit anderen Add-Ons sicherzustellen. Bitte beachte jedoch, dass Animationsbezeichner nur snake_case, Zeichenfolgen und Punkte unterstützen, jedoch keine Doppelpunkte oder Querstriche.

Sobald du die Animation eingerichtet hast, kannst du mit dem Animieren beginnen. Wähle den Stammknochen deines Objekts aus. Bewege den Zeitcursor in der Zeitleiste auf 0Sekunden und klicke auf das Plus-Zeichen neben „Drehung“. Dadurch wird ein neuer Keyframe an der neuen Position erstellt. Bewege jetzt den Cursor auf ca. 0,2Sekunden. Wähle das Drehwerkzeug aus und drehe den gesamten Roboter leicht nach links. Dadurch wird automatisch ein neuer Keyframe generiert. Auf der linken Seite des Bildschirms siehst du die Werte. Drehe auf etwa 10Grad.

Bewege dich jetzt in der Zeit um etwa eine halbe Sekunde weiter und drehe den Stammknochen zur anderen Seite. Gehe schließlich auf 1Sekunde und drehe den Knochen zurück auf 0.

Wenn du jetzt den Cursor an den Anfang bewegst und auf „Abspielen“ klickst, siehst du eine kurze Schwank-Animation. Jetzt, da du weißt, wie das Animieren funktioniert, kannst du die Animation verfeinern und zum Beispiel die Antenne ein wenig schwingen lassen.

Drücke abschließend Strg + S, um das Modell und die Animation zu speichern. Speichere die Animation im Ordner animations des Ressourcenpakets unter robot.animation.json.

Jetzt kannst du auf die Animation in der Client-Objektdatei verweisen und sie wiedergeben, wie wir dies vorher für die look at-Animation getan haben. Wir geben die Schwingen-Animation jetzt jedoch nur wieder, wenn der Roboter sich nicht auf dem Boden befindet. Dies sieht etwa wie folgt aus:

            "animations": {
                "look_at_target": "animation.common.look_at_target",
                "sway": "animation.robot.sway"
            },
            "scripts": {
                "animate": [
                    "look_at_target",
                    {"sway":"!query.is_on_ground"}
                ]
            }

Wenn jetzt ein Roboter gespawnt und eine Kante hinuntergeschoben wird, wird die Animation wiedergegeben. Die Wiedergabe erfolgt jedoch nur einmal.

Der Grund dafür ist die Tatsache, dass die Abfrage im Skriptabschnitt nur ein Ein-/Ausblendwert für die Animation ist. Sie definiert, um „wie viel“ die Animation wiedergegeben wird– und nicht, wann sie wiedergegeben wird und wann nicht. Aus diesem Grund wird die Animation wiedergegeben, wenn !query.is_on_ground den Wert true/1 hat. Die Wiedergabe wird jedoch nie beendet. Sie wird einfach ausgeblendet, sobald der Wert wieder false/0 ist. Beim nächsten Mal wird die Animation dann wieder eingeblendet. Sie wird nicht wieder von Anfang an wiedergegeben.

Wir können dieses Verhalten recht gut für statische oder Schleifenanimationen verwenden, die keinen Anfang und kein Ende haben. Wenn wir die Animation jedoch jedes Mal starten möchten, wenn sich die Abfrage ändert, benötigen wir einen anderen Ansatz. Hier kommen Animationscontroller ins Spiel.

Animationscontroller

Animationscontroller arbeiten mit Status. Ein Animationscontroller kann eine unbegrenzte Anzahl von Status haben. Nur einer dieser Status ist zu einem gegebenen Zeitpunkt aktiv. Der Controller kann über MoLang-Ausdrücke in andere Statusarten wechseln. Jeder Status kann einen bestimmten Satz von Animationen, Sounds und Partikeleffekten auslösen.

Jedes Mal, wenn das Objekt vom Client geladen wird, z.B. beim Beitritt zu einer Welt, beginnt der Animationscontroller in einem Anfangsstatus. Dieser Status wird standardmäßig als default bezeichnet.

Erstelle im Ressourcenpaket einen neuen Ordner mit dem Namen animation_controllers, um den Animationscontroller einzurichten. Erstelle in diesem Ordner eine neue Datei mit dem Namen robot.animation_controllers.json. Erstelle einen Animationscontroller wie folgt:

{
    "format_version": "1.10.0",
    "animation_controllers": {
        "controller.animation.robot.ground": {}
    }
}

Jetzt müssen wir einen Anfangsstatus erstellen. Dieser Status wird standardmäßig als default bezeichnet. Der Animationscontroller startet immer in diesem Status, wenn das Objekt geladen wird. Beispielsweise nach dem erneuten Beitritt zur Welt.

Die einzige Aufgabe dieses Status besteht darin, in den „Schwanken“-Status überzugehen, sobald sich das Objekt nicht mehr auf dem Boden befindet. Wir werden dafür einen Übergang verwenden. Der Controller wechselt zu diesem Status, sobald die Abfrage query.is_on_ground nicht mehr den Wert „true“ liefert.

{
    "format_version": "1.10.0",
    "animation_controllers": {
        "controller.animation.robot.ground": {
            "states": {
                "default": {
                    "transitions":[
                        {"swaying": "!query.is_on_ground"}
                    ]
                }
            }
        }
    }
}

Jetzt fügen wir den „Schwanken“-Status hinzu. Dieser Status spielt die „Schwanken“-Animation ab und setzt danach den Controller zurück, indem wieder in den Standardstatus gewechselt wird. Wir können die Abfrage query.all_animations_finished verwenden, um erst nach der Wiedergabe der Animation den Übergang auszuführen. Diese Abfrage gibt erst dann „true“ zurück, wenn alle Animationen des aktuellen Status wiedergegeben wurden. Darüber hinaus testen wir, ob sich das Objekt wieder auf dem Boden befindet.

{
    "format_version": "1.10.0",
    "animation_controllers": {
        "controller.animation.robot.ground": {
            "states": {
                "default": {
                    "transitions":[
                        {"swaying": "!query.is_on_ground"}
                    ]
                },
                "swaying": {
                    "animations":[
                        "sway"
                    ],
                    "transitions":[
                        {"default": "query.all_animations_finished && query.is_on_ground"}
                    ]
                }
            }
        }
    }
}

Jetzt müssen wir den Animationscontroller mit unserem Objekt verknüpfen. Animationscontroller können auf die gleiche Weise wie Animationen in der Client-Objektdatei verknüpft werden. Der Controller wird im Abschnitt „Animationen“ verknüpft und in Skripten wiedergegeben.

            "animations": {
                "look_at_target": "animation.common.look_at_target",
                "sway": "animation.robot.sway",
                "ground": "controller.animation.robot.ground"
            },
            "scripts": {
                "animate": [
                    "look_at_target",
                    "ground"
                ]
            }

Wenn du dies im Spiel testest, läuft die Animation jetzt mehr als einmal ab. Abhängig von der Länge deiner Animation stellst du jedoch möglicherweise fest, dass der Roboter die Animation beim zweiten Mal nicht wiedergibt, wenn er zweimal in einem kurzen Intervall den Bodenkontakt verliert. Dies liegt daran, dass die erste Animation noch nicht abgeschlossen war und der Controller noch nicht in den Standardstatus zurückgesetzt wurde.

Sehen wir uns eine andere Lösung an, die dieses Problem lösen würde. Wenn wir die Abfrage all_animations_finished entfernen, beenden wir den „Schwanken“-Status, sobald das Objekt wieder landet. Wenn wir dies erneut testen, wird die Animation sehr abrupt beendet.

Um dies zu verhindern, können wir die Option blend_transition verwenden, mit der wir einen allmählichen Übergang aus der Animation heraus in einem bestimmten Zeitraum einrichten können. Dies ist eine der wichtigsten Eigenschaften von Animationscontrollern, die es uns sogar ermöglicht, einen einfachen Übergang zwischen zwei festen Positionen eines Objekts zu erstellen.

Welche Lösung letztendlich am besten geeignet ist, hängt vom jeweiligen Anwendungsfall ab. In diesem Beispiel wird die Animation allmählich ausgeblendet, sobald der Roboter wieder auf dem Boden landet.

                "swaying": {
                    "animations":[
                        "sway"
                    ],
                    "transitions":[
                        {"default": "query.is_on_ground"}
                    ],
                    "blend_transition":0.5
                }

Wie geht es weiter?

Wir haben jetzt gelernt, ein Modell, das für Animationen geeignet ist, zu erstellen und zu texturieren. Wir haben außerdem eine vorhandene Animation mit dem Modell verknüpft und unsere eigene Animation in Blockbench erstellt.

Wenn du über das Aussehen des Objekts hinaus weitere Funktionen hinzufügen möchtest, sieh dir das Tutorial zum Thema Objektverhalten an.