Расчет скелета

Я пытаюсь реализовать скелетную анимацию на моем 3D Enigne (DX 11). Скиновая часть работает нормально, но с преобразованием костных матриц проблем не возникает. Я использую самодельный двоичный формат, который основан на SMD от Valve и уже преобразован в левостороннюю систему координат (Y-Z swap). Итак, мой код костей:

for(int i = 0; i < Model->numJoints; i++)
{
Bones[i].WorldPos = XMFLOAT3(0.0f, 0.0f, 0.0f);
Joint tmpJoint = Model->joints[i]; //bind-pose bone data (translation + orientation)

//Rotation matrix calculation
XMMATRIX RotX = XMMatrixRotationX(-tmpJoint.orientation.x);
XMMATRIX RotY = XMMatrixRotationY(-tmpJoint.orientation.y);
XMMATRIX RotZ = XMMatrixRotationZ(-tmpJoint.orientation.z);

//Rot * Translation
XMMATRIX Local =  RotX * RotY * RotZ * XMMatrixTranslation(tmpJoint.pos.x, tmpJoint.pos.y, tmpJoint.pos.z);

XMMATRIX tmp;
if (Model->Skeleton.parentID[i] != -1)
{
Bones[i].global = Local * Bones[Model->Skeleton.parentID[i]].global;
}
else
Bones[i].global = Local;

XMVECTOR temp;
XMStoreFloat3(&Bones[i].WorldPos, XMVector3Transform(temp, Bones[i].global));
}

//line between 2 connected bones (aka skeleton)
bonePoints[i] = Bones[i].WorldPos; //bone position in world
bonePoints[i+1] = Bones[Model->Skeleton.parentID[i]].WorldPos; //parent bone position in world

как вы можете видеть на рисунках ниже, расчетный скелет выглядит деформированным.
Я думаю, что-то не так с частью вычисления вращения, возможно, пропущена дополнительная транспонирование. Я пытался изменить порядок умножения матриц, но безуспешно.

Оригинальный скелет (3DS MAX)

Расчетный скелет (Двигатель)

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]