Почему привет тар. У меня есть 3D-модель, начальные углы которой по трем осям известны. Эти углы преобразуются в матрицу косинуса направления с использованием этого шаблона (информация находится здесь):
Новые значения углов получаются с течением времени, что соответствует обновлению ориентации модели. Чтобы учесть эти новые значения, я обновляю 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
XYZ
? - person John Alexiou   schedule 04.06.2012XYZ
(например,Rx*Ry*Rz
), и вы хотите разложить их на другую последовательность (например,Rx*Rz*Ry
), чтобы можно было вытянуть угол поворотаRy
? - person John Alexiou   schedule 04.06.2012