у меня есть система координат, где ось Y вверх. Мне нужно преобразовать его в систему координат, где Z находится вверху. У меня есть повороты, хранящиеся в кватернионах, поэтому мой вопрос: если у меня есть кватернион X, Y, Z, могу ли я поменять Y на Z и получить результат, что Z на самом деле ВВЕРХ?
Могу ли я переключить X Y Z в кватернионе?
Ответы (4)
Просто поменять местами две оси в кватернионах? Нет, это не работает, потому что это переворачивает хиральность. Однако, если вы перевернете хиральность и отрицаете действительную часть кватерниона, вы вернетесь к исходной хиральности. В общем виде вы можете записать это как
Q'(Q, i'j'k') = εi'j'k' Qw_w + Qi_i + Q j_j + Qk_k
куда
является полностью антисимметричным тензором, известным как символ Леви-Чевита.
Это не должно быть сюрпризом, так как правила кватернионов i², j², k² также определяются одним и тем же полностью антисимметричным тензором.
Я адаптирую свой ответ из этого сообщения, так как тот, что здесь, был более старым и, вероятно, более общим.
Вероятно, лучше всего рассмотреть это в контексте того, как вы конвертируете угол и ось в кватернион. В Википедии можно прочитать, что вы описываете поворот на угол θ вокруг оси с единичным направлением вектор (x, y, z), используя
q = cos(θ/2) + sin(θ/2)(xi + yj + zk)
Ваш пост сообщает нам только Y ↦ Z, то есть старое направление Y является новым направлением Z. А остальные направления? Вы, вероятно, захотите оставить X ↦ X, но это по-прежнему оставляет нам две альтернативы.
- Либо вы используете Z ↦ Y. В этом случае вы переключаетесь между левой и правой системой координат, и преобразование по существу является отражением.
- Или вы используете Z ↦ −Y, тогда это просто поворот на 90° вокруг оси X. Ручность системы координат остается прежней.
Изменение хиральности
Сначала рассмотрим первый случай. Что изменение системы координат делает с вашим углом и осью? Что ж, координаты осей меняются так же, как и ваши точки, а угол меняет знак. Так что у тебя есть
cos(−θ/2) + sin(−θ/2)(xi + zj + yk)
По сравнению с предыдущим, действительная часть не меняется (поскольку cos(x)=cos(−x)) но мнимые части меняют свой знак, в дополнение к менять по порядку. Обобщая это, кватернион a + bi + cj + dk
, описывающий вращение в старой системе координат, будет преобразован в a − bi − dj − ck
в новой системе координат. Или в −a + bi + dj + ck
, которое является другим описанием того же вращения (поскольку оно изменяет θ на 360°, а θ/2 — на 180°).
Сохраненная хиральность
По сравнению с этим, второй случай Z ↦ −Y сохраняет знак θ, поэтому вам нужно только отрегулировать ось. Новая координата Z — это старая координата Y, а новая координата Y — это старая координата Z с инверсией. Таким образом, a + bi + cj + dk
преобразуется в a + bi − dj + ck
(или его отрицательное значение). Обратите внимание, что это просто умножение кватерниона на i
или −i
, в зависимости от того, на какую сторону вы его умножаете. Если вы хотите записать это как сопряжение, у вас есть θ = ± 45 °, поэтому вы получаете квадратные корни в кватернионе, выражающем изменение системы координат.
Попробуйте: вращение кватерниона = новый кватернион (X, Z, Y, -W); //мне пришлось поменять местами Z и Y из-за
Нет, вы не можете поменять местами y и z — она превратится в левостороннюю систему координат, если она была правосторонней (и наоборот).
Однако вы можете сделать следующую замену:
newX = oldZ
newY = oldX
newZ = oldY
Я подозреваю, что вам на самом деле нужно простое вращение вокруг оси x. Если именно поэтому вы хотите поменять местами y и z, вместо этого вам следует применить поворот на -90 градусов вокруг оси +x (при условии, что у вас правосторонняя система координат).