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

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #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 Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Апрель 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)
Как так?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Апрель 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 имеют равную длину?
« Последнее редактирование: Апрель 28, 2020, 19:49 от Igors » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #20 : Май 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)
Записан

Изучением 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


Просмотр профиля
« Ответ #21 : Май 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 (зеленый) - противолежащий катет.

Ну ладно, вернемся к кватернионам. Мелькнуло предложение
.. выйти на еще одну интересную формулу, которая также показывает связь с кватернионами: ссылка
Ну и что это за интересная формула, в чем ее смысл ? (аттач)
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Май 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()

Вряд ли это "быстрее" чем по Эйлеру, наверное это как бы "более идейно" (ну я так думаю), но уловить эту идею не могу
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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