Seite 1 von 1

Assimp: Gleiche Zahl von mNum*Keys für alle Channels?

Verfasst: 24.12.2010, 12:54
von CarstenF
Hallo liebe Leute,

zwei kurze Fragen zu Assimp's aiAnimation struct:
  • Kann man davon ausgehen, dass für alle aiNodeAnim in einem aiAnimation::mChannels Array der Wert aller mNum...Keys identisch ist?

    D.h. wenn eine (ai)Animation z.B. 23 Keys/KeyFrames hat, dann sollte ja für alle Channels/aiNodeAnims je 23 Positionen, 23 Quaterions und 23 Scalings vorhanden sein?
    Oder, noch anders formuliert: Ein Member aiAnimation::mNumFrames anstelle der ganzen aiNodeAnim::mNum...Key Members würde doch eigentlich reichen, oder? ;-)
  • Wie ist ein Tick definiert? (1 Tick == 1 Keyframe ??)
Ganz herzlichen Dank im voraus,
und allen frohe Weihnachten! :-D

Re: Assimp: Gleiche Zahl von mNum*Keys für alle Channels?

Verfasst: 24.12.2010, 13:05
von Aramis
Moin Carsten, schoen dass du es nach ZFX geschafft hast :-)
Oder, noch anders formuliert: Ein Member aiAnimation::mNumFrames anstelle der ganzen aiNodeAnim::mNum...Key Members würde doch eigentlich reichen, oder?
Damit beantwortest du dir ja quasi schon die Frage – nein, es muss weder fuer jedes Keyframe Rotations–, Skalierungs– und Translationseintraege geben noch muss deren Anzahl bei allen Channels einer Animation gleich sein. Der Grund ist, dass nicht alle Dateiformate die Daten in dieser Form anliefern. Man koennte aber grundsaetzlich in Assimp einen Postprocessing–Step integrieren, der diesen Zustand durch Interpolation bzw. ggf. Extrapolation der vom Importer ausgespuckten Keyframes herstellt.
Wie ist ein Tick definiert? (1 Tick == 1 Keyframe ??)
Jeder aiVectorKey,aiQuatKey hat einen mTime–Member, der den zum Keyframe gehoerenden Zeitpunkt angibt, in Ticks. Mit aiAnimation::mTicksPerSecond kriegst du das ganze auf Sekunden skaliert.

Frohe Weihnachten :-)

Re: Assimp: Gleiche Zahl von mNum*Keys für alle Channels?

Verfasst: 24.12.2010, 16:25
von CarstenF
Hi Alexander,

vielen Dank für die schnelle Antwort!

Ich sehe gerade, dass der mTime Member leider vom Typ double ist (im Ggs. z.B. zu int)... D.h. um aus einem aiAnimation ein "Array" zu erzeugen, dass für jeden Node und jedes Keyframe die Pos, Quat und Scale enthält, also in etwa

Code: Alles auswählen

MyData SequenceData[NUM_NODES][NUM_KEYFRAMES]
(die Anzahl der Keyframes und deren Framerate ist separat zu bestimmen)

wobei MyData eine struct mit Members für Pos, Quat und Scale ist,
ist damit also nicht ganz einfach, vor allem wenn man das Minimum an Keyframes generieren möchte und beim Interpolieren nichts versehentlich abschneiden möchte (im Ggs. zum "Samplen" der Daten bei z.B. konstant 30 FPS - das wäre einfach, aber vom Ergebnis her nicht "äquivalent").

Werde also zwischen den Festivitäten wohl die Erstellung eines o.g. Arrays angehen, das die äquivalente Animation beschreibt
(wobei man schon jetzt sagen kann, dass der Datentyp double für mTime das Runden und damit die Festlegung einer höchst-FPS erfordert...).