Morph-Targets/Blendshapes > 3D Animationen
Optimiert für die verwendung mit Blender
Optimiert für die verwendung mit Blender
Wieder einmal ein Open-Source Projekt von mir welches ihr euch runterladen könnt.
Diesmal geht es um die Umsetzung von 3D Animationen in GM: Studio mit der Hilfe von der 3D Modelling/Animationssoftware Blender
und der Shaderunterstützung von GM: Studio.
Ein Screenshot vom example, welches ihr euch runterladen könnt:

Vorteile dieser Technick:
- Sehr schnelle Berechnung der Animationen im vergleich zu Skelletbasierten Animationen
- Sehr einfach zu implementieren ("einfach" im relativen Sinne)
Nachteile:
- Hoher Speicherverbrauch (kann man durch niedriger aufgelöste Modelle, Frameanzahl und angepasste Vertexformate verringern/beeinflussen)
- Kein "Blending" zwischen einzelnen Animationen (Bsp: Der übergang zwischen Steh- und Laufanimation ist nicht fließend)
- Procedurale Animationen nicht möglich (bsp: Dass sich der Fuß des Charakters an die Neigung der Oberfläche anpasst)
Anhand dieses Videos könnt ihr sehen, wie die 3D animationen in etwa ausschauen und was damit im generellen alles möglich ist (auch von der performance)
[video]http://www.youtube.com/watch?v=ZxlxVi7hn38[/video]
Wie exportier ich eine Animation aus Blender?
Erstmals sollte man grundkentnisse im Umgang mit blender haben um eine Animation (mit z.B: rigging)
Ich werde euch nicht zeigen wie man eine Animation in Blender erstellt. Ich zeige euch blos, wie man eine fertige Animation
so aufbereitet und auch korrekt exportiert, sodass ihr diese in GM: Studio verwenden könnt.
Als erstes solltet ihr in Blender eine animation erstellen die so wenige frames wie nur möglich habt.
Jedes einzelne frame in Blender ist praktisch ein "Keyframe" für den GM. Zwischen den einzelnen Frames
wird dann in Studio interpoliert. In Blender werden die animationen daher etwas Ruckelig ausschauen,während
in GM: Studio das ganze flüssig dargestellt wird.

Auf dem Bild seht ihr in der unteren leiste dass dass die Animation ganze 15 Frames hat.
Wichtig ist auch dass euer Modell vor dem animieren in Dreiecke aufgeteilt wurde. Ist dies nicht der Fall, so kann es zu eigenartigen Fehlern
bei der Animationsdarstellung in GM: Studio kommen, da die Reihenfolge der Vertices bei jeden einlnen obj Frame nichtmehr gleich ist.
Man kann das auch ganz einfach lösen. Packt einfach den "Triangulate" Modifier auf das jeweilige Objekt drauf.
Dabei ist zu beachten, dass bei Modellen mit Rigging-animationen, dieser Modifier VOR dem Armature Modifier platziert ist.

Klickt dann einfach auf das Objekt welches ihr als Animation exportieren möchtet (mit der Linken maustaste)
und klickt dann in der oberen Leiste in Blender auf File > Export > Wavefront (.obj)
Dort müsst ihr einige einstellungen vorhehmen um die animation korrekt exportieren zu können:

Ihr könnt im Grunde genommen alle Optionen ein- und ausschalten außer diesen vorgegebenen:
- Apply Modifiers
- Animation
- Keep Vertex Order
Diese 3 Optionen MÜSSEN aktiviert sein wenn ihr die Animation korrekt exportieren wollt.
ansonsten gelten die selben Regeln wie beim 3D Obj importer mit Material Support: LINK
Alle exportierten obj Files packt ihr nun in "included Files" in einem GM:Studio Projekt.
Verwenden des Skripts:
Als erstes solltet ihr (falls ihr ein neues Projekt startet) alle Skripts
vom example importieren, die unter dem "animations" Ordner zu finden sind.
Habt ihr dies gemacht, müsst ihr (um eine simple animation zu erstellen) erstmal 1 wichtigen Skript aufrufen
der das Vertex-format initialisiert. Dies kann in einem beliebigen Skript/objekt geschehen.
So steht die grundlage für die Animationen. Jetzt könnt ihr eine von euch selbst erstellte 3D animation
importieren.
Dies geschieht mit dem befehl "scr_load_animation()"
Dieser Befehl hat 4 Parameter wobei 3 davon pflichtig sind und der 4 nur optional übergeben werden muss.
So könnte ein Funktionsaufruf ausschauen:
Der erste Parameter ist der Pfad zu euren animationsdateien.
Die Animationen sind frame-basierend. Dass heisst wenn ihr sie (z.B: aus Blender)
exportiert, solltet ihr durchnummerierte dateien rausbekommen z.B:
model_000001.obj
model_000002.obj
model_000003.obj
model_000004.obj
...etc...
Die anzahl der durchnummerierten Dateien hängt davon ab, wieviele Frames euer Modell besitzt.
Im example haben wir eine Animation mit 15 Frames. Dass heisst es gibt 15 Dateien die von
anomation_000001.obj
bis
model_000015.obj
durchnummeriert sind.
Daher ist unser 2ter und 3ter Parameter die Zahl 1 bis 15.
Habt ihr ein Modell mit Materials mitexportiert und wollt diese laden,
so könnt ihr optional als 4ten Parameter den Pfad zu einem der Material Files angeben.
Beispiel:
Dabei ist zu beachten, dass Blender bei einer Frame-animation mit materials, zu jedem Frame
auch ein eigenes Material mitexportiert. Dies ist aber unnötig, da jedes Materialfile (bis uuf den Dateinamen)
denselben Inhalt hat. Daher brauchen wir beim import eigentlich nur 1 Materialfile welches auf alle
Frames angewendet wird. (Deshalb ist der 4te Parameter ein voller Dateipfad im gegensatz zum ersten Parameter)
Der Rest ist eigentlich einfach. Definiere 2 Variablen.
Eine Variable speichert die länge der gesamten animation (länge eines einzigen Animationsloops)
währned die 2te Variable den aktuellen fortschritt der animation speichert.
Der rest sind nur noch "pointer" auf die jeweiligen variablen für den Animationsshader:
GML-Quellcode
- //interpolation value
- global.shader_interpol = shader_get_uniform(sh_blend, "u_interpol"); //make it global, so that the "scr_draw_animation_frame" script can call it from anywhere in the project
- //WARNING! This variable must be named "global.shader_interpol"! Don't change the name unless you want to edit the variable name in the scripts!
- //define light uniforms
- shader_ambientColor = shader_get_uniform(sh_blend, "uAmbientColor"); //ambient light (color)
- shader_lightDirection = shader_get_uniform(sh_blend, "uLightingDirection"); //direction of directional light
- shader_lightDirectionalColor = shader_get_uniform(sh_blend, "uDirectionalColor"); //color of directional light
Die variable "animation_step" muss im Step event immer um +1 erhöht werden.
Wenn "animation_step" >= animation_length wird, so wird die variable wieder auf 0 gesetzt > loop wird ausgeführt.
Dann fehlt eigentlich nurnoch das zeichnen ansich. Ist eignetlich auch ganz leicht.
Der Shader für die animation unterstützt vertex-lighting, von daher müsst ihr einige lichtparameter
an den Shader übermitteln. (praktisch dasselbe wie directional und ambientlight bei den d3d_ funktionen)
Bei der funktion scr_draw_animation_frame() übergeben wir als ersten Parameter die geladene animation, als 2ten Parameter
den aktuellen fortscritt der animation und als 3ten Parameter die maximale länge der animation.
(Das sind die 2 variablen die wir vorhin definiert haben.)
GML-Quellcode
- //use animation shader
- shader_set(sh_blend);
- //set lighting
- shader_set_uniform_f(shader_ambientColor,0.3,0.3,0.3);
- shader_set_uniform_f(shader_lightDirection,0.5,-0.5,0.5);
- shader_set_uniform_f(shader_lightDirectionalColor,1,1,1);
- //draw animation
- scr_draw_animation_frame(animation,animation_step,animation_length);
- shader_reset();
Wollt ihr eine Animation zeichne ndie texturiert ist (falls ihr diese vorher auch uv.unwrapt habt)
könnt ihr einen 2ten Befehl nutzen der einen texture-id parameter annimmt:
Infos/Lizenz:
Das Skript ist zu 100% open-source.
Ihr dürft den Skript ohne jegliche Einschränkungen:
- verwenden
- editieren/erweitern
- weiterverteilen
Credits sind überhaupt nicht notwendig.
Download des Demo projektes und des Blender testfiles findet ihr unter diesem Link:
Falls ihr irgendwelche Fehler im Code findet, dann meldet mir diese einfach.
/Edit: Eine aktuellere (und auch einachere) Methode für den Animations-import in GM: S findet ihr auf der englischen GMC >>> KLICK
Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von LEWA ()