2012-01-18 3 views
0

Это, вероятно, более предметная область Math, но я надеюсь, что это достаточно просто, что некоторые другие разработчики могут знать.Создайте поворот вокруг переднего вектора

Ситуация: У меня есть самолет. Мне нужно Pitch, Yaw и Roll (поверните вокруг x, y, z) плоскость относительно ориентации плоскости.

Проблема: я могу заставить плоскость модели вращаться, однако вращение является глобальным для модели. Например, когда плоскость обращена вперед, применение CreateRotationZ() отлично работает, но если модель направлена ​​вверх (шаг 90 градусов), то применение CreateRotationZ() не вызывает скатывание плоскости (относительно ориентации плоскостей), это вызывает рывок.

+0

Вы знаете, что есть 'CreateRotationX' и' CreateRotationY'? Однако, когда плоскость находится под разными углами, будет немного сложнее математика. Но это будет комбинация из трех методов. – anothershrubery

+0

Да, CreateRotationZ (Yaw), CreateRotationX (Pitch) и CreateRotationY (Roll). Они не работают, хотя они вращаются независимо от ориентации на плоскости, как объяснено. я однако очень близко с помощью: Quaternion гниль = Quaternion.CreateFromAxisAngle (новый Vector3 (0, 0, 1), Ролл) * Quaternion.CreateFromAxisAngle (новый Vector3 (1, 0, 0), Pitch) * Quaternion .CreateFromAxisAngle (новый Vector3 (0,1,0), Yaw); Airframe.Orientation = Matrix.CreateFromQuaternion (rot); Если вы скатываете плоскость вправо, то правильно применяете высоту тона, но рыскание нет. Очень разочаровывает – Neovivacity

+0

Да, вам нужно будет осевать локально на ваш корабль, а не мировые топоры. Матрица вращения вашего корабля будет иметь доступ для доступа (вперед, назад, влево, вправо, вверх и вниз), вы можете вращаться вокруг этих векторов. –

ответ

1

Иметь позицию (Vector3) и вращение (Matrix) на ваш объект/Entity/корабль, а затем вы можете использовать следующий код, чтобы переместить или повернуть его в любом из своих локальных осей.

Например, вы хотите, чтобы катить самолет 45 градусов (это вращение вокруг переднего вектора вы спрашивали о):

Entity plane = new Entity(); 
plane.Roll(MathHelper.PiOver4); 

Или шаг рулонной самолет 90 градусов:

plane.Pitch(MathHelper.PiOver2);  

А вот пример кода

Если вы хотите плавное перемещение, вы захотите использовать их очень маленькими приращениями и использовать прошедшее время в своих расчетах для использования amount.

+0

+1 Это хороший совет.Единственный комментарий, который у меня есть, заключается в том, что всякий раз, когда вы используете CreateFromAxisAngle, ось (в вашем методе Pitch(), this.rotation.Right) должна быть нормализована непосредственно перед ее использованием. Если вы разрешите этот слайд, ошибка с плавающей точкой будет сложной (не накапливаться, а составной), и ваша матрица будет искажать относительно быстро. Однако, если вы нормализуете ось, ошибка будет просто накапливаться и потребует нескольких часов или дней, чтобы заметно исказить, что обычно приемлемо. –

+0

Векторы, которые XNA дает вам при доступе к классу Matrix, всегда нормализуются, я считаю, до тех пор, пока вы не вручную ввинчиваете в себя матрицу (измените ее значения вручную, а не используя предоставленные функции). Но вы поднимаете хороший момент, я думаю, что напишу единичный тест, который вращает Матрицу о разных осях, и после каждого поворота проверяет известные значения, это должно позволить мне увидеть, дрейфует или искажается. –

0

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

http://msdn.microsoft.com/en-us/library/bb975261.aspx

+0

Как бы вы это сделали, На боковой ноте я только что нашел ответ, поскольку, по-видимому, многие разработчики сталкиваются, пока не видят свет. Отслеживание глобальных поворотов - ПЛОХО. Просто обновляя ориентацию небольшими суммами, каждое обновление ХОРОШЕ. Полное решение для завтрашнего дня, когда мое 8-часовое ожидание отправки моего собственного ответа на мой вопрос вверх, lol. – Neovivacity

Смежные вопросы