Edit (Исходный пост ниже):
Итак, я придумал следующий код. Я могу экспортировать сетку, структуру костей и анимацию. Я могу оживить простой скелет. Но по какой-то причине, если я анимирую более одной кости, что-то пойдет не так, и рука будет двигаться не в том направлении.
Мой код cpp находится здесь: http://kyuu.co.uk/so/main.cpp
Мой код экспорта Python находится здесь: http://kyuu.co.uk/ so / test.py
Не могли бы вы сказать мне, что я делаю не так? Думаю, это может быть связано с рулетом из кости в блендере. Я видел много сообщений об этом.
Спасибо.
(Исходное сообщение:)
Я работаю над этой проблемой некоторое время и до сих пор не могу понять, что мне не хватает, поэтому я надеюсь, что кто-нибудь kind мне поможет: 3
Верно, у меня в приложении есть что-то вроде следующего кода:
class bone {
bone * child;
Eigen::Matrix4f local_bind_pose; // this i read from a file
Eigen::Matrix4f final_skinning_matrix; // i then transform each vertex by this matrix
// temporary variables
Eigen::Matrix4f inv_bind_pose;
Eigen::Matrix4f world_bind_pose;
}
То есть простая иерархия костей.
Я считаю, что могу решить inv_bind_pose
с помощью:
world_bind_pose = bone.parent.world_bind_pose * local_bind_pose
inv_bind_pose = world_bind_pose.inverse()
Я знаю, что bind_pose
должен относиться к родительской кости.
Я знаю, что блендер z = up, и я использую y = up.
Но я не могу экспортировать эту информацию из блендера. Я использую версию 2.56.3.
Будет ли поворотная часть матрицы bone.matrix_local
? Будет ли часть перевода bone.tail () - bone.head ()
?
А как насчет кости? Похоже, это действительно влияет на результат.
Некоторые ссылки:
http://www.gamedev.net/topic/571044-skeletal-animation-bonespace
http://www.blender.org/development/release-logs/blender-240/how-armatures-work
Большое спасибо!