Я работал над этим время от времени. Простое решение, которое я использую сейчас, заключается в том, что вы используете точки, которые отслеживает скелет 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 встроенная функция для поворота вокруг произвольной оси. И если бы кто-то мог дважды проверить мою математику, я бы оценил это, я немного ржавый.