Комментарий к Статье Вращение и кватернионы. Сборник рецептов
В этой статье я постараюсь кратко рассмотреть основные вопросы, связанные с представлением вращения. Покажу, как использовать кватернионы для представления ориентации объектов, а также некоторые приемы их использования в трехмерной графике и программировании игр. К статье прилагается исходный код класса для работы с кватернионами, в котором можно найти реализацию описанных в статье приемов.
Для лучшего понимания статьи хорошо бы еще все описанные функции представить математически(с использованием матриц, квантерионов), а не только с помощью кода.
real-Shadow
Статья ориентирована на практическое использование кватернионов, поэтому не содержит мат . выводов.
И лично для меня НАМНОГО понятнее строчки кода чем математические формулы.
Пояснения к коду в статье
Лучше всего скачать исходники + рекомендуемые реализации векторов (из Nebula Device)
% скалярное произведение векторов
>Как мы видим, при конвертировании используется только умножения и сложения, что является несомненным преимуществом на современных процессорах.
очень порадовало слово "современных" :)))
minorlogic
>TINY - маленько число , за пределами используемой точности . например (0.000001) .
в С++ лучше использывать std::numeric_limits<float>::epsilon()
Скалярное произведение полезно тем, что дает косинус половины угла между двумя кватернионами умноженную на их длину.
1) Фраза построена неправильно: косинус ... угла и умноженную.
2) Непонятно: результат произведения один, кватернионов два, а длина снова одна, но их - так на чью длину умножен результат? На сумму/произведение/среднее длин исходных кватернионов? Судя по всему, всё же на произведение длин исходных кватерионов, однако результат длиной уже не является.
CyberZX
Почему лучше? Это все-лишь навсего самое маленькое число, которое прибавленное к 1 даст уже не 1. Погрешность при вычислении может быть гораздо больше.
А всяки TINY и EPSILON лучше вообще не использовать, их использование говорит о том, что программисту было лень придумать числено устойчивый алгоритм.
CyberZX
Именно на современных ! По моим тестам на пне третьем всетаки деление с плавающей точкой иногда было медленнее умножения, объяснить не могу , может компилятор проглючил , но разница была , причем за предплами точности измерения. Настаивать на этом не буду , в любом случае есть много процессоров кроме x86.
Про epsilon , tiny я придерживаюсь взглядов _Winnie, если они появились , значит гдет лень было устоичивое решение искать . Лично меня в формуле , shortest_arc это обломило, до конца не додумал , за что стыдно :(
arabesc
Первый блин комом , в статье и стиль страдает и предложения длинные , и много других недостатков. Это еще неплохо , потому что мне помогли статью причесать в свое время. В оригинале , она была еще хуже. Пульцеровской премии мне не видать :(
Но зато математика (тьху тьху) вроде не глючила.
Всем спасибо за коментарии !
minorlogic
Лично меня в формуле , shortest_arc это обломило, до конца не додумал , за что стыдно :(
И тем не менее, тут ссылаются. И этот же код включен в обновление для CD к книге.
Первый блин комом
Статьи после публикации не подлежат редактированию?
Спасибо за труд! :)
arabesc
Прикольно! Вот так вот , глюки и перетекают из одного источника в другой :). Не то что бы , глюк , но до конца недодуманное решение.
Так, разбирался со статьёй и натолкнулся на это:
qq' = [ vv' + wv' + w'v, ww – v•v' ]
Опечатка, я так полагаю ( ww ), пожалуй должно быть так:
qq' = [ vv' + wv' + w'v, wW' – v•v' ]
(апостроф после второй w).
Или нет?
И натолкнувшись на это, я начал лазить по глобалу, чтобы лучше разобраться с кватернионами. Нашёл эту статью в википедии: Кватернионы
Так вот, посчитал сам умножение, получил совершенно другой результат:
(x+yi+zj+wk) * (x'+y'i+z'j+w'k) = xx' + xy'i + xz'j + xw'k + yx'i + yy'i^2 + yz'ij + yw'ik + + zx'j + zy'ji + zz'j^2 + zw'jk + wx'k + wy'ki + wz'kj + ww'k^2 = = xx' + xy'i + xz'j + xw'k + yx'i - yy' + yz'k - yw'j + zx'j - zy'k - zz' + zw'i + wx'k + wy'j - wz'i - ww' = = (xx' - yy' - zz' - ww') + (xy' + yx' + zw' - wz')i + (xz' - yw' + zx' + wy')j + (xw' + yz' - zy' + wx')k
Т.е. во-первых - (xx' - yy' - zz' - ww') никак не равно ww' - vv'=ww' - xx'-yy'-zz' - даже если поменять знаки на обратные.
Во-вторых: обычно v(x,y,z) = xi + yj + zk. А тут получается, что наоборот: v(x,y,z) = xk + yj + zi. Странно...
Вроде я в вычислениях не ошибся... Может кто-нибудь разъяснит мне, что здесь к чему?
Arks
>Опечатка, я так полагаю ( ww ), пожалуй должно быть так:...
Да.
>Так вот, посчитал сам умножение, получил совершенно другой результат:...
Ты i, j, k не там расставил.
> Ты i, j, k не там расставил.
Ах, ну да...)) Всё сходится. Вопрос закрыт.
#include "mathlib/vector.h" - взять можно сдесь http://nebuladevice.cubik.org/documentation/nebula2/dir_000004.shtml.
Но дним этим файлом не обойтись.
Тема в архиве.