Войти
ПрограммированиеФорумФизика

Как получить углы ейлера , в собственом базисе кватерниона ? (3 стр)

Страницы: 1 2 3
#30
(Правка: 23:18) 23:13, 17 фев. 2019

foxes
> А инверсия в кватернионе это еще легче q.w=-q.w.
Ты  наверное имел виду соприжения кватерниона , только это делаеться так
'q = (q.w , -q.v)

Потому что лично у меня инверсия кватерниона делаеться так

/**
     * Inverse IQuaternion
     */
     SIMD_INLINE IQuaternion<T> GetInverse() const
     {
         T lengthSquareQuaternion = LengthSquare();

         assert (lengthSquareQuaternion > MACHINE_EPSILON);

         // Compute and return the inverse quaternion
         return IQuaternion<T>( w / lengthSquareQuaternion,
                               -x / lengthSquareQuaternion,
                               -y / lengthSquareQuaternion,
                               -z / lengthSquareQuaternion);

     }


#31
(Правка: 18 фев. 2019, 0:59) 23:22, 17 фев. 2019

werasaimon
> Потому что лично у меня инверсия кватерниона делаеться так
Нет именно q.w=-q.w, просто попробуй и увидишь разницу.
То что у тебя, это общее мат решение. Нормализация здесь не нужна если кватернион получен стандартными способами, чисто для того чтобы не делать по середине вычислений с кватернионом нормализацию. А сопряжение оно эквивалентно как инверсия q.v так и инверсия q.w.

То есть когда кватернион сам по себе единичный изначально, а как обычно в работе с 3D так и бывает, то достаточно обратить q.w или q.v, потому что его длина от этого не меняется. Так же как обратный поворот как поворот в обратную сторону -q.w или вокруг обратного вектора -q.v, это ни чего не меняет - его lengthSquareQuaternion остается прежней потому что знаки под квадратом исчезают.

Так как сопряжение обычно не реализуется в движках его заменяют на обобщенную инверсию. Это также позволяет кватерниону не разъехаться из за потери точности при больших расчетах. При которых также получение случайным образом обратного поворота и последующего умножения приведет к получению единичного кватерниона, а не абракадабры c последующим искажением масштаба.

Если приглядеться к реализации каждого метода для кватерниона, то там в каждом из них стоит своеобразная нормализация. Как то я был свидетелем того что злоупотребив это фишкой и избавившись от нормализации совсем, в результате многократного вращения тела вокруг своей оси получался плоский объект. Зато если пользоваться исключительно матричным вращением от объекта остается полоска или он растягивается в бублик и от этого обычно ни как не избавиться.

Можно далеко не ходить, а посмотреть на твою же реализацию вычисления эйлера для zxy и yxz.
Просто поменяй знаки у двоек в zxy и твоим углам не нужно будет менять знак. А когда сравнишь полученный результат с yxz, то увидишь разницу только где -q.w. Учти еще и то что у них разная последовательность Z Y.

#32
(Правка: 20:15) 20:09, 18 фев. 2019

foxes
> Нет именно q.w=-q.w, просто попробуй и увидишь разницу.
> То что у тебя, это общее мат решение. Нормализация здесь не нужна если
> кватернион получен стандартными способами, чисто для того чтобы не делать по
> середине вычислений с кватернионом нормализацию. А сопряжение оно эквивалентно
> как инверсия q.v так и инверсия q.w.
>
> То есть когда кватернион сам по себе единичный изначально, а как обычно в
> работе с 3D так и бывает, то достаточно обратить q.w или q.v, потому что его
> длина от этого не меняется. Так же как обратный поворот как поворот в обратную
> сторону -q.w или вокруг обратного вектора -q.v, это ни чего не меняет - его
> lengthSquareQuaternion остается прежней потому что знаки под квадратом
> исчезают.
У меня кватернион не еденичной длины , иза  релятивской физики .
Чем больше длина оси вокруг которой вращаеться тело "угловая скорость" , тем больше сжатия тела по двум ортогональным осям к оси вращения .
Когда поперечная скорость точки приближаеться (c/Pi * 2 * L)
c - скорость света
L - длина радиус вектора к точки .
Тело сжымаеться в линиию , верней не тело ,  а та точка которая приближаеться к скорости света и за поперечной скорости .
Поэтому Q.conjugate != Q.inverse .!


foxes
> Так как сопряжение обычно не реализуется в движках его заменяют на обобщенную
> инверсию. Это также позволяет кватерниону не разъехаться из за потери точности
> при больших расчетах. При которых также получение случайным образом обратного
> поворота и последующего умножения приведет к получению единичного кватерниона,
> а не абракадабры c последующим искажением масштаба.
Иногда нужна абракадабра .
Пример визуализации сокращения Лоренца по (u,v):
w - угловая скорость
Изображение

#33
(Правка: 20:32) 20:25, 18 фев. 2019

Может кому пригодиться , ещё один способ вытянуть углы ейлера , а врней углы браина с матрицы вращения 3×3
в обратной последовательности
https://d3cw3dd2w32x2b.cloudfront.net/wp-content/uploads/2012/07/… r-angles1.pdf
P.S: в данном методе вроде как почти отсутстувет шарнирный замок "gimbal lock"

#34
(Правка: 20:35) 20:32, 18 фев. 2019

werasaimon
> У меня кватернион не еденичной длины , иза  релятивской физики .
Тем более тебе вариант q.w=-q.w подходит больше.
werasaimon
> Иногда нужна абракадабра .
Для чего ты тогда нормализацию делаешь?
werasaimon
> Поэтому Q.conjugate != Q.inverse .!
Операции conjugate в движках нет, используют inverse

#35
(Правка: 20:37) 20:34, 18 фев. 2019

foxes
> Для чего ты тогда нормализацию делаешь?
Просто написал по стандартному , чтоб не путать людей ! На самом деле нормализацию в физике я не делаю . Только в GizmoTransfomation

foxes
> Операции conjugate в движках нет, используют inverse
Но у меня то есть .!

#36
20:38, 18 фев. 2019

werasaimon
> Но у меня то есть .!
А в Unity нет :)

#37
20:59, 18 фев. 2019

foxes
> А в Unity нет :)
А в boost есть !

Страницы: 1 2 3
ПрограммированиеФорумФизика