КОЛЛАДА: Обратная позиция связывания в неправильном пространстве?

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

Формула, которую я использую для снятия шкур с моей сетки, проста:

weighted;
for (i = 0; i < joint_influences; i++)
{
    weighted += 
        joint[joint_index[i]]->parent->local_matrix * 
        joint[joint_index[i]]->local_matrix * 
        skin->inverse_bind_pose[joint_index[i]] * 
        position * 
        skin->weight[j];
}
position = weighted;

А что касается литературы, это правильная формула. Теперь COLLADA определяет два типа поворотов для суставов: локальный и глобальный. Вы должны объединить вращения вместе, чтобы получить локальное преобразование для соединения.

То, что документация COLLADA не различает, является локальной ротацией соединения и глобальной ротацией соединения. Но в большинстве моделей, которые я видел, у вращений может бытьrotate&nbsp;(глобальный) илиjointOrient&nbsp;(местный).

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

Это без использования глобальных вращений:

И это с глобальными вращениями:

На обоих скриншотах я рисую скелет, используя линии, но на первом он невидим, потому что соединения находятся внутри сетки. На втором скриншоте вершины повсюду!

Для сравнения вот что такое второй скриншотдолжен&nbsp;выглядит как:

Это трудно увидеть, но вы можете видеть, что суставы находятся в правильном положении на втором скриншоте.

Но теперь странная вещь. Если я игнорирую обратную позу связывания, указанную COLLADA, и вместо этого возьму обратное значение локального преобразования родительского соединения, умноженное на локальное преобразование соединения, я получу следующее:

На этом скриншоте я рисую линию от каждой вершины до соединений, которые имеют влияние. То, что я получаю позу связывания, не так странно, потому что формула теперь становится:

world_matrix * inverse_world_matrix * position * weight

Но это заставляет меня подозревать, что обратная поза связывания COLLADA находится не в том месте.

Итак, мой вопрос: в каком пространстве COLLADA определяет свою обратную позицию связывания? И как я могу преобразовать обратную позу связывания в нужное мне пространство?