сопоставление скелетных данных Kinect с моделью .fbx в XNA - PullRequest
2 голосов
/ 26 декабря 2011

Мой вопрос касается школьного проекта, над которым я работаю.Он включает в себя отображение 3D-моделей одежды (например, джинсов) на скелете, сгенерированном моей камерой Kinect.

Пример можно найти здесь: http://www.youtube.com/watch?v=p70eDrvy-uM.

Я искална эту тему и нашел несколько связанных тем, таких как: http://forums.create.msdn.com/forums/t/93396.aspx - этот вопрос демонстрирует способ использования брекеля для захвата движения.Тем не менее, я должен представить это в XNA.

Я считаю, что ответ лежит в скелет данных 3D-модели (должным образом экспортируется в виде файла .FBX).Есть ли способ выровнять или сопоставить этот скелет со скелетом, который генерирует камера Kinect?

Заранее спасибо!

Редактировать: Я добился определенного прогресса.Я играл с некоторыми различными моделями, пытаясь переместить некоторые кости вверх (очень простое использование CreateTranslation с плавающей точкой, которая рассчитывается по истечении времени игры), и это работает, если я выбираю rootbone, но это не работаетна некоторых костях (например, на руке или на руке).Если я отслеживаю все свойства Transform этой кости, включая свойства X, Y и Z, то я вижу, что что-то движется. Однако выбранные кости остаются на своем месте.У кого-нибудь есть мысли, возможно ..?

Ответы [ 4 ]

7 голосов
/ 03 января 2012

Если вам интересно, то вы найдете демо здесь . Он имеет исходный код для использования захвата движения в реальном времени с использованием Kinect и XNA.

3 голосов
/ 11 января 2012

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

Весёлая часть:

Kinect отслеживает положение скелетного сустава в пространстве скелета от -1 до 1, в то время как ваши модели нуждаются в поворотах в пространстве модели. Оба они обеспечивают дочернее положение или вращение относительно их родительской кости в иерархии. Также повороты, необходимые для модели .fbx, происходят вокруг произвольной оси.

Вам понадобится перейти от модели .fbx в ее позе связывания к позе, представленной данными kinect. Чтобы получить это, вы можете выполнить некоторую векторную математику, чтобы найти вращение родительского соединения вокруг произвольной оси и повернуть его соответствующим образом, а затем двигаться вниз по цепочке скелета.

Скажем, у вас есть плечо, которое мы назовем точкой a, и колено, которое мы можем назвать точкой b в позе связывания модели fbx. У нас будет точка a 'и b' на скелете. Так что для модели связывания у нас будет вектор V от плеча до локтя.

V = b - a

Модель скелета также будет иметь вектор V '

V '= b' - a '

Таким образом, ось вращения для плеча будет

Vhat = V, перекрестное произведение V '

Угол поворота плеча вокруг Vhat

Тета = ((V точечное произведение V ') / величина (V)) * величина (V')

Вам захочется повернуть плечевой сустав на модели fbx тэтой вокруг Vhat.

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

Также я не уверен, есть ли в XNA встроенная функция для поворота вокруг произвольной оси. И если бы кто-то мог дважды проверить мою математику, я бы оценил это, я немного ржавый.

0 голосов
/ 23 января 2012

В итоге я остановился на варианте Digital Runes (с демонстрацией Kinect), которая была почти идеальной, если не считать нескольких проблем, которые я не смог решить.

Но поскольку мне пришлось поторопиться в школу, мы решили полностью перевернуть проект, и наше новое решение не включало Kinect. Тем не менее, примеры цифровых рун очень помогли.

0 голосов
/ 27 декабря 2011

Kinect SDK доставляет только точки частей тела, такие как положение головы или положение правой руки. Отдельно вы также можете прочитать глубинный поток от датчика Kinect.

Но в настоящее время Kinect не генерирует 3D-модель тела. Вы должны сделать это самостоятельно.

...