Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

3dcoder

Frischling

  • »3dcoder« ist der Autor dieses Themas

Beiträge: 40

Wohnort: Krefeld

  • Private Nachricht senden

1

23.01.2008, 22:30

Charakteranimation

Hi zusammen!

Mich würde mal interessieren wie ihr eure Spielcharaktere animiert.

Mein Ziel ist ein Jump 'n Run Spiel so wie Spyro the dragon oder Mario 64. Es soll einfach ein Hüpfspiel mit 3D-Grafik werden. Dafür brauche ich natürlich bewegte Figuren.

Ich habe bisher ein paar Experimente mit Blender und der Animation über Bones durchgeführt. Die Bones habe ich zusammen mit den Keyframes und den Vertexgroups mit einem Python-Skript exportiert und nach viel(!) Experimentieraufwand dann in meinem Programm zum Laufen bekommen. Das scheint mir aber keine gute Lösung zu sein da

1. der Aufwand das Skinning zu berechnen zur Laufzeit recht hoch ist und
2. es immer noch irgendwelche Ungereimtheiten in Blender gibt die den Export der Animation boikottieren

Darum meine Frage: Wie wird das professionell gemacht?

Die Animation des Charakters über Vertex Shader abzubilden ist natürlich möglich und sehr performant - aber wie werden dann die Hitboxes nach der Transformation durch die Animation zurück ins Programm transportiert?

Ach ja - bei Bones kann ich natürlich mit dem SLERP Algorithmus der Quaternionen diese überblenden. Wie sieht das mit der von euch verwendeten Technik aus?

Plaudert mal aus eurem Nähkästchen :) ... bitte!

Thx in advance!
3dcoder

P.S. Code kann ich gern liefern wenn ihr masochistisch veranlagt seid :)

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

2

23.01.2008, 23:06

Also normalerweise wird Charakteranimation heutzutage mit gebonten Modellen gemacht und das Skinning wird erst im Shader gemacht. Als Interpolationalgorithmus verwendet man spherische Interpolation (Quaternionen).
BoneAnimation zahlt sich vor allem dann aus, wenn man mit Physik arbeitet und/oder verschiedene Charakterposen kombinieren will, auch wenn man sehr viele verschiedene Charaktermodelle hat, ist sie von Vorteil.
Wenn man aber wie in deinem Fall (ich denk grad an Mario), nur einen Charakter zu animieren hat, und dieser auch nur einige wenige Animationen (statische) besitzt, dann wäre KeyframeAnimation auch eine gute Wahl (sehr schnell!). Aber wie gesagt. Ich würds auf jeden Fall mit BoneAnimation machen. Dann bist du erstens abgesichert, wenn du mal das Teil erweitern wollen solltest (zB mit Physik!) und du hast gleichzeitig eine BoneAnimationKlasse welche du immer wieder verwenden kannst!
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

3dcoder

Frischling

  • »3dcoder« ist der Autor dieses Themas

Beiträge: 40

Wohnort: Krefeld

  • Private Nachricht senden

3

24.01.2008, 09:35

Hi Black-Panther!

Danke für die Infos!

Aber eine Frage bleibt auf jeden Fall noch offen: Wenn der Shader das Skinning macht - wie bekomme ich dann die transformierten Hitboxen zurück ins Programm? Ich muss ja die Kollision mit diesen prüfen können...

Grüße
3dcoder

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

4

24.01.2008, 14:22

hmm... afaik kann man keine Daten von einem Shader beziehen... Du müsstes also trotzdem den BoneGraphen berechnen und dann die Transformationsmatrizen für jeden seiner Nodes. Aber das ist ein einfacher BFS-Algorithmus und dieser passiert in O(n). Was vor allem bei der nicht allzugroßen Anzahl von Bones kaum ins Gewicht fällt!
Die OBB transformierst du dann natürlich erst, wenn sie auch transformierter benötigt werden!
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

24.01.2008, 17:05

der vertexshader transformiert "nur" die vertices. das berechnen der einzelnen matritzen findet nach wie vor auf der CPU statt (wie willst du das in einem vertex shader überhaupt gescheit anstellen!?). die fertigen matritzen werden dann in den konstanten-registern an den shader übergeben. es ist zwar nicht unmöglich die ausgabe eines shaders zu bekommen, allerdings ist es alles andere als effizient. nachdem du aber die informationen über die einzelnen matritzen sowieso besitzt, kannst du die transformation der hitboxen ohne weiteres auf der CPU erledigen...

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

6

24.01.2008, 20:11

der geometry shader liefert einen stream zurück. allerdings erfordert dieses dx10 und eine shader 4.0 fähige grafikkarte ;)

3dcoder

Frischling

  • »3dcoder« ist der Autor dieses Themas

Beiträge: 40

Wohnort: Krefeld

  • Private Nachricht senden

7

25.01.2008, 09:27

Hi!

Okay - die Matrizen mach in der CPU. Dann kommen wir zur Durchführung des Skinning:

Wenn die Eckpunkte eines Dreiecks zu verschiedenen Bones gehören brauche ich verschiedene Matrizen für die Eckpunkte und der Shader muss entscheiden können welche Matrix er für welchen Vertex verwendet....

In den Tutorials die ich bisher gesehen habe
http://www.flipcode.com/archives/Geometr…irectX_80.shtml
und
http://zfxce.zfx.info/Tutorials.php?ID=71

Wird leider nicht erwähnt wie das genau nun funktionieren soll...

Der Shader muss ja pro Vertex den er bekommt eine Art Abfrage machen zu welchen Bones der Vertex gehört und die enstprechende Transformation dann durchführen. D.h. der Shader muss irgendwie eine Liste haben welcher Vertex zu welcher Bone gehört... oder übersehe ich da gerade etwas?

Grüße

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

25.01.2008, 11:07

Zitat von »"3dcoder"«

Wenn die Eckpunkte eines Dreiecks zu verschiedenen Bones gehören brauche ich verschiedene Matrizen für die Eckpunkte und der Shader muss entscheiden können welche Matrix er für welchen Vertex verwendet....


Richtig.

Zitat von »"3dcoder"«


In den Tutorials die ich bisher gesehen habe [...]

Wird leider nicht erwähnt wie das genau nun funktionieren soll...


Gut, im Ersteren isses ein wenig versteckt...

Wenn du mit asm codest, dann läft das ganze über das Adressregister a0.
Du packst deine Matritzen in die Konstantenregister des Shaders (z.b. c10 - c90).

Daraus ist auch gleich eine der wesentlichen Einschränkungen des Verfahrens ersichtlich: Die max. mögliche Anzahl der Bones ist durch die Anzahl der Konstantenregister beschränkt. Bei Shader Model 1.1 sind das min. 96 und bei 3.0 min 256. Bedenkt man, dass du die Register auch noch für andere Dinge brauchst, kannst du, jetzt mal grob abgeschätzt, zumindest mit sm 1.1, nicht viel mehr als 20 Bones übergeben. Das ist unter Umständen nicht viel. Auswege wären, z.b. das Modell aufzusplitten etc.

Anyway: Über das Adressregister kannst du dann das Konstantenregister mit dem Index der in a0 steht adressieren. Ein einfacher asm Shader der das macht sieht z.B. so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// c0 - c3                     World x View x Projection Matrix
// c4                           Kameraposition
// c5                           Lichtposition
// c6                           0.0f, 0.5f, 1.0f, 2.0f
// c7                           4.0f, 0.0f, 0.0f, 0.0f
// c10                          Bones

vs_1_1

dcl_position v0
dcl_blendindices0 v5

mul r0.x, v5.x, c7.x       // index der matrix berechnen
mov a0.x, r0.x             // jede matrix belegt 4 register

m4x4 oPos, v0, c[a0.x+10]  // transformation


Aber halt. Shader muss man heute nicht mehr in asm schreiben. Das war vielleicht zu dx8 Zeiten so, aber heute haben wir HLSL. In abetracht der Tatsache, dass man asm in dx10 gar nicht mehr benutzen kann ( :cry: ), ist es vielleicht einfacher und sinnvoller, wenn du dich mit HLSL beschäftigst. Da kannst du dir einfach ein Array aus Matritzen machen und ganz normal drauf zugreifen (wie in C halt auch). Um die Details kümmert sich der HLSL Compiler...vor allem bist du mehr oder weniger unabhängig von einem bestimmten Shader Model...die üblichen Vorteile einer Hochsprache halt...

Zitat von »"3dcoder"«


Der Shader muss ja pro Vertex den er bekommt eine Art Abfrage machen zu welchen Bones der Vertex gehört und die enstprechende Transformation dann durchführen. D.h. der Shader muss irgendwie eine Liste haben welcher Vertex zu welcher Bone gehört... oder übersehe ich da gerade etwas?


Richtig. Jeder vertex hat einen (oder mehrere) Bone Indices über die der Vertexshader die entsprechenden Matritzen indizieren kann :roll:

3dcoder

Frischling

  • »3dcoder« ist der Autor dieses Themas

Beiträge: 40

Wohnort: Krefeld

  • Private Nachricht senden

9

26.01.2008, 16:12

Danke für die ausführliche Erläuterung! Ich glaub ich habs nun verstanden (hab mir die GLSL-Doku auch mal genauer vorgenommen und gesehen, dass man Vertex-Attribute angeben kann. Hier kann ich dann die Indices der zuständigen Matrizen reingeben).

Wenn ich etwas lauffähiges habe poste ich das!

Grüße
3dcoder

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

10

26.01.2008, 16:39

Mh also ich benutze nach wie vor keine Bone Animation sondern nur Keyframes. Mag zwar speicherintensiv sein, jedoch gehts sehr schnell und man kann vorallem detailiertere Dinge wie Mimik etc. ohne zusätzlichen Rechenaufwand oder andere Probleme realisieren.
Klar, für realistische Simulationen etc. ist so kein Raum. Aber für geringen Aufwand bekommen wir hier ein gutes Ergebnis.
Die Modele sind zwar im Modelle oft per Bones animiert, jedoch manchmal auch anders... dem Exporter ist es gleich.

Also in dem Sinne find ich ist für Leute mit gerineren Ansprüchen Keyframe-Animation auch noch eine Alternative.

Werbeanzeige