Russian Qt Forum

Программирование => Общий => Тема начата: Igors от Апрель 02, 2020, 13:54



Название: Где же СУТЬ ? (изучение классики)
Отправлено: Igors от Апрель 02, 2020, 13:54
Добрый день

Попалось на глаза это (https://gamedev.ru/code/forum/?id=121038). Это там где "много спецов" (как говорил незабвенный Витек). Ну отвечающий во всей красе, тут и "а зачем это?" (извлекать угол), и отсылание к книгам (которые самому страшно открыть), в общем мыслишки ни одной, что впрочем ясно сразу по смачному тыканию.

Желание автора темы "докопаться"  выглядит симпатично, но никаких особых усилий не требует.  Мол, "не понимаю, объясните".  Заметим, что когда он (якобы) "уяснил", то не стал вдаваться ни в никакие объяснения (нажрался и отвалил), ах как быстро меняются люди!

Однако сам "метод почемучки" мне нравится, если человек понимает, то он легко ответит на любой вопрос. А то что многие вопросы глупые - нормально. Я вот тоже кватернионы не очень понимаю. Так, на уровне "почитал", т.е. умею "пользоваться ф-циями". А в последнее время они как-то часто встречаются, и я ловлю себя на мысли что переписываю чужой код не очень-то его понимая, что не есть хорошо. Попробую позадавать глупые вопросы, напр

1)
Цитировать
QVector3D QQuaternion::rotatedVector(const QVector3D & vector) const
Rotates vector with this quaternion to produce a new vector in 3D space. The following code:

QVector3D result = q.rotatedVector(vector);
is equivalent to the following:

QVector3D result = (q * QQuaternion(0, vector) * q.conjugate()).vector();
Как это (так лихо) получается? Какой смысл первого умножения и какой второго?

2) На вопросы оригинальнойтемы выше думаю отвечу (они совсем уж глупые), кроме этого (там он растворился в обычном ага/угу)
Цитировать
Кстати, я правильно понимаю, что ОДИН кватернион однозначно полностью описывает ориентацию объекта в пространстве?
Я знаю "правельный ответ" (да) но затрудняюсь объяснить

3) Почему везде фигурирует половина угла ? Тут я (смутно) догадываюсь, но хотелось бы четче
   


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: Igors от Апрель 07, 2020, 11:53
Выдалась свободная минутка, решил поразбираться. Вращение вектора (v) кватернионом (q) (псевдокод)
Код:
v" = q * v * q.inverted();
Поэтому надо изучать операцию умножения. Вот пишут (https://habr.com/ru/post/255005/)

Цитировать
]Умножение кватернионов крайне полезная штука. Результатом умножения является кватернион, который после поворота даёт такой же результат, если последовательно выполнить развороты умножаемыми кватернионами. Причём разворот будет происходить в локальной для поворачиваемого вектора системе отчёта, т. е. система отчёта поворачиваемого вектора также двигается.
Ось малюнок (аттач)

Ну в прынцыпе понятно. Хотя где он такую тройку выдрал - хз, ну ладно, имеет право взять любую. Ствло быть, первый кватернион вращает вокруг Z на 90, а второй вокруг X на -90. В итоге вращение на -90 вокруг Y.

Но все равно неясно как же он вращает.
Код:
q * q.inverted() = identity  
Так нулевой (ничего не вращает). Но если между ними вставить вектор (по сути поворот вокруг оси вектора на 180),
Код:
v' = q * v * q.inverted();
То каким-то чудесным образом на выходе получается повернутый вектор, т.е. он выпадает в осадок как ось произведения. Чего это?


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: kambala от Апрель 07, 2020, 11:58
векторное произведение некоммутативно


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: Авварон от Апрель 07, 2020, 12:36
Я думаю, если вы нарисуете два векторных произведения то чудесным образом окажутся что оно вращает правильно


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: Igors от Апрель 08, 2020, 09:27
векторное произведение некоммутативно
Так я ничего и не коммутировал :) Для умножения кватернионы представляются как
Цитировать
q.x * i + q.y * j + q.z * k + q.scalar
Т.е. действительная часть и 3 комплексных которые множатся "по Гамильтону", векторное произведение - лишь одна из компонентов рез-та.
Я думаю, если вы нарисуете два векторных произведения то чудесным образом окажутся что оно вращает правильно
Хороший метод (визуализация), но как его в данном случае применить? Нарисовать 2 вектора (множители кватернионы) и (как-то) показать углы? Это ничего не дает. Может чуть лучше рисовать СК, как ее (последовательно) поворачивает каждый кватернион, но все равно неясно как получаются новые ось и угол



Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: Inhibitor от Апрель 08, 2020, 10:09
Может чуть лучше рисовать СК, как ее (последовательно) поворачивает каждый кватернион, но все равно неясно как получаются новые ось и угол

Ну вдруг. Кликабельная, интерактивная, трехмерная демонстрашка созданая на редком языке  ::)
https://demonstrations.wolfram.com/QuaternionAdditionAndMultiplication/ (https://demonstrations.wolfram.com/QuaternionAdditionAndMultiplication/)


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: Igors от Апрель 08, 2020, 13:36
Ну вдруг. Кликабельная, интерактивная, трехмерная демонстрашка созданая на редком языке  ::)
https://demonstrations.wolfram.com/QuaternionAdditionAndMultiplication/ (https://demonstrations.wolfram.com/QuaternionAdditionAndMultiplication/)
Ну хорошо, посмотрим что на редких языках. Возьмем простой пример

Есть вектор X (1, 0, 0). Мы хотим повернуть его "на плоскости (XY)" (как в школе) на 30 градусов. Т.е. это поворот вокруг оси Z (0, 0, 1). Должно получиться
Цитировать
(1, 0, 0) -> (0.866, 0.5, 0)
Можно это увидеть с помощью рекомендованной демонстрашки? Ну хотя бы кватернион после первого умножения? Потому что я, правду сказать, "ни асилил". Спасибо


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: Авварон от Апрель 08, 2020, 15:13
Я тоже ниасилил демонстрашку, там сначала надо умножить (0, 0, 1) на (1, 0, 0) а потом результат умножить на inverted видимо (0, 0, -1) ?
Но вбивать числа там дико неудобно и я быстро сломался)


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: Igors от Апрель 09, 2020, 09:51
Я тоже ниасилил демонстрашку, там сначала надо умножить (0, 0, 1) на (1, 0, 0) а потом результат умножить на inverted видимо (0, 0, -1) ?
То было бы с нормальным UI. А с таким (надавать бы мокрым веником по жопе) приходится сначала нормировать (руками), а потом уж вводить. Поворот вокруг Z на 30 градусов (нормированный)

axis = (0, 0, 1) * sin(15). scalar = cos(15)

См аттач. Зеленая ось рез-та никаких ассоциаций у меня не вызывает. А вот цифирки интересные (и округлил, гад, до 2 знаков). Выходит первое умножение дает ось на 15 (т.е. вектор повернутый на половину угла ?  Может так совпало (частный случай)  ?


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: Inhibitor от Апрель 09, 2020, 11:24
Можно это увидеть с помощью рекомендованной демонстрашки? Ну хотя бы кватернион после первого умножения? Потому что я, правду сказать, "ни асилил". Спасибо

Сорян, мопед не мой...

[offtop] Читал что Гамильтон больше десяти лет бился прежде чем смог запилить кватернионы в их текущем виде [/offtop]


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: Igors от Апрель 20, 2020, 11:25
Навалилась куча переделок, и времени совсем нет  :'( Ну ладно, попробуем с др стороны. В изначальной нитке мелькнул интересный пост, вот он
Цитировать
Все намного проще.

Формула вращения вектора P вокруг произвольной оси A на угол theta:
P' = P*cos(theta) + (A x P)*sin(theta) + A(A * P)(1-cos(theta))        (I)

Пусть q - нормированный кватернион и равен s + v (s - скалярная часть, v - векторная).
Тогда обратный кватернион q^(-1) = s - v.

Если перемножить q * P * q^(-1), то получится
q * P * q^(-1) = (s^2 - v^2)P + 2sv x P + 2(v * P)v

Пусть v = tA, где A - единичный вектор
Перепишем все и получим:
q * P * q^(-1) = (s^2 - t^2)P + 2stA x P + 2t^2(A * P)v      (II)

Можно увидеть сходства между формулой вращения (I) и формулой (II).

Из формулы (I) получим:
s^2 - t^2 = cos(theta)
2st = sin(theta)
2t^2 = 1 - cos(theta)

Из последнего равенства получаем:
t = sqrt((1- cos(theta)) / 2) = sin(theta/2)

Складывая 1-ой и 3-ее равенство получим:
s^2 + t^2 = 1, поэтому s = cos(theta/2).

В итоге кватернион будет иметь вид:
q = s + v = cos(theta/2) + A * sin(theta/2), где A - ось вращения (нормированная).
Ну идея понятна - доказать что кватернионные манипуляции сводятся к "заведомо правильной" формуле. Как бы "алгебраическое" доказательство. Это не совсем то что хочется, (нет представления как это происходит в пр-ве), но тоже интересно. Только вот что это за формула
Цитировать
Формула вращения вектора P вокруг произвольной оси A на угол theta:
P' = P*cos(theta) + (A x P)*sin(theta) + A(A * P)(1-cos(theta))        (I)
??? Откуда она взялась? Как ее вывести с нуля? И вообще: вот открыл "книгу" (правду сказать, никаких "книг" давно уже нет, есть ссылки), хотел "почитать", а тут такая бяка, хрен поймешь :'(. И шо делать? Заучить наизусть? (у меня никогда не выходило, память ниже средней). Пропустить? Ну так признаемся что наше "почитать" = дешевые понты. Хотелось бы, конечно, "разобраться", но как?

Что предложите ?


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: Авварон от Апрель 20, 2020, 11:38
Простите а как это вы так лихо записываете кватернион как _сумму_ скаляра и вектора. Кто вообще сказал что так можно и кто сказал что на эту "сумму" распространяются алгебраические операции? От того что вы там написали плюсик не означает что для этой операции выполнены требования и равно что и формула раскрытия скобок работает.


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: Igors от Апрель 20, 2020, 13:12
Простите а как это вы так лихо записываете кватернион как _сумму_ скаляра и вектора. Кто вообще сказал что так можно и кто сказал что на эту "сумму" распространяются алгебраические операции? От того что вы там написали плюсик не означает что для этой операции выполнены требования и равно что и формула раскрытия скобок работает.
Пришлось смотреть где ж я такое писал :) Наверное имеется ввиду это
Для умножения кватернионы представляются как
Цитировать
q.x * i + q.y * j + q.z * k + q.scalar
Да, официальная теория утверждает что кватернион - это комплексное число, только комплексных компонент 3 (i, j, k). Да, "сложения" одной компоненты с другой нет, т.е. в коде это ничем не выразится. А вот множить можно, по Гамильтону

i * j = k   // подобно векторному произведению
j * k = i   // каждая ось получается из 2 предыдущих
k * i = j   // и произведение не коммутативно (j * i = -k)

// а произведение одной компоненты выпадает в скаляр
i * i = j * j = k * k = i * j * k = -1  

Ну то ладно, пока предлагается разобраться в формуле поворота без всяких комплексных. Хотя бы вот этот фостик

Цитировать
... + A(A * P)(1-cos(theta))
Что сие значит  ???


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: kambala от Апрель 20, 2020, 13:26
https://ru.wikipedia.org/wiki/Формула_поворота_Родрига мы эту формулу обсуждали тут N лет назад
Цитировать
официальная теория утверждает что кватернион - это комплексное число
официальная теория не может так утверждать, потому что это не правда, строго говоря :) кватернионы напоминают комплексные числа, но это не просто 2 дополнительных компоненты: кватернионы не образуют поле, в отличие от комплексных чисел.


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: Igors от Апрель 20, 2020, 14:18
https://ru.wikipedia.org/wiki/Формула_поворота_Родрига мы эту формулу обсуждали тут N лет назад
Ну хорошо, убедились что товарищ переписал правильно, формула наверное "та самая". Но как это приблизило нас к ее пониманию? :) Вы "асилили" вывод из вики? Если да - поясните своими словами, спасибо. Если нет - стесняться нечего, тамошние выкладки просто ужасны (и у меня подозрение - умышленно)

Вопрос тот же
Цитировать
... + A(A * P)(1-cos(theta))
Что сие значит  ???


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: Igors от Апрель 22, 2020, 13:45
Вот это "тыц ссылкой" выглядит как исчерпывающий ответ, мол, "на, читай (темнота), тут все написано !". Но обсудить ссылку "тыцающий" частенько не хочет, и понятно почему - там же полная хрень написана, типа
Цитировать
Положим вектор w → {\displaystyle {\vec {w}}} \vec{w}, равный:
w → = e → × R → 1 {\displaystyle {\vec {w}}={\vec {e}}\times {\vec {R}}_{1}}
Чего это "положим"? Откуда я мог знать (или как догадаться) что(?) надо "положить"? Повторять такую фигню "от себя" явно не тянет

Остается удовлетвориться тем что формула - точно правильная, и если ее аккуратно(!) переписать - работать будет. Такой подход втихаря юзают все, и это не заслуживает осуждения, в конце-концов во все вникать - никакой головы не хватит. Однако при плотной работе этого недостаточно, напр
Цитировать
Повернули вектор на 45 градусов вокруг заданной оси (хоть тем же кватернионом). Какой будет угол между исходным и повернутым векторами?
Не, ну если звучит такой вопрос, человек заподозрит подвох и задумается. Однако если возникает по ходу дела - начинает ерзать. Во, блин, повернул на 45, а угол-то получился меньше! Наверное эта формула неправильно вращает. Надо искать другую..

Как же все-таки "разобраться"? Ну смотреть на длинную формулу можно сколь угодно долго но бесполезно - мысли не придут. Нужна какая-то схема/план. В случае с Родригой это легко, см аттач. Черный вектор (P) вращается вокруг синей оси (A). Ключевой момент - вращается лишь зеленая компонента вектора, которая лежит в плоскости вращения. Синяя (проекция на ось вращения) остается на месте. Т.е. если напр-е вектора совладает с осью вращения (точнее "коллинеарно"), то с ним вообще ничего не случится (повернутый = исходному).

Понимая этот простецкий чертежик, мы без труда расправимся с Родригой. Где в формуле синий вектор? По напр-ю он должен совпадать с A (ось), значит кандидат один (о котором я и спрашивал)
Цитировать
A(A * P)(1-cos(theta))
A - единичный вектор, остальное скаляр (длина). Разберемся с ней. (A * P) здесь оператор * означает "скалярное произведение", что почему-то нигде не упоминается, нехорошо. Длина синего вектора как раз и есть (A * P) (синий катет в тр-ке с черной гипотенузой)
Цитировать
(A * P) = dot(A. P)
P_blue = A * dot(A, P)
A(A * P)(1-cos(theta)) = P_blue - P_blue * cos(theta).
Так, синий вектор в формуле есть, но... тут же он еще и с каким-то cos(theta), что это? Пусть пока не знаем, НО знаем что оставшаяся часть формулы посвящена вращению зеленой компоненты, присобачим это слагаемое туда
Цитировать
P*cos(theta) + (A x P)*sin(theta) + A(A * P)(1-cos(theta)) =
P*cos(theta) + (A x P)*sin(theta) + P_blue - P_blue*cos(theta) =
(P - P_blue)*cos(theta) + (A x P)*sin(theta) + P_blue
Но P - P_blue = P_green, это наш зеленый вектор. значит поворот зеленого вектора выражается формулой
Цитировать
P_green*cos(theta) + (A x P)*sin(theta)
Дальше попробуйте сами, тут надо понять что делает векторное произведение (A x P) и вспомнить школьную формулу - и все.

Да, мне хотелось бы так же с кватернионами. Ну пока не выходит..


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: kambala от Апрель 25, 2020, 13:23
очень хорошо, что вы проделали домашнюю работу :) Хотя достаточно было просто пройти в английскую статью, где всё разжевано намного лучше, да и обозначения на картинках совпадают с формулами. Оттуда можно выйти на еще одну интересную формулу, которая также показывает связь с кватернионами: https://en.wikipedia.org/wiki/Euler–Rodrigues_formula

у меня с помощью воображения (можно и бумагу с карандашом использовать) получилось так:
1. для удобства повернем СК так, чтоб ось вращения совпадала с одной из осей, например z
2. отрежем координату z от поворачиваемого вектора, получим проекцию на плоскость вращения
3. повернем проекцию на заданный угол
4. вернем координату z из 2 повернутой проекции
5. вернем СК в исходное положение с помощью обратной матрицы из 1


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: Igors от Апрель 26, 2020, 11:36
очень хорошо, что вы проделали домашнюю работу :) Хотя достаточно было просто пройти в английскую статью, где всё разжевано намного лучше, да и обозначения на картинках совпадают с формулами.
Да, английская статья получше, но также достаточно трудна, и делать вид что, мол, нужно глянуть ссылку - и все дела :) не стоит, это не так.

у меня с помощью воображения (можно и бумагу с карандашом использовать) получилось так:
1. для удобства повернем СК так, чтоб ось вращения совпадала с одной из осей, например z
2. отрежем координату z от поворачиваемого вектора, получим проекцию на плоскость вращения
3. повернем проекцию на заданный угол
4. вернем координату z из 2 повернутой проекции
5. вернем СК в исходное положение с помощью обратной матрицы из 1
Про обратную матрицу сами придумали? :) "Повернем СК" - как ??? Что это за операция такая и что у нас для нее есть? (ничего). Лучше сказать что мы "строим СК", т.е. говорим/утверждаем что синий вектор - это ось Z, зеленый - ось X, а третий (на моем чертеже не показан) ось Y = A x P (y = cross(z, x)). При этом важно что длины векторов X и Y одинаковы. Да, можно записать 3 вектора в строки матрицы, но зачем? Ну получим вектора в локальной СК, типа (x, 0, 0), (0, y, 0), (0, 0, z), и что с того?

3. повернем проекцию на заданный угол
Интересно как человек, занимающийся "сборкой" и учивший нечто подобное более 10 лет назад, сможет "повернуть проекцию"? Никак, и Вам это прекрасно известно. Ладно, разжуем (хотя где уж мне до великой Вики :))

Есть школьные формулы поворота
Цитировать
cos(a + b) = cos(a) * cos(b) - sin(a) * sin(b)
sin(a + b) = cos(a) * sin(b) + sin(a) * cos(b)
Они выводятся по теореме Пифагора, уметь вывести самому желательно.

Из них следуют формулы поворота вектора на плоскости
Цитировать
x' = x * cos(a) - y * sin(a)
y' = y * cos(a) + x * sin(a)

Поворот в 3D описывается этими же формулами с той лишь разницей что x и у - ортогональные вектора равной длины. Можно сказать что это "поворот СК", оси  x и y вращаются на угол a вокруг неизменной оси z. Можно и вокруг др оси, так часто делают при повороте матрицы, получается чуть шустрее.

Ну и чтобы не скучно было: а что со знаком? Ведь если зеленый вектор - ось X, то в приведенных формулах "минус", а у Родриги "плюс"
Цитировать
P_green*cos(theta) + (A x P)*sin(theta)
Как так?


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: kambala от Апрель 26, 2020, 12:46
Цитировать
Да, английская статья получше, но также достаточно трудна
вы четко демонстрируйте что именно вызывает затруднение, будем разбираться
Цитировать
Про обратную матрицу сами придумали?
считайте, что сам :) а что, матрица, обратная к матрице перехода, не вернет вектор в исходную СК?
Цитировать
"Повернем СК" - как ??? Что это за операция такая и что у нас для нее есть? (ничего).
«повернем» было неправильным термином, «выполним переход». У нас есть вектор, задающий ось вращения, и новый вектор, совпадающий с одной из осей. Единственная непутевая компонента нового вектора будет равна квадрату длины исходного вектора (чтоб длины сохранились), а матрица перехода вычисляется как система уравнений 3х3 (всякие библиотеки, та же Qt, наверняка делают это одним методом). Далее умножаем поворачиваемый вектор на эту матрицу.
Цитировать
Интересно как человек, занимающийся "сборкой" и учивший нечто подобное более 10 лет назад, сможет "повернуть проекцию"? Никак, и Вам это прекрасно известно.
мне известно, что человек, которому это необходимо, как минимум откроет букварь и будет искать нужный метод (если не получится, конечно, придется гуглить или рисовать картинки, вспоминая школьную геометрию). Или нас интересует сугубо теоретический результат в виде формулы?
Цитировать
Поворот в 3D описывается этими же формулами с той лишь разницей что x и у - ортогональные вектора равной длины
в 3д матрица поворота будет содержать 1 на диагонали для фиксированной координаты. А вектора наверное имелись в виду Х и У из начала поста?
Цитировать
Ну и чтобы не скучно было: а что со знаком?
ваши формулы поворота вектора на плоскости вращают по часовой стрелке, а та формула для против. Взяв отрицательный угол получим правильный знак.


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: Igors от Апрель 28, 2020, 19:43
«повернем» было неправильным термином, «выполним переход». У нас есть вектор, задающий ось вращения, и новый вектор, совпадающий с одной из осей. Единственная непутевая компонента нового вектора будет равна квадрату длины исходного вектора (чтоб длины сохранились), а матрица перехода вычисляется как система уравнений 3х3 (всякие библиотеки, та же Qt, наверняка делают это одним методом). Далее умножаем поворачиваемый вектор на эту матрицу.
Ну давайте через матрицы

а матрица перехода вычисляется как система уравнений 3х3
Та яка там дача? хатинка! Вот нашли мы 3 вектора X. Y, Z, каждый выражается тройкой чисел в исходной (мировой) СК - и тупо записываем их в строки матрицы. Считаем все оси единичными, длина выносится "за скобки"

X.x  X.y  X.z
Y.x  Y.y  Y.z
Z.x  Z.y  Z.z

Эта матрица переводит из мира в локальную СК что задана 3-мя векторами. Убедимся. Помножим строки матрицы на вектор-столбец X

X_local.x = dot(X, X) = 1  
X_local.y = dot(X, Y) = 0  // оси ортогональны
X_local.z = dot(X, Z) = 0  // оси ортогональны

Правильно, в локальной СК ось X = (1, 0, 0)

Теперь мы повернули вектор (1, 0, 0) на угол "a" в локальной СК. Т.к. z = 0, то это поворот на плоскости XY, используя школьные формулы поворота

X_local' = (cos(a), sin(a), 0)

И переводим этот вектор назад в мир. Для чисто матрицы вращения обратная = транспонированной, значит множим вектор-строку (X_local') на столбцы исходной матрицы

X'.x = X.x * cos(a) + Y.x * sin(a)
X'.y = X.y * cos(a) + Y.y * sin(a)
X'.z = X.z * cos(a) + Y.z * sin(a)

Итого:
X' = X * cos(a) + Y * sin(a)

А это уже то что у Родриги
P_green * cos(theta) + (A x P) * sin(theta)

Др словами, матрица в решении не используется, вместо нее короткая формула (см "итого"). Вот если ее доказывать - выплывут матрицы.  

4. вернем координату z из 2 повернутой проекции
5. вернем СК в исходное положение с помощью обратной матрицы из 1
Не было такого в планах Родрига :)

вы четко демонстрируйте что именно вызывает затруднение, будем разбираться
Ну например почему найденные вектора X и Y имеют равную длину?


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: kambala от Май 02, 2020, 14:22
Ну например почему найденные вектора X и Y имеют равную длину?
|Y| = |Z x P| = |Z| |P| sin(a) = |P| sin(a)
|X| = |P| cos(pi/2 - a) = |P| sin(a)


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: Igors от Май 03, 2020, 08:34
Комментировать надо (для друзей по Qbs)
|Y| = |Z x P| = |Z| |P| sin(a) = |P| sin(a)
|X| = |P| cos(pi/2 - a) = |P| sin(a)
Где a = угол между осью вращения и вращаемым вектором P (не путать с углом поворотом theta). Первое ур-е из свойств векторного произведения (это же значение = (двойной) площади тр-ка). Второе - просто "по чертежу", P (черный) гипотенуза, X (зеленый) - противолежащий катет.

Ну ладно, вернемся к кватернионам. Мелькнуло предложение
.. выйти на еще одну интересную формулу, которая также показывает связь с кватернионами: ссылка (https://en.wikipedia.org/wiki/Euler%E2%80%93Rodrigues_formula)
Ну и что это за интересная формула, в чем ее смысл ? (аттач)


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: kambala от Май 06, 2020, 19:23
ее смысл в том же, в чем и исходной формулы :) если вопрос в том, как ее вывести, то я не могу ответить.


Название: Re: Где же СУТЬ ? (изучение классики)
Отправлено: Igors от Май 08, 2020, 11:41
ее смысл в том же, в чем и исходной формулы :) если вопрос в том, как ее вывести, то я не могу ответить.
Вывести - ерунда. Я совсем не горю желанием "публиковаться" :-) но я бы написал так
Цитировать
Поворот вектора вокруг произвольной оси сводится к др известной задаче "поворот вектора вокруг ортогональной оси", вращается проекция на плоскость вращения плюс неизменяемая  компонента - проекция на ось. Имея вектор P и ось A находим 3 ортогональных вектора X, Y, Z (строим СК), как - жевали выше. Тогда

P = X + Z
P' = X * cos(theta) + Y * sin(theta) + Z
В варианте Эйлера вектор (P) и угол (theta) представлены "в формате кватерниона", (a, b, c, d) т.е

a = cos(theta/2)            // половина угла вращения
w = P * sin(theta / 2)    // ось, длина = sin половины угла

Второе слагаемое - вектор Y, длина
2 * cos(theta / 2) * sin(theta / 2) = sin(theta)

Ну и третье получится cos(theta). В итоге - та же формула Родриги(а)

Все это понятно, но почему-то все реализации вращения кватернионом (что я видел) не используют эту формулу, вместо нее упорно тулится

P' = Q * P * Q.conjagated()

Вряд ли это "быстрее" чем по Эйлеру, наверное это как бы "более идейно" (ну я так думаю), но уловить эту идею не могу