2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Интересная формула для поворота одного вектора вокруг другог
Сообщение12.11.2013, 17:55 


25/10/10
14
К Computer Science имеет маленькое отношение, но я впихну тему сюда, так как она, в частности, про программирование.

Предыстория. Я пишу библиотеку для работы с воксельными октодеревьями и буду писать библиотеку для volumetric raycasting. Жидхаб, если кому интересно: https://github.com/shamazmazum/voxvision. Так вот: для поворота вектора вокруг другого сейчас модно использовать кватернионы, так как 4 single floating point числа вмещаются в 1 XMM регистр. Общеизвестная формула для поворота вектора v вокруг p на угол 2 фи такая:

$v^\prime = qvq^{-1}$, где $q=\cos\varphi + p\sin \varphi$, $\lVert p\rVert = 1$; p,v - чисто "мнимые" кватернионы.

В интернете (тут: http://mollyrocket.com/forums/viewtopic.php?t=833&sid=3a84e00a70ccb046cfc87ac39881a3d0) я нашел следующую формулу, которая, якобы, полный аналог того, что выше, но считается быстрее. Перепишу её тут с учетом определения q выше:

$a \times b$ у меня векторное произведение, а $(a,b)$ - скалярное

$t = 2  \sin \varphi \; p \times v$
$v^\prime = v + \cos \varphi t + \sin \varphi \; p \times t$

И вот тут или я что-то не понял, или формула вообще кривая. Вот мой вариант "контрдоказательства" (у них там доказательство есть, но пару моментов я не улавливаю):

Сначала подставим t в формулу:
$v^\prime = v + 2 \cos \varphi \sin \varphi \; p \times v + 2 \sin^2 \varphi \; p \times (p \times v)$
Далее, возьмем v перпендикулярным p. Из формулы умножения чисто "мнимых" кватернионов $pv = p \times v - (p, v)$ (а в нашем случае $pv = p \times v$) имеем:
$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 \; (pp)v$ или в силу $p \times p = 0$, $pp = -(p,p) = -1$ (напомню, $\lVert p \rVert = 1$)
$v^\prime = v + 2 \cos  \varphi \sin \varphi \; p \times v - 2 \sin^2 \varphi \; v$
$v^\prime = 2 \cos  \varphi \sin \varphi \; p \times v + (1 - 2 \sin^2 \varphi)v$

Так как $(pv, pv) = (p,p)(v,v) = (v,v)$ и $pv = p \times v$ перпендикулярен $v$, то квадрат нормы $v^\prime$ будет

$(v^\prime,v^\prime) = (4 \cos^2 \varphi \sin^2 \varphi + (1-2\sin^2 \varphi)^2)(v,v)$

Явно норма не сохраняется и формула фигня. Но может я где-то ошибся? Есть ли в самом деле формула поворота более оптимальная для расчетов (с использованием simd инструкций sse, к примеру), нежели классическая, что дана выше? Может даже кто-то сталкивался с той формулой на форуме?

 Профиль  
                  
 
 Re: Интересная формула для поворота одного вектора вокруг другог
Сообщение12.11.2013, 18:18 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Все хорошо, $4\cos^2 \varphi \sin^2\varphi + (1 - 2\sin^2\varphi)^2 = 1 - 4 \sin^2 \varphi + 4\sin^2\varphi(\sin^2\varphi+\cos^2\varphi) = 1$

 Профиль  
                  
 
 Re: Интересная формула для поворота одного вектора вокруг другог
Сообщение12.11.2013, 18:32 


25/10/10
14
Xaositect в сообщении #787950 писал(а):
Все хорошо, $4\cos^2 \varphi \sin^2\varphi + (1 - 2\sin^2\varphi)^2 = 1 - 4 \sin^2 \varphi + 4\sin^2\varphi(\sin^2\varphi+\cos^2\varphi) = 1$


Да, похоже я запаниковал раньше времени, не помучав это выражение. Ну ладно, далее тоже всё хорошо должно быть. Спасибо

 Профиль  
                  
 
 Re: Интересная формула для поворота одного вектора вокруг другог
Сообщение13.11.2013, 15:29 
Заслуженный участник


27/04/09
28128

(Оффтоп)

shamaz.mazum в сообщении #787942 писал(а):
чисто "мнимые" кватернионы
А кавычки-то зачем? Это вполне себе термин. :-)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: bondkim137


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group