1

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

DCM

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

newDCM = oldDCM * newanglesDCM 

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

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

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

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

РЕДАКТИРОВАТЬ: Пример в соответствии с просьбой

Моя модель имеет 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

+1

Это больше похоже на вопрос math.stackexchange.com Некоторые случайные догадки: При обновлении DCM вы умножаете матрицы? если да, то и о хранении углов, а затем просто добавив поворот Y к предыдущим углам и восстановив матрицу. Вы помните, что в Gimbal lock? если проблема связана с тем, что gimbal lock (google it for info), то вы можете использовать механизм вращения на основе кватернионов – akaltar

+0

Я действительно не понимаю, что вы пытаетесь сделать. Можете ли вы привести пример и описать соглашение о символах 'XYZ'? – ja72

+0

Я предполагаю, что XYZ в матрице является суровой осью вращения. , что похоже на вращение вокруг суженной оси. – akaltar

ответ

0

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

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.