animierte Gesichter auf NPCs, beste Möglichkeit?

Previous topic - Next topic

nabz32

Hallo,

wollte mich endlich mal dem Thema Gesichtsanimationen für meine NPCs in Reggie World widmen.

Ich habe mir dazu zwei Möglichkeiten überlegt:

1. Die NPC Textur wärend der Laufzeit editieren.
Dazu müsste ich wegen des nicht funktionierenden virtuellen screens auf der Pandora, die Texturen, welche geändert werden irgendwie mit loadsprite2mem
beim Laden eines Levels speichern. Die Gesichts Teile müsste ich dann auch vorher mit derselben Methode laden.
Dann könnte man beim Gesichts update leicht die gesichtsteile auf die Grundtextur auftragen und mit mem2sprite abschließen.

2. NPCs ein, aus 4 Polygonen bestehendes, Gesichtsplain mitgeben, dass dann mit dem NPC zusammen gezeichnet wird ( könnte die genaue positionierung mit pushmatrix etc. realisieren ). Dazu würde ich dann nur die Gesichtsteile und ein paar wenige Gesichtsplains in den Speicher laden.
Bei der ganzen Sache muss natürlich auch der Z Buffer bei der Pandora mitspielen, damit das Gesicht nicht rumflackert.

Was glaubt ihr, ist die bessere Methode?




nabz32

Habe mal die zweite Option durchgetestet.

Mit X_GETFACE habe ich die Position des Gesichts Plains am animierten Objekt bestimmt,
da man damit nicht die interpolierte Position einer smooth animation bekommt ( frame nimmt anscheinend nur integer Werte ),
habe ich die Position selbst interpoliert.
Das funktioniert schonmal sehr gut.

Es fehlt die Berechnung der Winkel des Gesicht-Plains, so dass es immer schön am Kopf anliegt,
wenn dieser sich animationsbedingt dreht.

Die einzige Lösung die mir dazu einfällt:
-Ein Hilfs Polygon an der Position des Kopfpunktes des Animationsskelletts in das Modell einfügen.
-Die Winkel zwischen einem Vertex am Hilfspolygon zu der Position des Gesichtes berechnen.

Das Hilfspolygon würde dann quasi die Funktion eines Joints oder Limbs übernehmen.




Kitty Hello

Mach doch 2-3 komplette Texturen für die Gesichter. A-O-M Laute, weißt wie ich meine?
Der Bug in CreateScreen sollte gelöst werden :(
Es ging ja mal...

nabz32

Hatte mir das mit den Gesichtstexturen so vorgestellt:
ich werde ein Augensprite mit einem Mundsprite auf einem neuen Sprite kombinieren,
der Mund müsste nur Animationen für ein paar Grundlaute haben und vlt. drei vier für versch. Stimmungen.
Die Augen bräuchten nur Animationen für blinzeln und die Stimmungen.

Währe top wenn der virtuelle Screen auf der Pandora mal wieder laufbereit währe, dann könnte ich mir den pseudo Skelletal Animations
Aufwand sparen um das Gesicht an das NPC Modell zu kleben, wobei ich nicht weiß, mit welchem Texturupdateaufwandt die Pandora klar kommt.


Schranz0r

Setze wie Gernot sagte 3 Texturen mit A-O-M und verwende einen Texturatlas für dein Spieler.
Teil diesen dann in Texturen auf, oder geh den Weg von OpenGL, was wohl performanter wäre...
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

nabz32

Danke nochmal für die Ansichten Schranz0r,

die Spielertextur ist schon aufgeteilt, habe dazu die Grundtextur und Teiltexturen in ein eigenes Dateiformat gepackt.
Da der Spieler nie spricht, habe ich dieses Feature nur dazu verwendet unterschiedliche Hosen- , T-Shirt Texturkombinationen schnell zu erstellen.
Das ist auch ziemlich performant auf der Pandora, aber wenn jeder NPC das machen würde, wäre es glaub ich etwas viel für die Pandora.

Habe den Code für die Gesichtsplains nun eingefroren. Ich hab schon so viele features im Spiel, dass es auch ohne dieses feature genug zu bieten hat
(hoffentlich).
( Habe letztens sogar aus Spaß noch einen verpixelungs Algorythmus hinzugefügt ( welcher leider wegen des virtual screen problems nicht auf der Pandora lauffähig ist ).

kanonet

Meine Idee für die Gesichtstexturen wäre so:
Erstelle für jede animierte Gesichtspartie ein eigenes 3D-Teilobjekt und textuiere es mit einem Atlas, die jeweils benötigte Animation wählst du dann durch verschieben der Texturekoordinaten.
Z.B. ein Quad (oder komplexeres Objekt) für die Augen-Partie. In der zugehörigen Textur-Datei befinden sich dan mehrere verschiede Augen Animationsstufen (oder einfach farbliche alternativen etc.) neben- oder untereinander. Dann änderst du die Texturkoordinaten mittels X_SETTEXTUREOFFSET und wählst somit aus, was du darstellen willst. Da du ein eigenes Objekt für jede Partie hast, kannst du diese auch alle unabhängig voneinander animieren.
Sind halt ein paar zusäzliche Objekt und größere Texturen im Speicher, aber die Polygonzahl oder Texturefüllrate sollten dadurch nicht hoch gehen, sollte von der Performance also nicht zu schlimm sein.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

nabz32

Das war auch meine Idee ( ich habe zum testen ein doppelplain für das Gesicht gemacht ).
Da der NPC individuell animiert ist, bräuchte ich hilfspolygon in der mitte des Kopfes, um den angepassten Winkel je nach
Animationsframes ( zB. laufanimation des NPCs ) berechnen zu können.
Würde dann den Winkel zu dem Vertex an die das Gesichtsobjekt gebunden ist und dem Hilfsvertex benutzen,
um zu erkennen ob sich zB. der Kopf des NPcs einen anderen Winkel hat.

Die Idee das Gesichtsobjekt nochmal aufzuteilen ist sehr gut :good:

Bin grade dabei ein Questbuch zu implementieren ( Editor dafür ist schon fertig, das InGame Design muss noch erarbeitet werden ).
Danach versuche ich es mal wieder mit Gesichtern.