Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
Moin, Ich arbeite gerade an einer Model-class und bin soweit mit der organisation des Meshs fertig. Da ich die Modelle
animieren will hab ich mich mal schlau gemacht, was es da für Methoden gibt und bin auf by Vertex-animation und skeletal Animation gestoßen.
Da die Skeletal-animation nicht so speicher lastig und optisch "richtiger" erscheint hab ich mich dafür entschloßsen.
Hab das ersteinmal mit Matrizen versucht, aber nicht hinbekommen, also bin ich auf Quaternions ausgewichen und habe mit einzelnen Punkten
damit auch vernünftige Ergebnisse, allerdings weiß ich nicht, wie ich denn nun mein Skelett damit animieren soll. Schließlich kann ein Quaternion
ja nur 1 Achse haben, aber es würde ja sinn machen einen Bone um alle räumlichen Achsen drehen zu können. Gibt s da eine Möglichkeit alle
rotationen mit einem Quaternion auszuführen, oder wie stellt man das am besten an? Über die Keyframes mach ich mir erstma noch keine Gedanken,
will erstmal nur, dass ich mein Mesh bewegen kann.
Man kann jedes objekt eine belibige orientierung geben, indem man es um nur eine Achse in eine richtung dreht. (Funktioniert sogar in der Realwelt). Man kann rotationen mit Quaternionen durch multiplizieren kombinieren (wie mit matrizen). Alternativ kann man auch rotationsmatrizen in Quaternionen umwandeln.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Zitat:
Hab das ersteinmal mit Matrizen versucht, aber nicht hinbekommen, also bin ich auf Quaternions ausgewichen und habe mit einzelnen Punkten damit auch vernünftige Ergebnisse
Du musst Da einen Fehler gemacht haben, denn ob Du Matrizen oder Quaternions nimmst sollte eigentlich egal sein
Zitat:
allerdings weiß ich nicht, wie ich denn nun mein Skelett damit animieren soll. Schließlich kann ein Quaternion ja nur 1 Achse haben
Ja, das stimmt, aber Du musst das Quaternion bei einer Animation ja ohnehin immer neu erzeugen, weil sich Winkel oder Achse oder beides doch jederzeit ändern kann
Zitat:
rotationen mit einem Quaternion auszuführen, oder wie stellt man das am besten an? Über die Keyframes mach ich mir erstma noch keine Gedanken, will erstmal nur, dass ich mein Mesh bewegen kann.
Wenn Du zunächst mal auf Keyframes verzichten willst - was ich verstehen kann - wäre es trotzdem wichtig, die Datenstrukur so aufzubauen, dass Du später leicht zu Keyframes überwechseln kannst.
Vorausschicken möchte ich, dass dieses Zeug für mich ein Hobby ist. Ich bin also kein professioneller Spieleprogrammierer. Damit Du weißt mit wem Du es zu tun hast.
Aus meiner bisherigen Erfahrung kann ich sagen, dass wenn man das Skelett als Baum von Gelenken aufbaut, ist die Implementierung verblüffend einfach. Was jetzt die Schwierigkeit beim Aufbau eines klugen 3d-Objekts ist, ist die Tatsache, dass Gelenke nur EINE Zutat zum Zeichnen sind, es gibt ja auch noch Material zu berücksichtigen. Zusätzlich - und an dem Problem kaue ich grade selber- wird irgendwann einmal das Problem schlagend, dass man ein bissel Physik einbauen will. Das sollte man immer im Hinterkopf behalten.
Die unbedingt nötigen Daten eines Gelenks sind folgende:
--------------------------------------------------------------------------
1.Position (ein 3D-Vektor)
2.Lokale Matrix (oder besser: Quaternion, weil weniger Daten)
3.Transformationsmatrix [TM] (ist notwendig fürs Zeichnen und wird bei jedem Frame neu erzeugt, muss eigentlich gar nicht gespeichert werden; könnte natürlich auch ein Quaternion sein)
Das wäre für Keyframes. Wenn Du das erstmal weglässt, könntest Du hinzufügen
4. RotationsAxis
5. RotationAngle
Und natürlich die Methoden
SetRotationAxis
SetRotationAngle
mit denen Du Achse und Winkel jeweils getrennt manipulieren kannst. Jede dieser Manipulationsmethoden erzeugt eine neue Lokale Matrix aus der aktuellen Rotationsachse und dem aktuellen Rotationswinkel des Gelenks.
WICHTG, BITTE JETZT GENAU LESEN:
Wenn Du es mit einem normalen Mesh zu tun hast, darfst Du die Rotation jetzt nicht einfach so auf die Vertices anwenden.
In der Fachliteratur steht dabei immer: "Man muss die Vertices vom Objektraum in den Gelenksraum bringen." Dahinter steckt nichts anderes, als dass alle Vertices, die diesem Gelenk zugeordnet sind mit dem Gelenks-Positions-Vektor in den Ursprung verschoben, dort gedreht und dann wieder zurückverschoben werden müssen.
Die obige Gelenks-Datenstruktur ist allgemeiner Natur, eignet sich z.B. auch für inverse Kinematik.
Die Transformationsmatrix wird erst vor dem Zeichnen erzeugt, dann läuft eine TREE-Rekursion den Baum von der Wurzel bis zu allen Finger/Zehenspitzen und jedes Gelenk erzeugt seine TM aus der Parent.TM und seiner lokalen Matrix. Das ist eine winzig kleine Methode, aber unheimlich mächtig und dabei total simpel.
Ein wenig mehr Hirnschmalz muss man in die Methode investieren, die den Baum beim Laden der Daten aufbaut.
Beim Zeichnen muss man dann die Gelenks-TM benutzen und anschließend alle Vertices des Gelenks hineinfüttern. Das ganze ist auch Shader-kompatibel. Traude
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.