Rendern von Zeichen mit abgeschnittenen Gliedmaßen (Blender-Modelle in Java / OpenGL)

10

Welche Aspekte sollte ich beim Erstellen von Charakteranimationen und beim Rendern von Klassen berücksichtigen, wenn ich abnehmbare Gliedmaßen haben möchte? Ich habe ein detailliertes Körpersystem entwickelt, das alles bis zum Nervensystem definieren kann. Ich strebe etwas an, das dem Detailgrad des Schadens in der Zwergenfestung ähnelt. Wenn ein Charakter beispielsweise seinen Oberarm beschädigt, besteht die Möglichkeit eines Nervenschadens, der den gesamten Arm deaktivieren kann. Oder sie könnten den Arm ganz verlieren.

Ich habe ein System für den Umgang mit dem Datenteil geschrieben. Jeder Charakter hat einen Stamm, der Anhänge und interne Teile hat. Jeder Anhang kann auch untergeordnete Anhänge und interne Teile enthalten. Untergeordnete Anhänge werden deaktiviert / entfernt, wenn ein übergeordneter Anhang deaktiviert / entfernt wird. Wenn eines der deaktivierten / entfernten Anhänge oder internen Teile lebenslang benötigt wird, stirbt der Charakter bald.

Woran ich gerade arbeite, ist der Zeichnungs- / Animationsteil davon. Wie definiere ich Animationen, um zu wissen, welche angesichts des aktuellen Zustands des Körpers (fehlende Arme / Beine usw.) zulässig sind? Wie richte ich das Zeichensystem so ein, dass fehlende Gliedmaßen nicht gezeichnet werden? Muss jedes Glied / Glied ein eigenes Modell sein (ich möchte abgeschnittene Gliedmaßen auf den Boden zeichnen)?

Das einfache System, von dem ich übergehe (ich habe es gerade zum Testen geschrieben), importiert alle Keyframes einer Animation als vollständige Modelle in ein VBO (zusammen mit den Scheitelpunkten, an denen Keyframes starten / stoppen). Die in Blender definierten Bones werden nicht importiert oder verwendet, und es wird nicht zwischen Frames interpoliert.

Dies ist wahrscheinlich eine ziemlich große Frage, daher suche ich auch nach Ressourcen, die mich dahin bringen, wo ich hin muss.

BEARBEITEN

Ich frage nach der Animation und weiß, welche Gliedmaßen animiert werden, da ich sie so einrichten möchte, dass eine alternative Animation ausgeführt wird, wenn ein erforderliches Glied fehlt. Nachdem ich darüber nachgedacht habe, stelle ich mir vor, ich würde diese Prüfung durchführen, bevor ich eine Animation aktiviere, und zu diesem Zeitpunkt die entsprechende Animation aktivieren.

MichaelHouse
quelle

Antworten:

7

Ich arbeite derzeit an einem ähnlichen System. Prozedurale Animation + Zerstückelung usw.

Wie definiere ich Animationen, um zu wissen, welche den aktuellen Zustand des Körpers angeben (fehlende Arme / Beine usw.)?

Ich folge diesem Punkt nicht ganz, wenn die Glieder nicht da sind, wen interessiert es dann, ob es animiert wird oder nicht, weil es nicht gesehen werden kann.

Muss jedes Glied / Glied ein eigenes Modell sein (ich möchte abgeschnittene Gliedmaßen auf den Boden zeichnen)?

Ich baue diese dynamisch aus Scheitelpunktknochengewichten auf. Die Qualität ist wahrscheinlich etwas geringer als bei jedem Glied von Hand, aber es ist weniger Aufwand, wenn ich es einmal gemacht habe, weil ich es dann auf jedes Modell anwenden kann.

Mit dem vernünftigen Ansatz aus dem folgenden Abschnitt hätte jedes Glied sein eigenes Modell.

Ich würde wahrscheinlich ein vollständiges Modell der gesamten Entität zur Hand haben und jedes der Gliedmaßen zerschneiden.

Wie richte ich das Zeichensystem so ein, dass fehlende Gliedmaßen nicht gezeichnet werden?

Bei zwei Hauptoptionen besteht der einfachste Weg darin, die Gliedmaßen einfach separat zu zeichnen. Wenn sich die Gliedmaßen verbinden, haben sie zusätzliche Flächen, die normalerweise mit "rohem Fleisch" -Texturen verborgen sind, die beim Entfernen der Gliedmaßen sichtbar werden.

Die zweite Möglichkeit besteht darin, dies dynamisch im laufenden Betrieb zu tun. Dies funktioniert nur mit relativ einfachen Modellen. Der Ansatz besteht darin, das Basismodell zu nehmen und die Eckpunkte zu finden, die mit dem Glied gewichtet sind, das Sie zerstückeln möchten. Entfernen Sie diese Scheitelpunkte und notieren Sie, womit sie verbunden sind, sodass Sie den offenen Abschnitt kennen. Sie schließen dann dynamisch über dem offenen Abschnitt mit Dreiecken mit einer "rohen Fleisch" -Textur. Aus der Sicht eines vernünftigen Softwareentwicklers ist dieser Ansatz nicht gut (Verformung des Laufzeitmodells) und weniger "flache" Leistungsmerkmale, aber ich mag ihn irgendwie.

Während die erste Methode viel mehr Draw-Aufrufe generiert, ist sie auch etwas zugänglicher.

Ich persönlich gehe mit der zweiten, mit relativem Erfolg, aber alle meine Modelle sind sehr Low-Poly, so dass es vorerst möglich ist, ein Modell dynamisch zu zerschneiden und das VBO innerhalb des Rahmens erneut hochzuladen.

Die in Blender definierten Bones werden nicht importiert oder verwendet, und es wird nicht zwischen Frames interpoliert.

Dies macht es wirklich schwierig, prozedural zu zerstückeln, denn woher wissen Sie, welche Eckpunkte zu welchem ​​Gelenk gehören? Scheitelpunktknochengewichte und Zerstückelung gehen so gut Hand in Hand, dass ich Ihnen empfehle, dieses Stück zu überdenken.

Ich schlage auch vor, dass Sie in Interpolation investieren. Ohne sie können Sie Ihre Animationen nicht beschleunigen / verlangsamen, und Sie sind mit der Framerate gekoppelt. Dies bedeutet, dass Sie weniger aus Ihren Animationen herausholen können. zB können Sie die Laufanimation nicht verlangsamen, wenn jemand zum Stillstand kommt usw.

Michael
quelle
Danke @Michael. Ich habe die Interpolation und den Import von Knochen erwähnt, weil ich weiß, dass ich sie irgendwann brauchen werde, aber ich habe sie noch nicht. Nach dem, was Sie gesagt haben, werde ich anscheinend wissen, was zu tun ist, wenn ich an diesem Punkt angelangt bin. Wahrscheinlich würde ich nur einen Anhang oder eine Gruppe von Anhängen mit einem Knochen verknüpfen. Ich werde eine separate Frage zum Importieren von Knochen stellen.
MichaelHouse
Da Sie an etwas Ähnlichem arbeiten, haben Sie vielleicht weitere Informationen zu dieser verwandten Frage? gamedev.stackexchange.com/q/20931/7191
MichaelHouse
5

Am besten schneiden Sie die Gliedmaßen ab und verwenden je nach aktuellem Zustand der Wunden mehrere Untermodelle. Ihr Ansatz, einen VBO pro Keyframe zu verwenden, ist einfach übertrieben. Verwenden Sie ein Skelettanimationssystem und spielen Sie je nach erlittenem Schaden unterschiedliche Animationen ab (Hinken mit einem Bein, Krabbeln ohne die beiden Beine usw.).

Valve veröffentlichte in L4D2 eine Reihe guter Dias über die Wunden und die Zerstückelung. Ich mag den Ansatz, ein Modell für die Organe und Knochen zu verwenden und das "Haut" -Modell basierend auf Texturprojektionen von Schnitten, Schüssen usw. zu beschneiden.

r2d2rigo
quelle
Interessant. Diese Folien sehen gut aus. Dies scheint für Schäden zu funktionieren, die keinen ganzen Anhang betreffen.
MichaelHouse