Зачем привет. У меня есть трехмерная модель, начальные углы которой вдоль ее оси 3 известны. Эти углы трансформируются в направлении косинус Matrix, используя этот шаблон (information found here):Как сгладить - игнорировать ось из направления Косинусная матрица?
новые углы величины получаются, как проходит время, соответствующее обновление ориентации модели. Для того, чтобы принять эти новые значения во внимание, я обновляю 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
Это больше похоже на вопрос math.stackexchange.com Некоторые случайные догадки: При обновлении DCM вы умножаете матрицы? если да, то и о хранении углов, а затем просто добавив поворот Y к предыдущим углам и восстановив матрицу. Вы помните, что в Gimbal lock? если проблема связана с тем, что gimbal lock (google it for info), то вы можете использовать механизм вращения на основе кватернионов – akaltar
Я действительно не понимаю, что вы пытаетесь сделать. Можете ли вы привести пример и описать соглашение о символах 'XYZ'? – ja72
Я предполагаю, что XYZ в матрице является суровой осью вращения. , что похоже на вращение вокруг суженной оси. – akaltar