3D Animationen in GM: Studio (Morph-Targets/Blend-Shapes)

    • Skript

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • 3D Animationen in GM: Studio (Morph-Targets/Blend-Shapes)

      Morph-Targets/Blendshapes > 3D Animationen
      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?
      Spoiler anzeigen

      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:
      Spoiler anzeigen

      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.

      GML-Quellcode

      1. scr_create_animation_vertex_format();//create animation format.


      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:

      GML-Quellcode

      1. animation = scr_load_animation("./animation",1,15);//load animation


      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:

      GML-Quellcode

      1. animation = scr_load_animation("./animation",1,15,"./animation_000001.mtl");


      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.

      GML-Quellcode

      1. animation_length = room_speed*7; //specify the animation length/speed for 1 animation loop (room_speed*7 = 7 seconds)
      2. animation_step = 0;//this variable is holding the current animation progress (leave it to 0)


      Der rest sind nur noch "pointer" auf die jeweiligen variablen für den Animationsshader:

      GML-Quellcode

      1. //interpolation value
      2. 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
      3. //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!
      4. //define light uniforms
      5. shader_ambientColor = shader_get_uniform(sh_blend, "uAmbientColor"); //ambient light (color)
      6. shader_lightDirection = shader_get_uniform(sh_blend, "uLightingDirection"); //direction of directional light
      7. 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.

      GML-Quellcode

      1. //animate
      2. animation_step+=+1;
      3. if (animation_step>=animation_length){
      4. animation_step = 0;
      5. }



      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

      1. //use animation shader
      2. shader_set(sh_blend);
      3. //set lighting
      4. shader_set_uniform_f(shader_ambientColor,0.3,0.3,0.3);
      5. shader_set_uniform_f(shader_lightDirection,0.5,-0.5,0.5);
      6. shader_set_uniform_f(shader_lightDirectionalColor,1,1,1);
      7. //draw animation
      8. scr_draw_animation_frame(animation,animation_step,animation_length);
      9. shader_reset();
      Alles anzeigen


      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:

      GML-Quellcode

      1. scr_draw_animation_frame_tex(animation,animation_step,animation_length,texture);



      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 ()

    • Hi

      Sehr schön erklärt.
      Jetzt müßte ich das mal testen ob man das auch mit DAZ 3D machen kann, da man dieses Programm auch für UMME bekommt.
      Was vielmehr wichtig ist, die Seite von DAZ 3D hat sehr viele animierte Tiere, Menschen, usw. zur Auswahl wo man sich kaufen kann.
      Denn ich bin kein guter Animation Artist für sowas.

      Gruss Drachen
    • Ok, ich habe gestern eine aktuellere Version dieser Animations-technick released, die für den Animationsimport in GM: Studio eigene binäre Dateien (.bao Dateien) verwendet, welche mithilfe eines Konversion-Tools aus den .obj Frames generiert werden.
      Der Import wird dadurch um ein vielfaches vereinfacht. (da man für jede Animation jetzt nicht jedes einzelne Frame einzeln in den GM importieren muss.)

      Der Download des Examples mitsamt des Source-codes + einer Anleitung befindet sich auf der englischen GMC. >>> KLICK
      Falls jemand das File direkt runterladen möchte: hier der Link >>> DOWNLOAD
      Das neue example besitzt nun auch 3 verschiedene "Demoanimationen" statt wie bisher nur einer.

      Ein Screenshot von einer der Animationen könnt ihr euch hier anschauen:


      Werde mich die Tage auch um eine deutsche Fassung der Anleitung bemühen.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LEWA ()