Как сгладить - игнорировать ось из матрицы косинуса направления?

Почему привет тар. У меня есть 3D-модель, начальные углы которой по трем осям известны. Эти углы преобразуются в матрицу косинуса направления с использованием этого шаблона (информация находится здесь):

DCM

Новые значения углов получаются с течением времени, что соответствует обновлению ориентации модели. Чтобы учесть эти новые значения, я обновляю DCM следующим образом:

newDCM = oldDCM * newanglesDCM

Чего я хочу и как я это делаю. Теперь самое сложное. На самом деле мне нужен только компонент Y матрицы вращения. Чтобы применить движение к моей модели, мне нужно, чтобы она была плоской, чтобы вектор движения не уходил ни в воздух, ни на землю. Для этого я просто вытягиваю 3 угла из матрицы поворота и создаю новый с углами [0 Y 0].

Проблема, с которой я столкнулся: когда к модели применяется вращение, DCM обновляется. При обнаружении движения я умножаю вектор движения [0 Yvalue 0] на DCM, который был сглажен (согласно предыдущему объяснению). Результат отличный, когда мгновенные вращения имеют нулевые или близкие к нулевым значения в компонентах X и Z. Но как только модель оказывается в ситуации, когда X и Z имеют значимые значения, «ориентация» движения модели неверна. Если я применяю повороты, которые заставляют его вернуться в ситуацию «только Y», он снова начинает быть хорошим.

Что может пойти не так: либо моя матрица косинуса направления неверна, либо техника, которую я использую для выравнивания матрицы, совершенно глупа.

Спасибо за вашу помощь, я был бы очень признателен, если бы вы могли помочь мне в этом! Грег.

EDIT: пример по запросу

Моя модель имеет 3 оси X, Y и Z. Это определяет соглашение XYZ, когда модель находится в состоянии покоя. В начальной точке t0 я знаю углы dAx, dAy и dAz, которые позволяют мне повернуть модель от ее исходной конфигурации к той, в которой она находится в момент t0. Если вас это смущает, скажем, модель покоится в момент времени t0, это не имеет значения.

Я создаю DCM, как показано на изображении (пусть это будет единичная матрица, если она началась в состоянии покоя).

Время от времени к модели применяются повороты. Эти вращения также состоят из dAx, dAy и dAz. Таким образом, я обновляю матрицу вращения (DCM), умножая старую на вновь сгенерированную: newDCM = oldDCM * newanglesDCM. Теперь предположим, что я хочу, чтобы модель перемещалась по сетке из одной точки в другую. Представьте, что сетка — это, например, улица. Независимо от того, ориентирована ли модель к небу, сбоку или перед ней, я хочу, чтобы движение было одинаковым: вдоль дороги, а не поднимаясь в воздух или ныряя в землю. Если бы я оставил матрицу вращения такой, какая она есть, применение поворота [0 Y 0] заставило бы ее пойти туда, куда я этого не хочу. Таким образом, я пытаюсь найти свою старую оригинальную раму XZ, выравнивая DCM. Затем у меня все еще есть компонент Y, поэтому я знаю, где на улице движется модель.

Представьте себе персонажа, голова которого является моделью и который ходит снаружи. Если он посмотрит в окно здания и пойдет, он не будет идти по воздуху прямо к окну — он пойдет к подножию здания. Это именно то, что я хочу сделать :D


person PeterGriffin    schedule 04.06.2012    source источник
comment
Это больше похоже на вопрос для math.stackexchange.com Некоторые случайные догадки: При обновлении DCM вы перемножаете матрицы? если да, то как насчет сохранения углов, а затем просто добавления поворота Y к предыдущим углам и восстановления матрицы. Вы считали в карданном замке? если проблема в том, что карданный замок (погуглите для информации), тогда вы можете использовать механизм вращения на основе кватерниона   -  person akaltar    schedule 04.06.2012
comment
Я действительно не понимаю, что вы пытаетесь сделать. Можете ли вы привести пример и описать ваше соглашение об осях XYZ?   -  person John Alexiou    schedule 04.06.2012
comment
Я предполагаю, что XYZ в матрице является произвольной осью вращения. это очень похоже на вращение вокруг произвольной оси.   -  person akaltar    schedule 04.06.2012
comment
@akaltar - Да, я умножаю матрицы, хотя на самом деле я не понимаю, что вы имеете в виду, добавляя поворот к углам. Следует избегать блокировки карданного подвеса с помощью DCM (поскольку в конце концов это должно быть одной из его основных целей).   -  person PeterGriffin    schedule 04.06.2012
comment
@ ja72 - Добавлен более подробный пример, дайте мне знать, если я все еще не уверен, чего я на самом деле хочу!   -  person PeterGriffin    schedule 04.06.2012
comment
Итак, у вас есть три последовательных поворота вокруг локальных осей XYZ (например, Rx*Ry*Rz), и вы хотите разложить их на другую последовательность (например, Rx*Rz*Ry), чтобы можно было вытянуть угол поворота Ry?   -  person John Alexiou    schedule 04.06.2012
comment
Я хочу вытащить угол поворота Ry, но после долгой последовательности обновлений матрицы. Я хочу принять во внимание все Rx, Ry и Rz, когда модель вращается, но когда мне нужно использовать эту матрицу для движения, мне нужно, чтобы значения Rx и Rz были нулевыми. По крайней мере, так я думал о решении проблемы.   -  person PeterGriffin    schedule 04.06.2012
comment
Также помните, что в DCM каждый столбец матрицы соответствует координатам локальной оси. Обычно первый столбец — это ось x и так далее.   -  person John Alexiou    schedule 04.06.2012
comment
Это связано? stackoverflow.com/questions/10971558/   -  person John Alexiou    schedule 11.06.2012


Ответы (1)


Что вам нужно сделать, это приравнять элементы двух матриц вращения

E_1 = Rx(dθx)Ry(dθy)Rz(dθz)

и

E_2 = Rx(dφx)Rz(dφz)Ry(dφy)

в поэлементной основе. Найдите два элемента, которые содержат только sin(dφy) и cos(dφy), и разделите их, чтобы получить tan(dφy)=... через dθx, dθy и dθz.

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

dφy=atan( tan(dθy)/cos(dθz) )
dφz=atan( (cos(dθy)*sin(dθz))/(cos(dθy)*cos(dθz)*cos(dφy)+sin(dθy)*sin(dφy)) )
dφx=atan( (cos(dθx)*sin(dθy)*sin(dθz)+sin(dθx)*cos(dθz))/(cos(dθx)*cos(dθz)- ...

Вы должны выработать свои собственные отношения, основанные на последовательностях, которые вы используете.

Примечание: когда dφy известно, вышеприведенное равенство E_1 = E_2 становится

Rx(dφx)Rz(dφz) = Rx(dθx)Ry(dθy)Rz(dθz)Ry(-dφy)

который решается для dφz, и тогда у вас есть

Rx(dφx) = Rx(dθx)Ry(dθy)Rz(dθz)Ry(-dφy)Rz(-dφz)

для dφx.

person John Alexiou    schedule 04.06.2012