Jump to content
Unity Insider Forum

Avatar Customizing


Hellhound

Recommended Posts

Hallo zusammen,

ich mache mir aktuell grade Gedanken, wie ich in Unity ein Customizing des Avatars realisieren kann. Meine Idee ist es wie z.B. in XCOM, den Sims oder den üblichen RPG's das Aussehen und primär das Equipment des Avatars anpassen zu können. Evtl. später sogar eine einfache Mölichkeit zu schaffen, zusätzliche Elemente hinzuzufügen (modding).

Leider gibt es im Netz zu diesem Thema fast keine Informationen. Was ich bisher herausgefunden habe, ist dass ich hier zweigleisig fahren muss. Einerseits gibt es Elemente, die halt relativ einfach ausgetauscht werden können, da sie keinem Einfluss unterliegen, wie z.B. Gegenstände die in der Hand gehalten werden. Problematischer sind all die Gegenstände die direkt mit durch die Bewegung des Charakters beinflusst werden, wie z.B. Kleidung, die am Torso aufliegt. Bei jeder Drehung, muss diese dem Körper folgen und sich mit anpassen (z.B. Hemd, Handschuhe).

Bisher nutze ich FUSE für die Erstellung der Avatare und rigge sie mit Mixamo. Hier wird jedoch der Gegenstand direkt mit an das Objekt gebunden und auf das Skelett ausgerichtet. Einfach mal, z.B. Helm gegen Hut tauschen geht hier nicht. D.h. im Endefekt müsste ich so x-Modelle schaffen, die unterschiedlich ausgerüstet/angezogen sind. Das halte ich nicht für akzeptabel.

Ich denke eher hier müsste ich den Ansatz fahren, das ich in FUSE einmal einen Charakter modelliere, der alle möglichen Modifikationen aufweist (Handschuhe, Kopfbedeckung, Brille usw.) und diese müsste ich dann zur Laufzeit irgendwie ein/ausblenden, falls vorhanden und ggfs. die Geometrie austauschen. Schwer kann ich mir z.Z. jedoch vorstellen, wie ich hier mit unterschiedlichen Größen umgehe (Frauen Hand/Torso vs. Männer Hand/Torso). Vermutlich müsste ich jeden gegenstand für diese unterschiedlichen Ausprägungen doppeln.

Ich habe mir z.B. eine Weste als Asset gekauft (Was Grafik angeht, habe ich 2 linke Hände). Diese müsste ich jetzt irgend wie an den Torso binden. Ich kann zwar ohne weiteres in Unity die Weste scalen und auch dem entsprechendem Spline im Skelett zuweisen, scheiter aber nun daran hier einen skinned Mesh Renderer zu nutzen, so dass sich die Weste mit dem Torso verformen würde. So dreht sich aktuell zwar der Torso, die Weste aber nur bedingt mit dem Transform-Objekt, was natürlich unrealistisch ausschaut und zu Überlappungen führt. Generell, wie gehe ich mit Überlappungen um, wie z.B. einem Zopf? Der soll ja nicht in der Geometrie verschwinden.

Da die Objekte an das Skelet gebunden sind, denke ich ist es notwendig für jedes Skelet (daher sollte ich nicht zu viele unterschiedliche Skelette haben) einzeln die Objekte ausrichten/binden und irgendwie Unity seitig zu verknüfen, wobei denke ich die betroffenen Elemente auch als Skinned Mesh gerendert werden, damit bei allen möglichen Animationen das Skinning greift.

Kennt Ihr zu dieser Thematik gute Tutorials, Snippeds? Wie würdet Ihr das umsetzen? Ich bin für jeden Denkanstoss und Hinweis danbar.

Viele Grüße

Hellhound

Link zu diesem Kommentar
Auf anderen Seiten teilen

Für mich steckt in diesem Thema gefühlt auch immer recht viel schwarze Magie, aber ein wichtiger Punkt ist, dass man beligebig viele SkinnedMeshRenderer auf dasselbe Skelett legen kann. Wenn du also ein Einheits-Skelett hast, kannst du eine Hose und ein Shirt darauf legen und beim Weight Painting nur die Knochen verwenden, an denen das Kleidungsstück liegt. Dann kannst du beide Meshes auf jeweils einem SkinnedMeshRenderer anzeigen lassen - und nach Belieben hinzufügen und wegnehmen.

Die Kunst ist dann beim Modellieren, dass es bei den verschiedenen Meshes keine Z-Fights oder ähnlichen Stuss gibt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn es jetzt nur um Dinge geht, die sich selber nicht verformen, wie Helme oder Rüstungsteile, dann kann man die, genauso wie Waffen, einfach den entsprechenden Bones unterordnen. Schon werden sie bei der Bewegung mit genommen.

Bei allen andern Kleidungsstücken, Hemd, Hose usw. muss natürlich auch dieses Mesh mit den Bones gebunden sein. Also da hilf das Unterordnen nichts.
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke Euch ersteinmal für Eure Antworten. Das ist genau das was ich vermutet habe. Ich habe gestern einmal ein bisschen rumgespielt und mir ein FUSE Modell 3x mit unterschiedlicher Konfiguration heruntergeladen, geriggt und über Blender dann in Unity importiert. Die ersten Versuche zeigen, dass ich einzelne Elemente auf dem gleichen Skelett relativ einfach austauschen kann, z.B. Helm gegen Hut indem ich lediglich die Mesh im SkinnedRenderer und das dazugehörige Material anpasse.

Problem ist aktuell hierbei, dass beide Modelle die die Kopfbedeckung tragen, beim export die Vertices unterhalb des Objektes entfernt haben. D.h. ich muss irgendwie das Basis Skelett ohne Kopfabdeckung um die Kopfabdeckung erweitern, so dass ich beim Ausblenden der Kopfbedeckung wenigstens den Kopf vollständig habe. Das sollte aber irgendwie machbar sein und sich der gesamte Mechanismus skripten lassen.

Der erste Einstieg ist gefunden, jetzt kann es munter weiter gehen ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da das ganze Thema recht komplex ist und ich denke, dass mehrere Entwickler hier ein Interesse an meiner Erfahrung habe, will ich einmal diesen Thread nutzen um meine Erfahrung festzuhalten und zudem Fragen mit an dieser Stelle Posten um den Fortschritt zu kommunizieren. Hier ersteinmal ein Update zum aktuellen Stand:

Ich habe die letzten Tage einiges ausprobiert und bin inzwischen in der Lage die Kopfbedeckung des Avatars zur Laufzeit auszutauschen und konnte auch das Problem mit dem Culling lösen, indem ich zunächst einmal den Avatar ohne Kopfbedeckung als Basis Skelett nutze und anschließend jeweils einzeln den selben Avatar noch einmal mit der Kopfbedeckung rigge.

Ziemliche Probleme hatte ich hierbei mit dem Workflow. Ich habe festgestellt, dass ich grundsätzlich einen festen Weg über Blender nehmen muss, d.h. FUSE -> Mixamo (Rigging) -> Export DAE -> Blender Import -> Export FBX. Zudem muss ich die Animationen von Mixamo ebenfalls als DAE exportieren und den Weg über Blender nehmen, da sonst die Skelettstrukturen nicht zueinander passen.

In jedem Fall muss ich sicherstellen, das die Skelette identisch sind. Die einzelnen Kopfbedeckungen erzeuge ich dann, indem ich zunächst das Modell mit der Kopfbedeckung, in Blender als DAE importiere, als Blendfile abspeicher und dann in einer neuen Szene nur die Kopfbedeckung über die Attach-Funktion aus dem Blendfile hinzufüge. Dann habe ich das komplette, korrekte Skelett nur mit der Kopfbedeckung.

In Unity kann ich nun beide FBX Modelle importieren und mit der gleichen Animation belegen. Klappt, beide laufen Synchron und ich kann über den SkinnedMesh-Renderer beliebig die Kopfbedeckung ein- und ausblenden und so variieren. Bisher habe ich auch keine Probleme durch Überschneidungen der Geometrie zwischen Kopf und Kopfbedeckung gesehen.

BaseCharacter.JPG

HeadsetAvatar.JPG

HelmetAvatar.JPG

UnityObjektbaum.JPG

Nun habe ich versucht zunächst ohne Skripting die Objekthierarchien zu vereinen, so dass die Kopfbedeckung dem Avatar untergordnet wird und der Animator des Avatars die Animation mit steuert.

Da beide Skelette gleich sind habe ich gedacht ich könnte die entsprechende Kopfbedeckung einfach an das Skelett des Base Avatar binden, indem ich entsprechend im SkinnedRenderer das Root-Bone auf das gleiche Objekt lege, nur halt aus der anderen Armature. Lt. Bounding-Boxen wird das auch umgesetzt, entferne ich jetzt jedoch den Animator von derKopfbedeckung dann passt zwar alles Optisch in der Pose, sobald die Animation läuft, jedoch nicht mehr.

Ich habe auch schon versucht nur das Mesh-Objekt mit dem SkinnedRenderer dem Avatar unterzuordnen und dann wie oben beschrieben an das Skelett vom Avatar zu binden. Dann sieht zwar alles gut aus, aber in dem Moment, wo ich die Animation starte ist die Kopfbedeckung optisch verschwunden und danach auch dauerhaft in der Pose-Position im Editing-Mode.

Daher die Fage, ist das überhaupt möglich? Habe ich hier evtl. gedanklich grad einen Fehler im Vorgehen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich stecke auch noch nicht extrem tief in dem Thema, aber dein Ansatz das Modell mit allen Ausrüstungsteilen zu riggen und die Ausrüstungsteile dann ein- und auszublenden ist genau richtig. Ich habe einige Assets die es genau so machen.
Was du im unten Teil beschreibst bedeutet, das beide Rigs nicht zu einander passen und wenn die Animation aktiv, dann wird verschwindet die Kopfbedeckung weil das 2. Rig den Hut an eine falsche Stelle verschiebt. Ich habe die Erfahrung gemacht, daß man beispielsweise 2 Meshes mit unterschiedlichen Human-Rigs mixen kann, indem man das 2. Mesh an die identische Rig-Position des 1. Meshes verschiebt. Also als Beispiel, man hat einen Char mit einem Rig und dem möchte man einen Hut aufsetzten, aber der Hut hat einen separaten Rig. Dann kopiert man den Hut inklusive des 2. Rigs an die Headposition des Humanchars. Der Animator steuert nun sowohl den Original-Rig des Chars als auch den Rig den Huts, zumindest hat das bei mir so funktioniert (kann auch sein, daß man es ins Rootbone kopieren sollte, jedenfalls ist es wichtig, daß das Rig des Hutes noch unter dem Mesh hängt).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für Deinen Hinweis mit den nicht übereinstimmenden Rigg. Dank dieser Info habe ich festgestellt, dass FUSE die Modelle beim Generieren leicht verändert, so dass der Mixamo-Rigger tatsächlich unterschiedliche Riggs erstellt, auch wenn das Basismodell gleich war. Das Skelett ist zwar gleich, aber die Bones Ausrichtung variiert leicht. Ich habe einen einfachen Weg gefunden dies über Blender zu korrigieren:

  1. Ich lade beide Riggs als DAE File herunter. In Blender werden beide separat importiert und jeweils in ein blend-File umgewandelt.
  2. Ausgehend vom Basis-Rigg (Avatar nur mit Body-Skin) Blend-File füge ich nun über die Blender-Append Funktion das entsprechende Mesh für die z.b. Kopfbedeckung aus dem anderem Blend-File hinzu. Anschließend habe ich in Blender 2 separate, geskinnte Meshes auf zwei Armatures. (Bild 1,2)
  3. Nun lösche ich die Armature des neuen Mesh-Objektes, so dass nur noch die Mesh mit Ihren Skinning Daten übrig bleibt und setzte anschließend an der Mesh im Object-Modifier (Bild 3)  und am Amature-Modifier (Bild 4) auf das die Parent-Referenz des Armature auf die des Basis-Rigg.  Damit ist die Mesh dem Basis-Rigg komplett zugeordnet, Skinning Daten wie Vertex-Groups werden 1:1 übernommen.
  4. Das Ganze funktioniert in Blender einwandfrei, die Geweichtungen sehen i.O. aus, wenn ich mir nun einen einzelnen Bone heraussuche und rotiere, greift das Skinning und die Mesh wird mit den Bones basieren auf den Vertex-Groups modifiziert.
  5. Falls erforderlich führe ich die entsprecheden Modifikationen am Mesh durch, d.h. ich richte es korrekt aus und muss ggfs. auch mal minimal nach skalen um z-Fighting Probleme zu beseitigen.

Nun kann ich zum Einen das gesamte Modell als FBX exportieren und in Blender einbinden. Hier habe ich genau das Verhalten, das ich haben möchte. Allerdings noch ein komplettes, erweitertes Modell. Aber ich habe auch eine Lösung gefunden für das Customizen

  1. Ich exportiere das Basis-Rigg als Basis-Avatar für Unity als FBX.  Ich nehme das erweiterte Basis-Rigg mit dem hinzugefügten Mesh Ojekt und entferne alle anderen Referenzen aus dem Armature, so dass nur das Skelett und die Mesh übrig bleiben.
  2. Diese exportiere ich ebenfalls als FBX.

3.       Ziehe ich beide Files in der POSE-Position im Edit-Modus in Blender hinein, habe ich perfekt platzierte Objekte. Und auch kein z-Fighting Problem. (Bild 5)

Interessant wird nun der Punkt, wie bekomme ich das animiert? Füge ich zum Basis-Rigg eine Animation hinzu, z.B. Idle, dann wird diese korrekt animiert, das separat geladene Mesh-Objekt jedoch nicht. Ich kann auch dem Mesh-Objekt mit dem eigenen Rig einen Animator hinzufügen und auf den gleichen Controller setzen. Dann laufen diese Parallel. Das finde ich jedoch ineffizient, zumal ein Body einige Objekte als Ausrüstung zugewiesen bekommen soll. Bei mehren Charakteren mit x-Animatoren sehe ich das als Laufzeitkritisch. Besser ist es die Mesh unter das Basis-Rigg zu bekommen und nur einmal zu animieren.

Das Verschieben des Mesh-Objektes mit dem eigenen Rigg an das entsprechende Bone funktioniert bei mir nicht, das Skinning greift hier nicht. Inzwischen habe ich eine Lösung die skriptseitig die Objekte vereint, bei dem ich nach diesem Unity-Thread vorgehe: https://forum.unity3d.com/threads/stitch-multiple-body-parts-into-one-character.16485/

Das ganze funktioniert. Durch das Skript wird das Skelett der Mesh mit dem des Basis-Riggs abgeglichen und die Objektreferenz und der Skinned-MeshRenderer hinzugefügt. Nun kann ich das ganze mit nur einem Animator animieren und ich habe nur noch die Objektstruktur des Avatars in Unity.

BasisMesh.JPG

BasisMeshNachAppend.JPG

BasisMeshNachmatureModifier.JPG

BasisMeshNachObjectModifier.JPG

BaseMeshMitCap.JPG

BaseMeshMitCapMerged.JPG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, so ganz funktioniert es dann wohl doch nicht. Habe nun Probleme mit dem Shirt oder den Hosen. Hier funktioniert zwar alles wie gewünscht wenn ich das gesamte Modell als FBX exportiere, auch das Skinning während der Animationen greift. Entferne ich jedoch die übrigen Meshes von der Armature und Binde das Objekt mit dem Skript wie auch schon die Cap und die Schuhe, dann sieht zwar alles i.O. aus in der Pose im Edit-Modus von Unity, aber sobald die Animation startet wird die Mesh gigantisch groß skaliert und wirkt irgendwie deformiert (gestaucht).

Auf den ersten Blick sieht in Blender alles i.O. aus, auch die Skelette sehen identisch aus. Habe aktuell keine Idee wo dieses Verhalten her kommt ... Komischerweise habe ich dies nur beim Shirt und der Hose festgestellt, also Objekten die über mehrere Mesh-Parts gehen.

 

FehlerAussen.JPG

FehlerInnen.JPG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Wochenende ist rum und ich bin nun wieder ein Stückchen schlauer geworden ;) Inzwischen bekomme ich das mit dem Shirt und der Hose gebacken, ich glaub es war ein Blender Versionsproblem. Ich habe einmal von Version 2.74 auf 2.78 geupdated und siehe da, beim FBX Export bleiben die Kleidungsstücke dort wo sie hin sollen. Bei Version 2.74 gibt es unabhängig vom Kleidungsstück Probleme, sobald ein Kleidungsstück auch nur marginal gescaled wurde ...

Wenn ich es schaffe, gibt es heute Abend ein Video, ansonsten morgen ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie versprochen habe ich nun einmal ein erstes Video hochgeladen: http://sendvid.com/go5cpdqv

Wie Ihr sehen könnt funktioniert das Customizing in der Basis, was direkte Modelle angeht, die ich aus FUSE entnommen habe. Als nächstes muss ich noch mal schauen, wie ich Objekte hinzufügen kann, die nicht aus FUSE stammen. Da muss ich mich ersteinmal ein bischen in Blender einarbeiten.

Dann fehlt noch ein vernünftiges UI und was noch mich noch mehr nervt ist die Optik. Die Kleidungsstücke reflektieren mir zu stark und das obwohl ich lediglich die diffuse Textur nutze (ich habe noch nicht mal Normalmapping aktiv), d.h. ich muss unbedingt das Shading überarbeiten.

Aktuell überlege ich zudem wie ich die ganzen Daten am besten handle. Einerseits muss ich per Editor oder später per AssetImporter festlegen welche Kleidungstücke wie ausgewählt und gesetzt werden können, andererseits muss der Krams dann auch persistiert werden, damit eine andere Szene die Daten aufgreifen kann. Persönlich überlege ich zur Zeit hier JSON und evtl. eine NoSQL DB zu nutzen. Haltet Ihr das für sinnvoll oder habt Ihr gar eine bessere Idee?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...