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

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
CarstenF
Beiträge: 14
Registriert: 24.11.2010, 20:56
Kontaktdaten:

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

Beitrag 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
Viele Grüße,
Carsten

Cafu - die open-source Spiele- und Grafik-Engine für multiplayer, cross-platform, real-time 3D Action
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

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

Beitrag 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 :-)
CarstenF
Beiträge: 14
Registriert: 24.11.2010, 20:56
Kontaktdaten:

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

Beitrag 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...).
Viele Grüße,
Carsten

Cafu - die open-source Spiele- und Grafik-Engine für multiplayer, cross-platform, real-time 3D Action
Antworten