Russian Qt Forum
Ноябрь 22, 2024, 11:15
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
Общий
>
Где же СУТЬ ? (изучение классики)
Страниц:
1
[
2
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Где же СУТЬ ? (изучение классики) (Прочитано 12327 раз)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Где же СУТЬ ? (изучение классики)
«
Ответ #15 :
Апрель 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) и вспомнить школьную формулу - и все.
Да, мне хотелось бы так же с кватернионами. Ну пока не выходит..
«
Последнее редактирование: Апрель 22, 2020, 13:50 от Igors
»
Записан
kambala
Джедай : наставник для всех
Offline
Сообщений: 4747
Re: Где же СУТЬ ? (изучение классики)
«
Ответ #16 :
Апрель 25, 2020, 13:23 »
очень хорошо, что вы проделали домашнюю работу
Хотя достаточно было просто пройти в английскую статью, где всё разжевано намного лучше, да и обозначения на картинках совпадают с формулами. Оттуда можно выйти на еще одну интересную формулу, которая также показывает связь с кватернионами:
https://en.wikipedia.org/wiki/Euler
–Rodrigues_formula
у меня с помощью воображения (можно и бумагу с карандашом использовать) получилось так:
1. для удобства повернем СК так, чтоб ось вращения совпадала с одной из осей, например z
2. отрежем координату z от поворачиваемого вектора, получим проекцию на плоскость вращения
3. повернем проекцию на заданный угол
4. вернем координату z из 2 повернутой проекции
5. вернем СК в исходное положение с помощью обратной матрицы из 1
Записан
Изучением 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
Сообщений: 11445
Re: Где же СУТЬ ? (изучение классики)
«
Ответ #17 :
Апрель 26, 2020, 11:36 »
Цитата: kambala от Апрель 25, 2020, 13:23
очень хорошо, что вы проделали домашнюю работу
Хотя достаточно было просто пройти в английскую статью, где всё разжевано намного лучше, да и обозначения на картинках совпадают с формулами.
Да, английская статья получше, но также достаточно трудна, и делать вид что, мол, нужно глянуть ссылку - и все дела
не стоит, это не так.
Цитата: kambala от Апрель 25, 2020, 13:23
у меня с помощью воображения (можно и бумагу с карандашом использовать) получилось так:
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), и что с того?
Цитата: kambala от Апрель 25, 2020, 13:23
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)
Как так?
Записан
kambala
Джедай : наставник для всех
Offline
Сообщений: 4747
Re: Где же СУТЬ ? (изучение классики)
«
Ответ #18 :
Апрель 26, 2020, 12:46 »
Цитировать
Да, английская статья получше, но также достаточно трудна
вы четко демонстрируйте что именно вызывает затруднение, будем разбираться
Цитировать
Про обратную матрицу сами придумали?
считайте, что сам
а что, матрица, обратная к матрице перехода, не вернет вектор в исходную СК?
Цитировать
"Повернем СК" - как
Что это за операция такая и что у нас для нее есть? (ничего).
«повернем» было неправильным термином, «выполним переход». У нас есть вектор, задающий ось вращения, и новый вектор, совпадающий с одной из осей. Единственная непутевая компонента нового вектора будет равна квадрату длины исходного вектора (чтоб длины сохранились), а матрица перехода вычисляется как система уравнений 3х3 (всякие библиотеки, та же Qt, наверняка делают это одним методом). Далее умножаем поворачиваемый вектор на эту матрицу.
Цитировать
Интересно как человек, занимающийся "сборкой" и учивший нечто подобное более 10 лет назад, сможет "повернуть проекцию"? Никак, и Вам это прекрасно известно.
мне известно, что человек, которому это необходимо, как минимум откроет букварь и будет искать нужный метод (если не получится, конечно, придется гуглить или рисовать картинки, вспоминая школьную геометрию). Или нас интересует сугубо теоретический результат в виде формулы?
Цитировать
Поворот в 3D описывается этими же формулами с той лишь разницей что x и у - ортогональные вектора равной длины
в 3д матрица поворота будет содержать 1 на диагонали для фиксированной координаты. А вектора наверное имелись в виду Х и У из начала поста?
Цитировать
Ну и чтобы не скучно было: а что со знаком?
ваши формулы поворота вектора на плоскости вращают по часовой стрелке, а та формула для против. Взяв отрицательный угол получим правильный знак.
«
Последнее редактирование: Апрель 26, 2020, 16:10 от kambala
»
Записан
Изучением 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
Сообщений: 11445
Re: Где же СУТЬ ? (изучение классики)
«
Ответ #19 :
Апрель 28, 2020, 19:43 »
Цитата: kambala от Апрель 26, 2020, 12:46
«повернем» было неправильным термином, «выполним переход». У нас есть вектор, задающий ось вращения, и новый вектор, совпадающий с одной из осей. Единственная непутевая компонента нового вектора будет равна квадрату длины исходного вектора (чтоб длины сохранились), а матрица перехода вычисляется как система уравнений 3х3 (всякие библиотеки, та же Qt, наверняка делают это одним методом). Далее умножаем поворачиваемый вектор на эту матрицу.
Ну давайте через матрицы
Цитата: kambala от Апрель 26, 2020, 12:46
а матрица перехода вычисляется как система уравнений 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)
Др словами, матрица в решении не используется, вместо нее короткая формула (см "итого"). Вот если ее доказывать - выплывут матрицы.
Цитата: kambala от Апрель 25, 2020, 13:23
4. вернем координату z из 2 повернутой проекции
5. вернем СК в исходное положение с помощью обратной матрицы из 1
Не было такого в планах Родрига
Цитата: kambala от Апрель 26, 2020, 12:46
вы четко демонстрируйте что именно вызывает затруднение, будем разбираться
Ну например почему найденные вектора X и Y имеют равную длину?
«
Последнее редактирование: Апрель 28, 2020, 19:49 от Igors
»
Записан
kambala
Джедай : наставник для всех
Offline
Сообщений: 4747
Re: Где же СУТЬ ? (изучение классики)
«
Ответ #20 :
Май 02, 2020, 14:22 »
Цитата: Igors от Апрель 28, 2020, 19:43
Ну например почему найденные вектора X и Y имеют равную длину?
|Y| = |Z x P| = |Z| |P| sin(a) = |P| sin(a)
|X| = |P| cos(pi/2 - a) = |P| sin(a)
Записан
Изучением 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
Сообщений: 11445
Re: Где же СУТЬ ? (изучение классики)
«
Ответ #21 :
Май 03, 2020, 08:34 »
Комментировать надо (для друзей по Qbs)
Цитата: kambala от Май 02, 2020, 14:22
|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 (зеленый) - противолежащий катет.
Ну ладно, вернемся к кватернионам. Мелькнуло предложение
Цитата: kambala от Апрель 25, 2020, 13:23
.. выйти на еще одну интересную формулу, которая также показывает связь с кватернионами:
ссылка
Ну и что это за интересная формула, в чем ее смысл ? (аттач)
Записан
kambala
Джедай : наставник для всех
Offline
Сообщений: 4747
Re: Где же СУТЬ ? (изучение классики)
«
Ответ #22 :
Май 06, 2020, 19:23 »
ее смысл в том же, в чем и исходной формулы
если вопрос в том, как ее вывести, то я не могу ответить.
Записан
Изучением 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
Сообщений: 11445
Re: Где же СУТЬ ? (изучение классики)
«
Ответ #23 :
Май 08, 2020, 11:41 »
Цитата: kambala от Май 06, 2020, 19:23
ее смысл в том же, в чем и исходной формулы
если вопрос в том, как ее вывести, то я не могу ответить.
Вывести - ерунда. Я совсем не горю желанием "публиковаться" :-) но я бы написал так
Цитировать
Поворот вектора вокруг произвольной оси сводится к др известной задаче "поворот вектора вокруг ортогональной оси", вращается проекция на плоскость вращения плюс неизменяемая компонента - проекция на ось. Имея вектор 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()
Вряд ли это "быстрее" чем по Эйлеру, наверное это как бы "более идейно" (ну я так думаю), но уловить эту идею не могу
Записан
Страниц:
1
[
2
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...