Ein häufiges Merkmal in vielen Spielen ist die Möglichkeit, Geräte oder kosmetische Gegenstände auf den Charakter des Spielers umzustellen. Ein häufiges Beispiel dafür ist Kleidung oder Rüstung. Aber wie wird es gemacht?
Zuerst müssen wir die geskinnten Meshes verstehen. Stellen Sie sich vor, wie Sie ein Spielobjekt als Kind eines anderen einstellen, sich das Elternteil bewegt und dreht, sich auch das Kind bewegt und dreht. Tatsächlich bleiben die Position und Drehung des Kindes im Verhältnis zum übergeordneten Objekt konstant. Dies liegt daran, dass die Position des Kindes und die Positionen aller seiner Nodes mit der Transformation des Kindes selbst sowie der des Elternteils und seines Elternteils usw. multipliziert werden. Wenn Sie nicht mit der Mathematik vertraut sein sollten, finden Sie zahlreiche hilfreiche Tutorials im Internet.
Wie auch immer, genau wie ein Kind durch Matrixmultiplikation mit seinem Elternteil „gekoppelt“ werden kann, kann ein Node durch Matrixmultiplikation mit einem Bone „gekoppelt“ werden. Nur geskinnte Meshes gehen einen Schritt weiter. Mehrere Matrizen können sich dort einbringen, wo ein Bone endet. Das heißt, jeder Transformationsmatrix, die einen Bone beeinflusst, wird ein skalares Gewicht zugewiesen, das den Grad beeinflusst, in dem der Node mit dieser Transformation „gekoppelt“ ist. Die Gewichte sind diejenigen, die von dem Künstler, der das Modell manipuliert hat, „gepainted“ wurde. Da alle diese Transformationen für jeden Node erfolgt und die Operation eine Menge Matrixmultipliaktion beinhaltet, wird sie typischerweise in einem Vertex-Shader durchgeführt.
Eine Optimierung, die daraus abgeleitet werden kann, ist, dass jedes geskinnte Mesh nur Bones verwenden sollte, die tatsächlich Gewicht auf sie haben. Andernfalls beanspruchen zusätzliche Bonetransformationen die Bandbreite zur Grafikkarte. Der Performance-Gewinn hängt stark von der Zielplattform und der Anzahl der verwendeten Skin-Meshes ab.
Da sich die Nodes in einem schönen Array befinden, das diese Daten in einen schönen soliden Block verschiebt, gibt es nicht den gleichen Aufwand, wie sie alle einzeln zu verschieben. Ihr Vertex-Shader wird immer noch eine Reihe von Matrix-Multiplikationen durchführen, die einfach mit Null multipliziert werden, wenn Sie die zusätzlichen Bones jedoch nicht trimmen.
Zurück zu unserem Problem: Wir müssen sicherstellen, dass sich die Kleidung zusammen mit dem geskinnten Mesh der Figur verformt. Allein das Werfen der Kleidung in der Szene mit einer eigenen Kopie des Riggs würde dazu führen, dass die Animationswiedergabe auf mehreren Bonesätzen synchronisiert werden muss. Daher müssen wir sicherstellen, dass alle geskinnten Meshes, die an den Charakter angehängt werden, dieselben Nodeobjekte verwenden.
Angenommen, Sie verwenden das gleiche Gerät für Kleidung, ist dies sehr einfach. Unity`s SkinnedMeshRenderer hat ein Array mit der Bezeichnung „Bones“, das Referenzen auf die Transforms alle Bones-Spielobjekte speichert, mit denen dieser verknüpft ist. Die auf das geskinnte Mesh gemalten Gewichte beziehen sich über ihren Index auf die Bones. Wenn Sie also das gleiche Rigg über alle ihre Bekleidungsoptionen und ihr Basismodell hinweg verwenden, müssen Sie lediglich die Boneanordnung der geskinnten Meshes auf das gleiche wie die des geskinnten Meshes des Basismodells einstellen. Hier ist eine reine Erweiterungsmethode, die genau das tut.
Als Erweiterungsmethode ist sie so spärlich, dass sie sinnlos ist. Lasst es uns etwas robuster machen, um weniger saubere Fälle zu handhaben. Wenn ihre Nodestrukturen ähnlich genug sind (z.B. zwei mit dem gleichen Layout, aber unterschiedlichen Indizes oder Namen oder der Fall, dass ein Rig eine Teilmenge des anderen ist), können Sie mit relativer Leichtigkeit auf das Ziel-Rig umstellen. Dies erfordert, dass Sie durch die Rigs iterieren und einige Namensabgleiche durchführen.
Die folgende Methode verwendet den Bonenamen aus dem neuen Mesh (Kleidung), um vorhandene gleichnamige Nodes aus dem Basis-Mesh zu finden.
Wenn bei der Erstellung von Kunstwerken etwas schief gelaufen ist und die Bone-Namen nicht mit den Assets übereinstimmen, kann die folgende Methode verwendet werden, um Bones mit einem benutzerdefinierten Namensarray und nicht mit demjenigen, das dem Zielgewerbe zugeordnet ist, abzugleichen.
Wenn ihre Rigs zu unterschiedlich sind, ist ein komplizierteres Remapping erforderlich und es kann zu unerwünschten Verzerrungen des Meshes kommen. Zukünftige Arbeiten könnten das Abgleichen von Bones nach Struktur beinhalten, indem sie durch die Hierarchie gehen und gemeinsame Merkmale identifizieren.
Vielen Dank für ihren Besuch.
Leave A Comment