Как преобразовать последовательности 3D-поз в формат файла bvh?

Я новичок в программном обеспечении для анимации и рендеринга, поэтому, пожалуйста, дайте мне знать, если мне нужно предоставить дополнительную информацию об этом. У меня есть последовательность трехмерных положений человеческих суставов (в основном данные мокапа), представляющих различные виды ходьбы. Мне удалось визуализировать последовательность с помощью Python, как я показал в этом видео. Все данные, которые у меня есть, представляют собой массив размером TxJx3, где T - количество кадров, J - количество стыков (21 в моем случае), а 3 - это 3 значения координат. Итак, мой вопрос: как мне преобразовать эти 3D-позиции в файл BVH, который я могу загрузить в блендер? Или преобразовать их в любой другой формат, чтобы я мог загрузить эти данные в блендер?

1 ответ

Решение

Хорошо, нашел решение сам. Публикация здесь на случай, если кому-то это пригодится. Пожалуйста, извините за отсутствие рендеринга LaTeX, очевидно, переполнение стека не поддерживает его (пока), и я слишком новичок здесь, чтобы иметь возможность прикреплять изображения.

Итак, в формате BVH между суставами сохраняется следующая взаимосвязь:

$$pos_j = R_{P(j)} offset_j + pos_ {P(j)} $$

где $pos_j$ указывает трехмерную позицию соединения $j$, $P(j)$ возвращает родительский объект соединения $ j $ в любом DAG, в котором моделируются позиции (обычно DAG начинается с корня и указывает на конец - эффекторы) $offset_j$ указывает смещение сустава $ j $ относительно его родительского $P(j)$ (также известного как соединительная конечность), а $R_{P(j)}$ - это трехмерное вращение, которое определяет, сколько должно $ offset_j $ можно повернуть из исходной позы (обычно Т-позы). В формате BVH для каждого родителя $ P(j) $ нам нужно сохранить $R_{P(j)}^{-1}R_j$.

Основная проблема, с которой я тогда столкнулась, заключалась в работе с суставами, у которых было несколько детей, например, с корневым суставом, который связан с обеими ногами, а также с позвоночником. В конце концов я наткнулся на это репо и покопался в их функцияхforward_kinematics внутри skeleton.py, понял что делать. По сути, для суставов с несколькими дочерними элементами мне приходилось делать копии с $offset=0$ и назначать их в качестве родителей соответствующих цепочек. Таким образом, я сделал 3 копии корня: одна стала родительской для цепи левой ноги, одна - для цепи правой ноги и одна - для позвоночника. То же самое и с другими родителями с несколькими детьми. И да, визуализация отлично работает!

Другие вопросы по тегам