Wir sind kurz vor dem Abschluss des Projekts, aber kurz vor der Implementierung des Animationssystems.
Unser Kunde entschied sich für "Knochenanimation" - das heißt, ich sollte jede Transformationsmatrix (Matrix4x4 Rotation + Translation) für jeden Frame und für jeden Knochen, den dieses animierte Objekt hat, exportieren.
Objekte in unserem Spiel werden mit 3DS Max Physique Modifier animiert, sodass wir Knochen- / Gewichtungsdaten pro Scheitelpunkt haben. Aber ich werde die Dinge hier vereinfachen, um ein wenig Licht in dieses Thema zu bringen.
Ich möchte diesen Beitrag in 2 Punkte aufteilen, wobei:
Exportieren von Bones-Matrizen für jeden Frame
- behandelt die richtige Methode zum Exportieren der Knochenpositionen für spätere Animationszwecke, bei denen ich jeden Scheitelpunkt, der von diesem Knochen beeinflusst wird, in Frame X in die Knochenposition "bewegen" und "drehen" muss.
Berechnung der endgültigen Scheitelpunktposition
- behandelt die richtigen Matrizenoperationen, um die neue Scheitelpunktposition gemäß der Knochentransformation in Frame X zu berechnen.
1. EXPORTIEREN VON KNOCHENMATRIZEN FÜR JEDEN RAHMEN
Verstehe ich richtig, dass ich beim Exportieren des animierten Objekts Folgendes tun sollte:
Nehmen Sie die BONE-Transformationsmatrix in Frame 0 und invertieren Sie diese Matrix
Holen Sie sich die BONE-Transformationsmatrix bei FRAMEx
Multiplizieren Sie 1 * 2, um den Transformationsoffset des BONE bei FRAMEx zu erhalten
[pseudocode]
// Animation export
// For each frame, export bone transformation offset
for(int iFrame = 0; iFrame < vFrames.size(); iFrame++)
{
// For every bone in the object
for(int iBone = 0; iBone < vBones.size(); iBone++)
{
// Grab transformation matrix for this bone at frame 0 and inverse it
Matrix3 matBoneMatrixAtStart = pNode->GetObjectTMAfterWSM( 0 );
matBoneMatrixAtStart.Inverse();
// Grab transformation matrix for this bone at frame iFrame
Matrix3 matBoneMatrixAtCurrentFrame = pNode->GetObjectTMAfterWSM( iFrame );
// Multiply Inversed Transformation Matrix of this bone at frame 0 - with
// current frame transformation matrix
Matrix3 matBoneTransformationOffset = matBoneMatrixAtStart
* matBoneMatrixAtCurrentFrame ;
// Save matBoneTransformationOffset - vertex will be multiplied by this
// matrix for animation purposes
fwrite(.....)
}
}
[/pseudocode]
Wird das reichen? Oder fehlt mir hier etwas?
2. BERECHNUNG NEUER VERTICES-POSITIONEN (ENDGÜLTIGE VERTEX-POSITION BEI RAHMEN X)
Später beim Rendern werden Objektscheitelpunkte mit der exportierten Knochentransformationsmatrix für den tatsächlichen Animationsrahmen multipliziert und dann mit dieser gesamten Modelltransformationsmatrix multipliziert, um das Objekt an der richtigen Position innerhalb der Ebene zu platzieren:
[pseudocode]
Update()
{
// The model transformation matrix describing the position of
// the model in the level
matModelTransformationMatrix
// Calculate new vertex position according to it's bone transformation offset
NewVertexPosition = (OriginalVertexPosition * matBoneTransformationOffset[iFrame])
* matModelTransformationMatrix;
// Increment the frame for testing purposes
iFrame++;
}
[/pseudocode]
Denke ich hier richtig? Wenn Sie also einen Knochentransformationsversatz für Frame X haben und jeden von diesem Knochen betroffenen Scheitelpunkt mit diesem Versatz multiplizieren, sollte dies zu einem Scheitelpunkt führen, der genau wie dieser Knochen transformiert ist, oder?