Russian Qt Forum
Ноябрь 22, 2024, 11:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Где же СУТЬ ? (изучение классики)  (Прочитано 12325 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Апрель 02, 2020, 13:54 »

Добрый день

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

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

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

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) Почему везде фигурирует половина угла ? Тут я (смутно) догадываюсь, но хотелось бы четче
   
« Последнее редактирование: Апрель 02, 2020, 13:56 от Igors » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Апрель 07, 2020, 11:53 »

Выдалась свободная минутка, решил поразбираться. Вращение вектора (v) кватернионом (q) (псевдокод)
Код:
v" = q * v * q.inverted();
Поэтому надо изучать операцию умножения. Вот пишут

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

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

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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Апрель 07, 2020, 11:58 »

векторное произведение некоммутативно
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Апрель 07, 2020, 12:36 »

Я думаю, если вы нарисуете два векторных произведения то чудесным образом окажутся что оно вращает правильно
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Апрель 08, 2020, 09:27 »

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

Записан
Inhibitor
Гость
« Ответ #5 : Апрель 08, 2020, 10:09 »

Может чуть лучше рисовать СК, как ее (последовательно) поворачивает каждый кватернион, но все равно неясно как получаются новые ось и угол

Ну вдруг. Кликабельная, интерактивная, трехмерная демонстрашка созданая на редком языке  Строит глазки
https://demonstrations.wolfram.com/QuaternionAdditionAndMultiplication/
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Апрель 08, 2020, 13:36 »

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

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

Сообщений: 3260


Просмотр профиля
« Ответ #7 : Апрель 08, 2020, 15:13 »

Я тоже ниасилил демонстрашку, там сначала надо умножить (0, 0, 1) на (1, 0, 0) а потом результат умножить на inverted видимо (0, 0, -1) ?
Но вбивать числа там дико неудобно и я быстро сломался)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Апрель 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 (т.е. вектор повернутый на половину угла ?  Может так совпало (частный случай)  ?
Записан
Inhibitor
Гость
« Ответ #9 : Апрель 09, 2020, 11:24 »

Можно это увидеть с помощью рекомендованной демонстрашки? Ну хотя бы кватернион после первого умножения? Потому что я, правду сказать, "ни асилил". Спасибо

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Апрель 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)
Непонимающий Откуда она взялась? Как ее вывести с нуля? И вообще: вот открыл "книгу" (правду сказать, никаких "книг" давно уже нет, есть ссылки), хотел "почитать", а тут такая бяка, хрен поймешь Плачущий. И шо делать? Заучить наизусть? (у меня никогда не выходило, память ниже средней). Пропустить? Ну так признаемся что наше "почитать" = дешевые понты. Хотелось бы, конечно, "разобраться", но как?

Что предложите ?
« Последнее редактирование: Апрель 20, 2020, 11:29 от Igors » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Апрель 20, 2020, 11:38 »

Простите а как это вы так лихо записываете кватернион как _сумму_ скаляра и вектора. Кто вообще сказал что так можно и кто сказал что на эту "сумму" распространяются алгебраические операции? От того что вы там написали плюсик не означает что для этой операции выполнены требования и равно что и формула раскрытия скобок работает.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Апрель 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))
Что сие значит  Непонимающий
« Последнее редактирование: Апрель 20, 2020, 13:13 от Igors » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #13 : Апрель 20, 2020, 13:26 »

https://ru.wikipedia.org/wiki/Формула_поворота_Родрига мы эту формулу обсуждали тут N лет назад
Цитировать
официальная теория утверждает что кватернион - это комплексное число
официальная теория не может так утверждать, потому что это не правда, строго говоря Улыбающийся кватернионы напоминают комплексные числа, но это не просто 2 дополнительных компоненты: кватернионы не образуют поле, в отличие от комплексных чисел.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Апрель 20, 2020, 14:18 »

https://ru.wikipedia.org/wiki/Формула_поворота_Родрига мы эту формулу обсуждали тут N лет назад
Ну хорошо, убедились что товарищ переписал правильно, формула наверное "та самая". Но как это приблизило нас к ее пониманию? Улыбающийся Вы "асилили" вывод из вики? Если да - поясните своими словами, спасибо. Если нет - стесняться нечего, тамошние выкладки просто ужасны (и у меня подозрение - умышленно)

Вопрос тот же
Цитировать
... + A(A * P)(1-cos(theta))
Что сие значит  Непонимающий
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 23.