Долгота / Широта в кватернион - PullRequest
5 голосов
/ 25 марта 2011

У меня есть долгота и широта, и я хочу преобразовать это в кватернион, и мне интересно, как я могу это сделать? Я хочу использовать это, потому что у меня есть приложение, которое проецирует землю на сферу, и я хочу вращаться из одного места в другое.

Лучший!

Ответы [ 3 ]

2 голосов
/ 14 ноября 2017

Есть способ сделать это без использования матриц или векторов, аналогично этой тупой реализации . Мы можем думать о долготе / широте как о двух кватернионных вращениях, составленных вместе.

Давайте работать с правосторонней системой координат Z-up. Назовем долготу φ и широту θ, а точку, представленную двумя, как (φ, θ). Для визуализации красная ось соответствует X, зеленая - Y, а синяя - Z.

Мы хотим найти кватернион, представляющий вращение от (0, 0) красного цвета до ( a , b ), зеленым цветом:

Sphere with origin and destination points

Мы можем представить это вращение как комбинацию сначала продольного вращения, затем продольного вращения, вот так:

First rotation Second rotation

Сначала мы повернули на a вдоль оси Z, что преобразует оси X и Y. Затем мы повернулись на b вдоль новой локальной оси Y. Таким образом, мы знаем два набора информации оси / угла для этого вращения.

К счастью, преобразование оси / угла в кватернионы уже известно. Для заданного угла α и вектора оси ω результирующий кватернион равен:

(cos(α/2), ω.x*sin(α/2), ω.y*sin(α/2), ω.z*sin(α/2))

Итак, первое вращение представлено вращением a градусов по мировой (0, 0, 1) оси, что дает нам:

q1 = (cos(a/2), 0, 0, sin(a/2))

Второе вращение представлено поворотом b градусов вдоль преобразованной / локальной (0, 1, 0) оси, давая нам:

q2 = (cos(b/2), 0, sin(b/2), 0)

Мы можем умножить эти два кватерниона, чтобы получить один кватернион, представляющий это сложное вращение от (0, 0) до ( a , b ). Формула для умножения кватернионов немного длинна, но вы можете найти ее здесь . Результат:

q2*q1 = (cos(a/2)cos(b/2), -sin(a/2)sin(b/2), cos(a/2)sin(b/2), sin(a/2)cos(b/2))

Не то, чтобы это много значило, но мы можем подтвердить, что эта формула такая же, как и в ошеломленной реализации, упомянутой ранее.

Дж. Купер упомянул замечательный момент, что в этом случае все еще остается одна степень свободы вдоль оси X. Если θ остается в пределах ± 90 градусов, мы можем представить, что ось Z всегда направлена ​​вверх. Это имеет эффект ограничения вращения оси X и, надеюсь, то, что вы хотите.

Надеюсь, это поможет!


edit: Обратите внимание, что это по сути то же самое, что и работа с двумя углами Эйлера. Таким образом, чтобы отменить это преобразование, вы можете использовать любое преобразование кватерниона в угол Эйлера, при условии, что порядок вращения одинаков.

1 голос
/ 06 мая 2011

Широта и долгота не достаточны для описания кватерниона.Широта и долгота могут описать точку на поверхности трехмерной сферы.Допустим, это та точка, чьи нормальные точки направлены прямо через экран.У вас все еще есть степень свободы.Сфера может вращаться вокруг вектора нормали точки, указанной в значении lat-lon.Если вам нужен кватернион, представляющий ориентацию сферы, вам нужно полностью указать вращение.

Итак, допустим, вы хотите, чтобы северный полюс сферы был направлен вверх.,Если северный полюс выровнен с осью + z объекта, а 'вверх' на экране выровнен с осью + y в мире, а затем вы хотите повернуть сферу так, чтобыточка R на поверхности сферы направлена ​​прямо на экран (где R находится с использованием лат-лон к евклидову, как вы упоминали в своем комментарии), затем вы создаетеВращение матрицы осуществляется следующим образом.

Вы хотите, чтобы объект R совпал с мировой + z (при условии, что OpenGL-подобна системе координат вида) и вы хотите, чтобы объект + z для выравнивания с миром + y (как можно ближе).Нам нужна третья ось;поэтому мы нормализуем R и затем находим: P = crossP ([0 0 1] ^ T, R) .Мы нормализуем P и затем применяем ортогональность ко второй оси: Q = crossP (R, P) .Наконец, нормализуйте Q .Теперь у нас есть 3 ортогональных вектора P, Q, R , которые мы хотим выровнять с миром x, y, z соответственно.

Я предполагаю, что P, Q, и R являются векторами столбцов;поэтому для создания матрицы преобразования мы просто соединяем их вместе: M = [PQR] .Теперь M - это матрица, которая преобразует точку в мировых координатах в координаты объекта.Чтобы пойти в противоположном направлении, мы находим обратное значение M .К счастью, когда столбцы матрицы ортонормированы, обратное значение совпадает с транспонированием.Таким образом, мы получаем:

             [ P^T ]
M^-1 = M^T = [ Q^T ]
             [ R^T ]

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

1 голос
/ 25 марта 2011

Может быть, вы могли бы посмотреть, как библиотека Boost C ++ реализует это.(или, возможно, даже используя его) http://www.boost.org/doc/libs/1_46_0/libs/math/doc/quaternion/html/boost_quaternions/quaternions/create.html

Долгота и широта в значительной степени аналогичны углам азимута (тета - [0, 2 * PI]) и наклона (rho? [0, PI])сферические координаты (радиус r = 1 для поверхности).В ссылке, которую я разместил, функция Boost имеет функцию от сферического до кватерниона.

...