Animation&Speicher sparen II
-
Halli hallo, bin wieder do!
Vielleicht sind mein Ausführungen unter 'Animation&Speicher sparen' auch zu speziell. Ich stell mal ne ganz allgemeine Frage:
Angenommen, ich möchte in meiner Anwendung eine Bibliothek aus Animationen einsetzen. Wie werden denn solche Animationen in der 3DGrafikprogrammierung dargestellt. Wie ist es denn üblich? Alle Animationsschritte abspeichern oder Animationspfadfunktionen auswählen oder . . . ?
Grüße,
TS++[ Dieser Beitrag wurde am 06.05.2003 um 13:27 Uhr von TS++ editiert. ]
-
Man kann übrigens auch in seinem alten Thread weiterschreiben!
-
grundsätzlich gibt es das als meshmorphing oder skeletanimations.
beim meshmorphing (auch blendshapes genannt) wird das ganze mesh in jedem frame seiner animation gespeichert und falls man mal einen frame anzeigen möchte wird das mesh davor und danach entpackt und zwischen denen wird animiert.
z.B. kingpin oder quake3Abei skeletanimationen speichert man sie pro vertex den index des dazu passenden bones (manchmal auch bis zu 4 und deren gewichtungen), dann wird so ein skelet animiert und die matritzen die man daraus bekommt dazu genutzt die vertices zu transformieren.
vorteil des ersten systems ist, dass die animationen belibig sein können, also animierte stoffetzen, menschen,pflanzen... es sind auch UV-animationen möglich.
nachteil ist, dass die datenmengen selbst bei guter kompression sehr hoch werden können und dass bei zu großer quantitisierung die meshes abgehackt animiert werden.vorteil des zweiten systems ist, dass man ein skelett nur einmal animieren muss und diese animationen für belibiege meshes einsetzen kann, solange man den vertices die bones gut zuweisen kann. es kann auch sehr speichersparend ausfallen, wenn z.B. ein planet um die sonne rotieren soll, denn dann speichert man sich halt nur die rotationsaxe und den winkel.
nachteil ist, dass man nicht so flexibel ist, weil mit steigender feinheit von animationen die anzahl der bones extrem steigt und das skinning (also bei mehr als einem bone pro vertex) der rechenaufwand sehr zunimmt.rapso->greets();
-
@TGGC:
Ja, das ist mir schon klar, dass ich im alten Thread auch hätte weiterschreiben können. Nur die Wahrscheinlichkeit, dass sich jemand einen Thread ansieht ist viel höher, wenn die offizielle Anzahl an Antworten immer noch auf 0 steht.@rapso:
rapso::zuverlässig=true;
Danke für die ausführliche Antwort!
Du meinst also, dass es nicht üblich ist, die einzelnen Animationsschritte, oder besser die Matrizen, während der Animation zu berechnen!?Wenn ich mich jetzt wirklich für eine Speicherung entschließe, dann könnte ich doch die einzelnen Animationen ebensogut in Binärdateien ablegen und in den Heap laden, sobald mindestens ein Objekt die betroffene Animation nutzen will.
Grüße,
TS++[ Dieser Beitrag wurde am 06.05.2003 um 14:53 Uhr von TS++ editiert. ]
-
Also ich benutze gerade MS3D Dateien ...
Die benutzen Skeletal-Animation.Aber zur Frage mit dem Speicherverbrauch ...
Lässt es sich verhindern das man den kompletten Mesh jedesmal zur Grafikkarte schicken muss ? Ich meine sowhl im MD3 Format, wo alle Bewegungen vorberechnet wurden und sie so aus der Datei geladen werden, als auch bei Skeletelanimation, wo man die Vertices @ runtime drehen muss ... Letzt endlich muss man die neuen Vertices immer zur Grafikkarte schicken, oder kann man das irgendwie verhindern ?
(ohne Shader, damit könnte man ja die Rotation/Translation auf der GPU machen ...)
-
@TS++:
beide verfahren werden benutzt, es ist eine frage des gebrauchs, welche besser geeignet sind
wenn du z.B. ein gesicht animierst (möglichst gut) wären blendshapes vielleicht sparender (vom daten und rechenlast wegen), weil du in diesem fall vielleicht skinnig von 16einflussbereichen machst (das macht die matrox übrigens sogar in hardware), du müßtest für unzählige bones die rotation und translation speichern.. morphin (blendshapes) sind in diesem fall also eindeutig besser.
angenommen du machst einen shooter, 20 verschiedene character die laufen, schiesse,hinfallen... da kommt man auf ca 16 bones. die brauchst du nur einmal animieren und kannst auf allen 20 chars verwenden, in diesem fall wären also bones sparrsammer.
manchmal wird auch gemixt zwischen den methoden indem man je nach lod verschiedene dinge nutzt, oder indem man z.B. den kopf mit haaren durch blendshapes macht und dann in das skelet einbezieht um den kopf z.B. noch zu drehen.
@ChaosAngel:
du hast zwei möglichkeiten, entweder du nutzt das in hardware vorhandene skinning oder du schreibst dir einen vertexshader dafür, dann kannst du auch zwischen zwei shapes interpolieren.damit schaf man mehrere tausend lowpoly mänlein zu animieren *Ggg*
rapso->greets();
-
@rapso:
Danke für die Anwort!
Das hat mir schon geholfen! Jetzt weiss ich, wie ich das Problem anpacke.
Zur Info: es ist nicht erforderlich, dass meine Animationen die geometrische Gestalt meiner 3DModelle verändern. Derartige Effekte hab ich nicht mit eingeplant. Ich hab's also etwas leichter!Grüße,
TS++
-
@rapso
Nunja, aber ein VertexShader würde die Übertragungslast meines AGP Busses nicht verringern. Da ich immernoch die Matrizen, bzw. die Rotations/TranslationsVectoren zur GK schaffen müsste.
Es sei denn ich speichere all dieses in der GK. Dies hätte allerdings einen ziemlich hohen Speicherverbrauch auf der Gk zufolge.angenommen du machst einen shooter, 20 verschiedene character die laufen, schiesse,hinfallen... da kommt man auf ca 16 bones. die brauchst du nur einmal animieren und kannst auf allen 20 chars verwenden, in diesem fall wären also bones sparrsammer.
Versteh ich nicht ???
Was wäre denn daran sparsamer ?
Wie kann ich die bitte nur einmal animieren ?!?!?!
Ich meine, sie bewegen sich zur gleichen Zeit doch unterschiedlich ! (der eine der springt gerade, der andere läuft)
Ich muss also verschiedene Matrizen auf die jeweiligen Models anwenden.
Oder schlägst du vor die Matrizen vorzuberechnen ? Das wäre auch scheisse, denn dann könnte man auf Grund der Rotationen nicht mehr Interpolieren und das würde sogar mehr Speicher fressen als die MD3 Methode
Wsa meinst du also damit, man kann "das" einmal berechnen und auf alle anwenden ...
-
es geht um die datenmenge. für die skelette mußt du nur einmal die animationen speichern, weil du dann für jeden bot die selben animationsresourcen benutzen kannst. (nicht die selbe animation)
und ein paar matritzen (vielleicht 16) in die vertexshaderconstanten zu stopfen ist weniger aufwändig als ein mesh mit 2k polys selbst durchzuanimieren.
außerdem kann man im vertexshader auch zwischen meshes blenden (also blendshapes). das ist qausi ganz unaufwendig für die cpu, man muss nur 2vertexstreams mit positionen haben und diese dann mit einer interpolationskonstante im vertexshader blenden.
rapso->greets();