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

1

26.07.2010, 19:12

Skeleton-Animationen: Suche Informationen

Hi Volkz!

Ich habe mich an einem MD5 Loader versucht, ohne wirklich Ahnung davon zu haben, wie Skeleton-Animationen überhaupt funktionieren. Ich habe ein bischen Hintergrundwissen und weiß auch wie es im Ansatz funktioniert, aber was die Mathematik usw. angeht, habe ich kein blassen Schimmer.

Kennt jemand eine gute Seite wo Skeleton-Animationen im allgemeinen, also nicht Format-Spezifisch, beshrieben werden? Optimalerweise mit Matrizen und keinen Quaternionen, da mir das arbeiten mit Matrizen doch einfacher fällt.

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

Crush

Alter Hase

Beiträge: 383

Wohnort: Stuttgart

Beruf: Softwareentwickler

  • Private Nachricht senden

3

26.07.2010, 22:03

Vielen Dank, genau sowas habe ich gesucht, es ist auch gut verständlich. In der zwischenzeit habe ich ein eigenes kleines Format aufgesetzt, und so wie es aussieht ist es ohne veränderungen am bestehenden code auf diese Art von animationen erweiterbar.

Was ich aber noch nicht ganz verstehe ist, warum ein Bone eine rotation und eine position hat, würde denn nicht eine position aleine oder eine rotation aleine ausreichen?

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

Crush

Alter Hase

Beiträge: 383

Wohnort: Stuttgart

Beruf: Softwareentwickler

  • Private Nachricht senden

4

26.07.2010, 23:52

Wenn man die Position nicht hätte, müßte man wenigstens die Länge haben, was aber etwas komplizierter wäre, da man daraus eh wieder die Position berechnen müßte. Eine Rotation alleine reicht ja nicht aus - man muß wissen, um welchen Punkt herum das Gelenk rotieren kann. Wenn Du einmal ein Sonnensystem mit Planeten und darum herumkreisenden Monden programmiert hast, dann solltest Du verstehen, wieso die Monde eine andere Position (die von deren Planten um den sie kreisen) benötigen als die Objekte, die ums Zentrum herum rotieren. Trotzdem muß die Rotation und Position des Planeten dann noch zum Mond hinzugerechnet werden, damit alles richtig paßt. Das ist bei einem Skelett nicht anders. Hier werden von den zentralen Knochen die Gelenke rotiert und dann verschoben und beim Beispiel eines Fingers ist dann noch der Oberarm, der Unterarm, die Schultern und der Körper selbst mit Position und Rotation in korrekter Reihenfolge zu berücksichtigen.

5

27.07.2010, 00:09

Wenn man sich das Skelett als Reihe von Punkten die mit Strichen verbunden sind vorstellt (so kann man es sich z.B. in Blender anzeigen lassen), würden tatsächlich relative Positionen reichen, um es zu definieren. Aber stell dir vor du hast 2 Positionen von einem Knochenendpunkt und willst interpolieren. Wenn du das als Position betrachtest, würdest du eine gerade Strecke durchlaufen, weil man so eben Positionen interpoliert, wenn du es aber als Rotation speicherst, läufst du entlang eines Kreises.
Und wenn du die Bewegung des Bones auf das ihn umgebende Mesh überträgst, ist es ein großer Unterschied, ob du die neue Position jetzt durch Verschiebung oder Drehung erreichst.
Lieber dumm fragen, als dumm bleiben!

6

27.07.2010, 00:54

Jetzt hab ichs verstanden, danke ^^

Eine Frage hätte ich aber noch. Ich sehe das die ganzen Binär formate wesentlich weniger speicherplatz verschwenden als die lesbaren formate. Jetzt stelle ich mir aber die Frage wie das mit den binärformaten eigentlich funktioniert. Haben die einfach für manche buchstaben ein Symbol, zum beispiel A heißt, das nun 3 mal integer mit je 4 Byte folgen und aus den 12 Buchstaben dann 3 integer zusammen gebastelt werden oder so in der art?

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Potatoman« (27.07.2010, 01:29)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

27.07.2010, 09:16

Binärformate beinhalten genau die Binäre Repräsentation der Datentypen... Also im Grund einfach das was im Speicher für ein Integer/Float/... abgelegt wird, kommt genau so in die Datei.
@D13_Dreinig

Crush

Alter Hase

Beiträge: 383

Wohnort: Stuttgart

Beruf: Softwareentwickler

  • Private Nachricht senden

8

27.07.2010, 12:27

Bei Binärformaten werden in den meisten Fällen zusammengehörige Daten in Strukturen abgelegt mit größtenteils vordefinierter Objekttyp und -größe und bei flexiblen Elementen wie Arrays oft mit Arraygröße oder Anzahl Elemente. Mehrere solcher Strukturen werden dann u.U. hintereinander in sog. "Chunks" geschachtelt - welche of durch irgendwelche Schlüsselwörter oder Zahlenfolgen eingeleitet werden - die eine übergeordnete Struktur darstellt und so mehrere Teile eines Objekts oder mehrere Objekte in einer Welt bündeln kann.

9

27.07.2010, 13:13

Also im prinziep so wie ich meinte?

Wenn man nun nen Integer laden will, kann ich mir das noch gut vorstellen, da lade ich einfach mit fstream::get() die nächsten 4 Buchstaben und mit den binäroperatoren verknüpfe ich diese dann zu einem Integer, so wie ich es bei bei Farben bei DX9 gemacht habe. Aber wie macht man das nun mit Float werten? Ich mein, ich muss ja noch irgentwie an den dezimalen Punkt kommen? Oder läd man die 4 Buchstaben einfach in ein char array, und casted dieses dann einfach in ein Float um?

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Potatoman« (27.07.2010, 13:21)


10

27.07.2010, 13:23

Also, du solltest dir wirklich mal die Grundlagen des Binärsystems anschauen.

Mal ganz kurz: Zahlen werden Binär gespeichert, d.h. 11_bin=3_dez (denn 1*2^0+1*2^1=3; siehe Wikipedia).

Ein int hat normalerweise 32 bit.
Ein char hat 8 bit und kann eins von 256 verschiedenen Asciizeichen speichern (denn 2^8=256).
Die Zahl 70106 würde in Ascii 5 Byte brauchen, denn jedes kann nur ein Zeichen speichern. Die 7 als Zeichen ist nicht das selbe wie die 7 als Zahl, das Zeichen 7 hat in der Asciitabelle den Wert 55.

Also Text gespeichert speichert man also statt 70106 tatsächlich 5 Zahlen, nämlich: 55, 48, 49, 48, 54. Jede davon ist 1 Byte groß, also insgesamt 5 Byte. Binär gespeichert, nimmt man einen Integer der 4 Byte groß ist und 70106 direkt als Zahl enthält. Da ein Integer mti 4 Byte aber Zahlen bis 4 Milliarden speichern kann, ist das Verhältnis von Text zu Binär bei großeren Zahlen noch extremer.

Wie gesagt, das war äußerst knapp, du solltest dich wirklcih irgendwo mal ausführlich darüber informieren, das sind Grundlagen.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige