К Computer Science имеет маленькое отношение, но я впихну тему сюда, так как она, в частности, про программирование.
Предыстория. Я пишу библиотеку для работы с воксельными октодеревьями и буду писать библиотеку для volumetric raycasting. Жидхаб, если кому интересно:
https://github.com/shamazmazum/voxvision. Так вот: для поворота вектора вокруг другого сейчас модно использовать кватернионы, так как 4 single floating point числа вмещаются в 1 XMM регистр. Общеизвестная формула для поворота вектора v вокруг p на угол 2 фи такая:
![$v^\prime = qvq^{-1}$ $v^\prime = qvq^{-1}$](https://dxdy-02.korotkov.co.uk/f/9/9/e/99ef0684c2da762386d3033e8b4ae20782.png)
, где
![$q=\cos\varphi + p\sin \varphi$ $q=\cos\varphi + p\sin \varphi$](https://dxdy-04.korotkov.co.uk/f/f/e/5/fe5e4f07bad7a3572b9207e47bb6438a82.png)
,
![$\lVert p\rVert = 1$ $\lVert p\rVert = 1$](https://dxdy-01.korotkov.co.uk/f/8/b/d/8bda915909ae67ff9bc0feb386dc163d82.png)
; p,v - чисто "мнимые" кватернионы.
В интернете (тут:
http://mollyrocket.com/forums/viewtopic.php?t=833&sid=3a84e00a70ccb046cfc87ac39881a3d0) я нашел следующую формулу, которая, якобы, полный аналог того, что выше, но считается быстрее. Перепишу её тут с учетом определения q выше:
![$a \times b$ $a \times b$](https://dxdy-02.korotkov.co.uk/f/d/5/e/d5e22b3464dcf9d27ed4709735ecd05682.png)
у меня векторное произведение, а
![$(a,b)$ $(a,b)$](https://dxdy-01.korotkov.co.uk/f/0/c/d/0cd27d4708cd735f6ea469dc3debed0e82.png)
- скалярное
![$t = 2 \sin \varphi \; p \times v$ $t = 2 \sin \varphi \; p \times v$](https://dxdy-04.korotkov.co.uk/f/3/a/2/3a2230b103e9c5eda6404a1e229f6b1982.png)
И вот тут или я что-то не понял, или формула вообще кривая. Вот мой вариант "контрдоказательства" (у них там доказательство есть, но пару моментов я не улавливаю):
Сначала подставим t в формулу:
![$v^\prime = v + 2 \cos \varphi \sin \varphi \; p \times v + 2 \sin^2 \varphi \; p \times (p \times v)$ $v^\prime = v + 2 \cos \varphi \sin \varphi \; p \times v + 2 \sin^2 \varphi \; p \times (p \times v)$](https://dxdy-04.korotkov.co.uk/f/b/a/6/ba6eb90aaa646dc640b9a65cb338c89482.png)
Далее, возьмем v перпендикулярным p. Из формулы умножения чисто "мнимых" кватернионов
![$pv = p \times v - (p, v)$ $pv = p \times v - (p, v)$](https://dxdy-02.korotkov.co.uk/f/5/c/a/5cab29f64c1417b329c06298bddf264082.png)
(а в нашем случае
![$pv = p \times v$ $pv = p \times v$](https://dxdy-03.korotkov.co.uk/f/a/7/d/a7d4887f09c34cf27d42d8190717c7df82.png)
) имеем:
![$v^\prime = v + 2 \cos \varphi \sin \varphi \; p \times v + 2 \sin^2 \varphi \; p (pv)$ $v^\prime = v + 2 \cos \varphi \sin \varphi \; p \times v + 2 \sin^2 \varphi \; p (pv)$](https://dxdy-04.korotkov.co.uk/f/f/6/1/f61e9e6d883d57cfdbf307cf255cbc4b82.png)
или в силу ассоциативности умножения
![$v^\prime = v + 2 \cos \varphi \sin \varphi \; p \times v + 2 \sin^2 \varphi \; (pp)v$ $v^\prime = v + 2 \cos \varphi \sin \varphi \; p \times v + 2 \sin^2 \varphi \; (pp)v$](https://dxdy-02.korotkov.co.uk/f/1/e/f/1ef9f615f9e38c90f21440a1a371d95182.png)
или в силу
![$p \times p = 0$ $p \times p = 0$](https://dxdy-03.korotkov.co.uk/f/6/6/e/66e984b8190a41b63fcb351e838b22ee82.png)
,
![$pp = -(p,p) = -1$ $pp = -(p,p) = -1$](https://dxdy-04.korotkov.co.uk/f/f/4/9/f49201702dfcf8d70b7001145d79664082.png)
(напомню,
![$\lVert p \rVert = 1$ $\lVert p \rVert = 1$](https://dxdy-03.korotkov.co.uk/f/a/3/3/a332ffb3e73648391fc93aa13e7eb06482.png)
)
![$v^\prime = v + 2 \cos \varphi \sin \varphi \; p \times v - 2 \sin^2 \varphi \; v$ $v^\prime = v + 2 \cos \varphi \sin \varphi \; p \times v - 2 \sin^2 \varphi \; v$](https://dxdy-03.korotkov.co.uk/f/e/3/a/e3a4f65971bb76f5b390d1285663094a82.png)
![$v^\prime = 2 \cos \varphi \sin \varphi \; p \times v + (1 - 2 \sin^2 \varphi)v$ $v^\prime = 2 \cos \varphi \sin \varphi \; p \times v + (1 - 2 \sin^2 \varphi)v$](https://dxdy-02.korotkov.co.uk/f/1/e/4/1e42c184b45b3ee0151040689194980082.png)
Так как
![$(pv, pv) = (p,p)(v,v) = (v,v)$ $(pv, pv) = (p,p)(v,v) = (v,v)$](https://dxdy-01.korotkov.co.uk/f/c/4/1/c41cbb9504304e7c6ef9ebe36112bd4282.png)
и
![$pv = p \times v$ $pv = p \times v$](https://dxdy-03.korotkov.co.uk/f/a/7/d/a7d4887f09c34cf27d42d8190717c7df82.png)
перпендикулярен
![$v$ $v$](https://dxdy-03.korotkov.co.uk/f/6/c/4/6c4adbc36120d62b98deef2a20d5d30382.png)
, то квадрат нормы
![$v^\prime$ $v^\prime$](https://dxdy-01.korotkov.co.uk/f/c/4/3/c437fc68c2fba8d677c244cb41f1b96582.png)
будет
![$(v^\prime,v^\prime) = (4 \cos^2 \varphi \sin^2 \varphi + (1-2\sin^2 \varphi)^2)(v,v)$ $(v^\prime,v^\prime) = (4 \cos^2 \varphi \sin^2 \varphi + (1-2\sin^2 \varphi)^2)(v,v)$](https://dxdy-04.korotkov.co.uk/f/7/d/4/7d48ac692b7338128769114b561f77d882.png)
Явно норма не сохраняется и формула фигня. Но может я где-то ошибся? Есть ли в самом деле формула поворота более оптимальная для расчетов (с использованием simd инструкций sse, к примеру), нежели классическая, что дана выше? Может даже кто-то сталкивался с той формулой на форуме?