Объект кватерниона параллелен или перпендикулярен всем базисным векторам - PullRequest
0 голосов
/ 20 августа 2010

Учитывая кватернион объекта q и базисные векторы vx, vy, vz, образующие трехмерное пространство, как я могу проверить, является ли кватернион параллельным или перпендикулярным всем базисным векторам?

Например, у меня есть базисные векторы:

vx = (0.447410, 0, -0.894329)
vy = (0, 1, 0)
vz = (0.894329, 0, 0.447410)

и кватернион

q(w,x,y,z) = (-0.973224, 0, -0.229860, 0)

Я знаю, что кватернион перпендикулярен или параллелен (или антипараллелен) всем базисным векторам, но как я могу на самом деле рассчитать его?

Другой пример,

q(w,x,y,z) = (0.823991, 0, 0.566602, 0)

Это НЕ перпендикулярно или параллельно (или антипараллельно) всем базисным векторам.

Ответы [ 2 ]

1 голос
/ 20 августа 2010

Я решил это путем преобразования кватерниона в матрицу.Извлечение базисных векторов из матрицы и вычисление точечных произведений между матричными базисными векторами и исходными базисными векторами.Если они все равны 0 или 1, кватернион параллелен или перпендикулярен исходным базисным векторам.

1 голос
/ 20 августа 2010

Примечание о терминологии: Строго говоря, не совсем понятно, что вы подразумеваете под "кватернионом, перпендикулярным одному из базисных векторов" ... кватернионы и трехмерные векторы не сравнимы таким образом. Однако кватернионы можно рассматривать как представление оси вращения (трехмерного вектора) и скалярного угла поворота, поэтому я предполагаю, что вы хотите знать, ось вращения перпендикулярна одному из базисных векторов.

Для единичных кватернионов, рассматриваемых как трехмерные вращения, существует соглашение, что для q = (w, x, y, z), x, y и z образуют трехмерный вектор (назовем его qv) вдоль оси вращения, а w = cos (alpha / 2) представляет угол поворота альфа.

В вашем случае qv = (x, y, z) = (0, -0,229860, 0). vx, vy и vz - все единичные векторы, так что легче увидеть, что происходит, если вы нормализуете qv, чтобы он также был единичным вектором. Разделите его на длину (0,229860), чтобы получить qv_unit = (0, -1, 0). Найти углы между qv_unit и vx, vy и vz, используйте произведение точек:

Для единичных векторов v1 = (a, b, c) и v2 = (d, e, f):

cos (theta) = v1 точка v2 = ad + be + cf

qv_unit dot vx = 0 * .447410 + -1 * 0 + 0 * -894329 = 0 = cos (theta), поэтому theta = pi / 2, и мы видим, что qv_unit перпендикулярно vx.

qv_unit точка vy = 0 * 0 + -1 * 1 + 0 * 0 = -1 = cos (theta), поэтому theta = pi и qv_unit антипараллельно vy.

qv_unit dot vz = 0 * .894329 + -1 * 0 + 0 * .447410 = 0 = cos (theta), поэтому theta = pi / 2, и qv_unit также перпендикулярно к vz.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...