К Computer Science имеет маленькое отношение, но я впихну тему сюда, так как она, в частности, про программирование.
Предыстория. Я пишу библиотеку для работы с воксельными октодеревьями и буду писать библиотеку для volumetric raycasting. Жидхаб, если кому интересно:
https://github.com/shamazmazum/voxvision. Так вот: для поворота вектора вокруг другого сейчас модно использовать кватернионы, так как 4 single floating point числа вмещаются в 1 XMM регистр. Общеизвестная формула для поворота вектора v вокруг p на угол 2 фи такая:
, где
,
; p,v - чисто "мнимые" кватернионы.
В интернете (тут:
http://mollyrocket.com/forums/viewtopic.php?t=833&sid=3a84e00a70ccb046cfc87ac39881a3d0) я нашел следующую формулу, которая, якобы, полный аналог того, что выше, но считается быстрее. Перепишу её тут с учетом определения q выше:
у меня векторное произведение, а
- скалярное
И вот тут или я что-то не понял, или формула вообще кривая. Вот мой вариант "контрдоказательства" (у них там доказательство есть, но пару моментов я не улавливаю):
Сначала подставим t в формулу:
Далее, возьмем v перпендикулярным p. Из формулы умножения чисто "мнимых" кватернионов
(а в нашем случае
) имеем:
или в силу ассоциативности умножения
или в силу
,
(напомню,
)
Так как
и
перпендикулярен
, то квадрат нормы
будет
Явно норма не сохраняется и формула фигня. Но может я где-то ошибся? Есть ли в самом деле формула поворота более оптимальная для расчетов (с использованием simd инструкций sse, к примеру), нежели классическая, что дана выше? Может даже кто-то сталкивался с той формулой на форуме?