Вычисление кватернионов/поворотов из 2 точек в трехмерном пространстве

У меня есть приложение kinect, которое отправляет мне положение суставов в виде точек в трехмерном пространстве. Порядок соединений показан на картинке ниже. введите здесь описание изображения

Теперь я хочу переместить их в другое приложение, которое использует систему координат COLLADA. введите здесь описание изображения

Мои мысли: если я хочу повернуть плечо, мне нужен вектор (Rshoulder - Rebow) и сохранить его как VX, а затем мне нужно найти 2 ортогональных вектора как Y и Z, а затем вычислить кватернион. Я могу быть совершенно неправ, но это просто мое мышление на данный момент..

В двух словах: как мне успешно вычислить вращение с двумя заданными точками в системе Y UP в вращение с системой Z up?


person Amazonasmann    schedule 26.04.2013    source источник


Ответы (1)


Вы должны сначала преобразовать точки во внутреннюю систему координат, прежде чем делать что-либо еще. Поменять местами оси Y и Z тривиально — просто поменяйте местами координаты y и z. Если вы хотите делать все с цепочками матриц, вы можете сделать матрицу, которая сделает это за вас:

swapYZ_xyz = [ 1 0 0 ]    or,   swapYZ_xyzw = [ 1 0 0 0 ]
             [ 0 0 1 ]                        [ 0 0 1 0 ]
             [ 0 1 0 ]                        [ 0 1 0 0 ]
                                              [ 0 0 0 1 ]

Обратите внимание, что это преобразование является не вращением: это отражение. Здесь вам нужно отражение -- нет поворота, который может сопоставить левостороннюю систему координат с правосторонней (как требует ваш вопрос), в то время как отражения < em>всегда конвертировать между левшой и правшой.

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


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

Во-первых, без дополнительной информации вращение каждого сустава не определено четко. Чтобы увидеть это, предположим, что у вас есть набор вращений, соответствующий заданному набору положений суставов: затем вы можете повернуть любую «кость» между двумя суставами под любым углом, изменяя вращение в обоих суставах, не меняя местоположения суставов. Чтобы устранить эту избыточность, вам нужно указать дополнительные ограничения в некоторых суставах, то есть вам нужно закодировать свои знания о том, как (например) локти могут вращаться.

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

Лучшим общим решением может быть создание математической модели вашей позы и запуск фильтра Калмана для интегрировать (зашумленные) входные данные. Это важное мероприятие, но оно может позволить вам надежно справляться с зашумленными данными и временными неоднозначностями.

person comingstorm    schedule 26.04.2013