Xan>> Приспичило мне тут кое-что повращать в пространстве.
Xan>> На бумажке записал, чтоб не забыть.
Б.г.> А что же не выложил эту бумажку сюда? Я бы почитал.
Как я понял, это полезно для стыковки на орбите, поворотах на большие углы с минимальной затратой топлива и прочих тонкостях.
Для "добраться до орбиты" это не имеет особого смысла.
Вот бумажка:
Quater-nion
2017.07.15
(
Заметки о вращении вектора кватернионом / Хабрахабр)
Берём вектор, который будет осью вращения (V_x, V_y, V_z).
Прикладываем к нему косинус половины угла, на который нужно повернуть w = cos(alpha / 2)
(W, V_x, V_y, V_z)
"Вектор должен быть нормализован" — ?
(0, 1, 0, 0) — разворот на 180 вокруг оси X.
(1, 0, 0, 0) — нулевой разворот.
(0.707; 0; 0.707; 0) — разворот вокруг Y на 90
===
Обратный (просто вектор направлен в противоположную сторону):
(W, -V_x, -V_y, -V_z)
Вообще-то он называется "сопряжённым".
===
Произведение кватернионов a и b:
res.w = a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z
res.x = a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y
res.y = a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x
res.z = a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w
===
Чтобы из поворачиваемого вектора сделать кватернион, надо к вектору приклеить W = 0
Умножение кватерниона a на вектор b (произведения с W.b = 0 опущены):
res.w = -a.x * b.x - a.y * b.y - a.z * b.z — эту строчку тоже ИНОГДА можно опустить.
res.x = a.w * b.x + a.y * b.z - a.z * b.y
res.y = a.w * b.y - a.x * b.z + a.z * b.x
res.z = a.w * b.z + a.x * b.y - a.y * b.x
===
Собсна, поворот:
Из вектора оси делаем квартернион.
Делаем обратный/сопряжённый.
Нормализуем их всех.
Делаем из поворачиваемого вектора квартернион.
Умножаем квартернион на вектор, потом умножаем на обратный.
Берём из результата только векторную часть — вектор повёрнут.
===
Ну и как это поможет?!
Но если ты знаешь секрет, поделись!