Programmeren van een 3D omgeving in Unreal Engine – Karakteranimaties – Skeleton

print
Deze handleiding maakt deel uit van het programmeertraject:



Wat vooraf ging


Inleiding

Eerst en vooral, animaties aanmaken doen we niet in Unreal Engine, dit gebeurt in software zoals Blender of Maya en geïmporteerd als een FBX-bestand.

In Unreal Engine maken we gebruik van bestaande animaties, we voegen ze toe via programmeercode en blenden ze samen. In Unreal Engine bepaalt u wanneer en hoe de animaties gebruikt zullen worden.

Animaties zijn ook een belangrijk onderdeel bij het opzetten van een karakter.

Animaties zijn een cursus op zich, deze handleiding is dan ook niet meer dan een eerste kennismaking waarin ik veelvuldig gebruik maak van links naar de officiële handleidingen, wie alles wilt weten, klik deze zeker aan. Tevens heb ik me laten inspireren door deze tutorial komende van de leeromgeving van Unreal Engine.

Ik heb de handleiding opgedeeld in vier delen:

Animaties is het eindresultaat van heel veel verschillende onderdelen die samenwerken. Onderstaand schema geeft een overzicht van deze onderdelen en hoe ze zich verhouden.

Situering van deze handleiding binnen Unreal Engine


Importeren

Animaties worden vaak gemaakt in externe programma’s zoals Blender of Maya en geïmporteerd als een FBX-bestand.

Het maken van animaties valt buiten de doelstellingen van deze cursus. Wie zelf zijn animaties wilt maken kan een kijkje nemen in mijn Blender-handleiding.

We gaan bestaande animaties importeren.

  • Start een nieuwe Unreal Engine Third Person Project with Starter Content en geef het een gepaste naam.
  • Op de Marketplace van Epic, zoek naar Animation Starter Pack en voeg het toe aan het net aangemaakte project.

Er wordt een folder AnimStartPack aan het project toegevoegd met een aantal extra animaties.


Soorten animatiebestanden

In de nieuw aangemaakte folder AnimStartPack ziet u soorten bestanden:

  • Animation Sequence
  • Blend Spaces
  • Blueprints
  • Animation Blueprints
  • Skeletal Mesh

Animation Sequence

Animation SequenceGroen onderlijnd – de geïmporteerde animatie, het FBX-bestand.

  • U kunt nu de animatie bekijken (en eventueel notificaties en curves toevoegen, maar dit is voor later).

Blend Spaces

Blend Spaces Zalmkleurig onderlijnd (prefix BS) – in Unreal Engine Blend Spaces worden verschillende animaties samengebracht worden tot één vloeiende overgang, bv. overgaan van idle (staan) naar stappen naar joggen naar lopen.

  • Dubbelklik om de editor te openen.

Beweeg het groene diamantje om te blenden tussen de verschillende animaties van de Blend Space.

Animation Blueprints

Blauw onderlijnd – Unreal Engine Blueprints.

  • Dubbelklik om de oude vertrouwde Blueprint te bekijken.

Om deze Ue4ASP_character Blueprint te gebruiken als standaard Blueprint voor ons karakter:

  • Verwijder het huidige ThirdPersonCharacter uit het level.

  • Omdat we maar één level hebben, ga naar de World Settings en kies ThirdPersonGameMode bij GameMode Override.
  • Vervolgens wijzigt u de Default Pawn Class naar Ue4ASP_character.

  • Compile en Save en u zal een andere animatie zien.

Animation Blueprint

Animation BlueprintOranje onderlijnd – Unreal Engine Animation Blueprints, een speciale vorm van Blueprints voor animaties.

  • Dubbelklik om de editor te opnen.
  • Klik, bovenaan op Locomotion. U krijgt de zogenaamde State Machine te zien.

U ziet de verschillende “standen” (States) waarin een animatie zich kan bevinden en hoe de overgang bepaald wordt. Dit wordt ook een State Machine genoemd.

  • Dubbelklik op één van de standen om de achterliggende Animation Blueprint van de State te zien.

Skeletal Mesh

Skeletal MeshPaars onderlijnd – een skeletal mesh heeft een skelet (een bonenstructuur) dat kan geanimeerd worden, dit in tegenstelling tot een Static Mesh dat, de naam zegt het zelf, statisch is.

  • U vindt de Skeletal Mesh Sk_mannequin onder AnimStarterPackUE4_MannequinMesh.

  • Dubbelklik om de editor te openen. Merk op dat u delen van de Skeletal Mesh kunt selecteren en animeren (bv. de hand roteren).

  • Klik rechtsboven op Skeleton om het onderliggende skelet te zien, het bestand UE4_Mannequin_Skeleton (dat in dezelfde map staat als de hierboven geopende SK_Mannequin) wordt in de Skeleton editor geopend.

Zoals reeds gesteld worden animaties niet aangemaakt in Unreal Engine maar in programma’s zoals Blender of Maya. Desalniettemin kunnen kleine aanpassingen aan de animatie zelf gedaan worden in Unreal Engine.


Skeleton en Sockets

Wat is een Skeleton?

Een Skeleton (asset) is in essentie:

  • Een lijst van Bones (beenderen) en hun verhouding (hiërarchische informatie).
  • gebruikt om animaties te sturen.

Neem een kijkje naar de Skeleton in de net geopende Skeletal Mesh.

De Skeleton Tree (links) bevat alle Bones en hoe deze Bones zich verhouden (de hiërarchische informatie) tot de andere Bones. Bv hand zit onder Lowerarm en bevat zelf 5 vingers (index, middle, pinky, ring thumb), het onderscheid tussen links (_l) en rechts (_r) wordt weergegeven in de benaming.

  • Via CharacterBones Bone NamesAll Hierarchy kunt u alle namen van de Bones bekijken op het specifieke karakter zelf.

Programmatorisch zijn deze Bones het enige wat telt. Of deze Bones nu omhuld worden door de metalen huid van deze mannequin, de zacht huid van een mannelijke elf of de ruwe huid van een vrouwelijke dwerg,… is bijzaak, dit zijn allen slechts “skins”.

De Bones kunnen geanimeerd worden door ze te manipuleren.

Animation Retargeting

Skeletal Meshes die dezelfde Skeleton hebben, dezelfde hiërarchie en dezelfde naamconventie kunnen dezelfde animaties delen. Dit wordt Animation Retargeting genoemd.

Onderstaande video’s tonen hoe u animaties kunt delen indien de meshes over dezelfde Skeleton beschikken en hoe u een “afwijkende” Skeleton kunt retargetten via de Retargeting Manager.

Onderstaande video toont het retargetten tussen verschillende Skeletons.

Sockets

Stel, u wilt iets in de rechterhand van deze mannequin leggen. Hiertoe moet u een Socket toevoegen aan de bone hand_r.

Een Object wordt Attached aan een Socket, een Socket dat Attached is aan een Bone, een Bone die deel uitmaakt van een Skeleton.

Een Socket toevoegen

Laat ons een Socket toevoegen aan de rechterhand.

  • In de Skeleton Tree, klik met de rechtermuisknop op hand_r en kies voor Add Socket.

  • Er wordt een Socket aangemaakt met een voorgestelde naam hand_rSocket. Behoud deze naam.

  • De Socket wordt weergegeven door een diamantvorm, eventueel kunt u de Socket iets verplaatsen.

Preview

Om een beter idee te hebben hoe een object in de hand eruit ziet kunt u een Preview Asset toevoegen.

Let op, ik neem hier gewoon de eerste de beste kubus, moest u echter reeds weten dat u een specifiek object wilt in de hand geven, bv. een zwaard of een geweer, dan kunt u beter meteen dit object nemen.

  • Klik met de rechtermuisknop op de Socket hand_rSocket, kies voor Add Preview Asset en kies bv. voor 1M_Cube (een kubus van 1 m³).

  • Oké, dit is iets te groot.

In het Details-panel kunt u de relatieve locatie, rotatie en schaal van de Socket ten opzichten van de Bone ingeven. Pas de Relative Scale aan naar 0.1 voor de X, Y en Z-as.

De schaal is al beter.

  • Pas eventueel handmatig nog de locatie en oriëntatie aan zodat de Preview Asset 1M_Cube mooi in de hand ligt.

  • Klik, rechtsboven, op Animation en start een paar animaties om te zien of de Socket goed zit.

Zelfs in de “badend in de zon”-animatie ziet het er best oké uit.

Belangrijk, nu we de Socket op zijn plaats hebben moeten we de schaal terug op 1 zetten, doen we dit niet dan zal iedere asset die we verbinden met deze Socket steeds geschaald worden naar de gewijzigde schaal (hier 0.1).


Een mesh koppelen aan een Socket

We gaan ons karakter een wapen in de hand geven.

  • Op de Marketplace van Epic, zoek naar FPS Weapon Bundle (deze set is Permanent Free) en voeg het toe aan het net aangemaakte project.

  • Er is een folder FPS_Weapon_Bundle toegevoegd. Klikt u verder door naar WeaponsMeshesKA47 dan vindt u daar een… KA47.

Merk op dat de KA47 komt als een Static Mesh (prefix SM).

en als een Skeleton Mesh (prefix SK). Deze KA47 heeft dus eigen Bones die eventueel geanimeerd kunnen worden (maar zonder bv. Collision).

Static of Skeleton Mesh koppelen aan een Socket

We gaan nu, naar keuze de Static of de Skeleton Mesh aan de Socket koppelen.

  • Open de Blueprint Ue4ASP_character.
  • Voeg een Static Mesh Component toe onder de reeds aanwezige Mesh (en geef het de naam AK47).

Of

  • Voeg een Skeletal Mesh Component toe onder de reeds aanwezige Mesh(en geef het de naam AK47).

  • Zowel voor de Static als voor de Skeletal Mesh, ga naar het Details-panel, selecteer de gewenste Mesh (hieronder de Skeletal Mesh SK_KA47) en geef onder Parent Socket de naam in van onze aangemaakte Socket hand_rSocket.

Ga naar de Viewport om de AK47 juist in de hand te leggen door te roteren en te verplaatsen. Omdat deze asset op maat van Unreal Engine gemaakt is gaat dit vrij vlot.

U kunt eventueel de animatie pauzeren door in het Details-panel van de Mesh Pause Anims aan te vinken zodat u nauwkeuriger kunt werken.

Welke neemt u nu het beste, de Static of de Skeletal?

Wel, als u geen gebruik maakt van de Bones van de Skeletal, is er geen echte reden deze te kiezen en kiest u het best de Static Mesh. Wilt u bv. de trigger animeren, dan moet u dit doen via de hiertoe voorziene Bone b_gun_trigger animeren en moet u uiteraard kiezen voor de Skeletal Mesh.

Onderstaande video plaatst een Socket op de rug en voegt er een zwaard aan toe.

Een Mesh koppelen aan een socket via Blueprints

We hebben nu handmatig de Mesh toegevoegd aan de Socket, maar het kan ook voorkomen dat u dit wilt doen via programmeercode, bv. wanneer uw karakter een voorwerp opraapt.

Dit kan via de functionaliteit Attach Actor to Component.

Verwijder eventueel de net toegevoegde AK47 maar… noteer de transformatiegegevens, u zal ze nodig hebben.

  • Voeg nu de AK47 Mesh toe aan het level en ga naar de Level Blueprint.
  • Onderstaande Blueprint zal bij het indrukken van de G-toets het wapen “oprapen” (koppelen aan de Socket).
  • Eventueel kunt u de relatieve transformatie ook nog via programmeercode aanpassen.

Merk de naam van de Socket en de Snap to Target op. De SetActorRelativeTransform was nodig om het wapen weer goed in de hand te leggen, als waarden heb ik dezelfde waarden overgenomen.

Betekent dit nu dat we voor ieder voorwerp de exacte transformatiewaarden moeten meegeven?

Nee, niet noodzakelijk. Is de Socket goed gepositioneerd voor een bepaald type object (stel een zwaard) dan zullen alle gelijkaardige objecten (alle zwaarden) meteen passen zonder bijkomende transformatie. Maar onze Socket was gebaseerd op een algemene kubus en niet specifiek voor een geweer. De AK47 is bovendien vrij complex te positioneren, hij moet immers in beide handen goed liggen. Dit maakt de bijkomende transformatie noodzakelijk.

Een actor spawnen vanuit een Socket

Een Socket kan ook dienst doen als een Spawn-punt voor bv. een projectiel.

Onderstaande code demonstreert dit. De Socket wordt opgevraagd vanuit de Mesh (de naam van de Socket in onderstaand voorbeeld komt van het Paragon Character LtBelica) en de transformatie van de Socket wordt vervolgens gebruikt als transformatie voor het Spawn-punt.

Preview verwijderen

Nu we de asset toegevoegd hebben aan de socket gaan we de Preview Asset verwijderen, anders zou die wel eens in de weg kunnen staan.

  • Ga naar de Skeleton.
  • Klik met de rechtermuisknop ingedrukt op de toegevoegde Socket hand_rSocket en kies voor Remove All Attached Assets. Enkel de preview wordt verwijderd en niet de AK47 die we toegevoegd hebben aan de Socket in de Blueprint.

  • Bewaar en sluit alles.

In deze handleiding hadden we het hoofdzakelijk over de Skeleton, in volgende handleiding gaan we dieper in op het animeren.

Geef een reactie

Deze website gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.

  • Abonneer je op deze website d.m.v. e-mail

    Voer je e-mailadres in om je in te schrijven op deze website en e-mailmeldingen te ontvangen van nieuwe berichten.