Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Кватернион в новой системе координат (3 стр)

Кватернион в новой системе координат (3 стр)

Поделиться

Страницы: 1 2 3 4 5 6 Следующая

TrouyanПостоялецwww2 авг. 201717:12#30
iKest  - поправьте меня если Я где-то не прав, ну или аргументы в студию.

FordPerfect, вас понял... добиваю угловые скорости, надеюсь пойдет. Что имелось ввиду под  "он подходит и к тому и к другому" ?

iKestПостоялецwww2 авг. 201717:32#31
>А если с телом связать локальную СК, то переход от одной к другой может задаваться кватернионом ...
Не может (вернее может, но в одном частном случае)
>Кватернион задает вектор и угол вращения, а любой вектор задается в какой-то СК, у которой есть свои базис и соответственно ОСИ =)
Только к вращение вокруг этих ОСЕЙ кватернион не имеет никакого отношения. Вы путаете белое с горячим.
alexzzzzПостоялецwww2 авг. 201717:36#32
> И как видно из рисунка, базис модели как был левый, таким и остался...

Невозможно кватернионом перевести координаты из левосторонней СК в правостороннюю и обратно. Это не делается поворотами. Никак. Если бы делалось, то деления на левостороннюю и правостороннюю СК вообще бы не было.

(x, y, z, w) <=> (-x, -z, -y, w)
Эта штука описывает превращение кватерниона, задающего поворот в одной системе координат, в другой кватернион, задающий тот же самый поворот в другой системе координат.

Но кроме поворота имеется и то, что поворачивается - какая-то модель. Поворот в новую СК перевели, модель тоже надо переводить.

TrouyanПостоялецwww2 авг. 201717:57#33
Не может (вернее может, но в одном частном случае)

Да, обычно для перехода(точнее поворота) от одной СК к другой применяют матрицу поворота, но она же преобразуется в кватернион и обратно. Ниже выдержка из замечательного учебника:
Поворот Текст | Кватернион в новой системе координат
Только к вращение вокруг этих ОСЕЙ кватернион не имеет никакого отношения.

Вот тут-то и собака зарыта, мне нужен новый кватернион, которые задает положение модели так, буд-то она вращается в противоположном направлении.
Я не утверждаю что это можно кватернионами сделать, поэтому и стал пробовать другие способы...

alexzzzz, после долгих поисков появились у меня такие подозрения, что это сделать нельзя. (то что поворотами это не сделать это очевидно, но Я надеялся на инструмент о котором мог не знать).

Блин со скоростями беда пока .... то ли шаг интегрирования получается большой, и ошибка в вычислениях  где-то накапливается , пока до конца не понял.

Такой банальный вопрос сменить направление вращения только ОДНОЙ оси, а решение не очевидно.... =(

TrouyanПостоялецwww2 авг. 201718:29#34
Вроде поехало... через углы Эйлера...и вроде без gimbal Lock.
iKestПостоялецwww2 авг. 201718:39#35
>сменить направление вращения только ОДНОЙ оси, а решение не очевидно....
Вы можете внятно объяснить - зачем Вам это надо?
И что Вы подразумеваете под "направлением вращения": угол поворота или характеристику процесса, протекающего во времени?

>Вроде поехало... через углы Эйлера...и вроде без gimbal Lock.
Для gimbal Lock нужны определенные условия....

Правка: 2 авг. 2017 18:40

TrouyanПостоялецwww2 авг. 201719:17#36
Вы можете внятно объяснить - зачем Вам это надо?

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

Процесс (строчка выше). Процесс итерационный (фреймами) и каждая итерация - это новое положение и новый кватернион ориентации.
Для gimbal Lock нужны определенные условия....

Я углы Эйлера сначала отбросил, т.к. как как раз наблюдал гимбал лок, когда использовал преобразование кватерниона в углы Эйлера стандартными методами Unity. А сейчас, за пару минут, набросал по книжке и все заработало и без gimbal lock ... завтра буду еще тестить и проверять более подробно.

Правка: 2 авг. 2017 19:18

iKestПостоялецwww2 авг. 201719:32#37
А что всё таки мешает просто вставить в код это (x, y, z, w) <=> (-x, -z, -y, w)  (просто вставить - без всяких рассуждений) и посмотреть как это будет вертеться?
SuslikМодераторwww2 авг. 201722:23#38
мне кажется, вместо магии со сменой знака у отдельных компонент кватерниона, проще перевести его в матрицу поворота, домножить её на матрицу перехода от одной системы координат к другой, а потом полученную матрицу снова привести к кватерниону, уже в новой системе координат.
iKestПостоялецwww2 авг. 201722:37#39
Suslik
Это не спортивно... :)

Правка: 2 авг. 2017 23:14

TrouyanПостоялецwww3 авг. 20170:04#40
А что всё таки мешает просто вставить в код это (x, y, z, w) <=> (-x, -z, -y, w)  (просто вставить - без всяких рассуждений) и посмотреть как это будет вертеться?

Вот что дает такое преобразование http://www.gamedev.ru/code/forum/?id=228503&page=2#m23


Suslik
Тоже так думал, и с этого начинал свой первый пост, и проделал такие шаги... в итоге результат эквивалентен смене двух знаков кватерниона ( это если потом получившиюся матрицу перевести в кватернион) http://www.gamedev.ru/code/forum/?id=228503#m1

FordPerfectПостоялецwww3 авг. 20170:49#41
А нафига вообще кватернион в системе Unity?

Вот есть у тебя кватернион из сенсора, им и поворачивай.

А уже к повёрнутой модели применяй матрицу преобразования базиса.
В кватернион ты её всё-равно не запихнёшь - у неё детерминант -1.

alexzzzz
>Поворот в новую СК перевели, модель тоже надо переводить.
Т. е. раз можель перевели, то поворот переводить не обязательно.

iKestПостоялецwww3 авг. 20170:52#42
>Вот что дает такое преобразование http://www.gamedev.ru/code/forum/?id=228503&page=2#m23
Сорри, только сейчас заметил эту чушь... Вы ведь осознаёте что (-x, -z, -y, w) = (x, z, y, -w), кроме улов поворота 180'??? Вообще, как из только кватерниона Вы умудрились получить базис, да ещё и определить левый он или правый? о_О Так же интересно посмотреть, как вы вообще модель вращаете кватернионом...

Правка: 3 авг. 2017 1:03

SuslikМодераторwww3 авг. 20171:05#43
Trouyan
> Тоже так думал, и с этого начинал свой первый пост, и проделал такие шаги... в
> итоге результат эквивалентен смене двух знаков кватерниона ( это если потом
> получившиюся матрицу перевести в кватернион)
> http://www.gamedev.ru/code/forum/?id=228503#m1
ну так значит ищи ошибку, что. проверь для начала, что просто с матрицей поворота работает, потом переводи её в кватернион. пусть [cht]p_l[/cht] — точка в первом базисе, пусть он будет левосторонним, [cht]p_r[/cht] — в правом, пуст он будет правосторонним. [cht]S[/cht] — матрица перехода между базисами, то есть [cht]p_l=Sp_r[/cht]. далее пусть [cht]R_r[/cht] — матрица поворота в левостороннем базисе, то есть [cht]p'_l = R_lp_l[/cht], тогда
[cht]p'_l=Sp'_r[/cht]
[cht]p'_r=R_rp_r=S^{-1}p'_l=S^{-1}R_lp_l[/cht],
то есть полная матрица перехода от [cht]p_l[/cht] к [cht]p'_r[/cht] — это [cht]S^{-1}R_l[/cht], но в кватернион её, очевидно, перевести нельзя, потому что она содержит отражение, то есть не является матрицей поворота. зато в пороворот можно перевести матрицу, которая действует в правостороннем базисе:
[cht]p'_r=S^{-1}R_lSp_r[/cht], то есть матрица [cht]S^{-1}R_lS[/cht] поворачивает точку в правостороннем базисе так же, как в левостороннем. если у тебя получается не так, то ищи ошибку в тестовом коде. если получается не так при использовании кватерниона, то ищи ошибку в коде построения матрицы из кватерниона и обратно.

Правка: 3 авг. 2017 1:06

alexzzzzПостоялецwww3 авг. 20171:47#44
Trouyan
> Да, обычно для перехода(точнее поворота) от одной СК к другой применяют матрицу поворота, но она же преобразуется в кватернион и обратно. Ниже выдержка из замечательного учебника:
Изображение

Тут ничего нет про переход между левосторонней и правосторонней системами.

FordPerfect
> > оворот в новую СК перевели, модель тоже надо переводить.
> Т. е. раз можель перевели, то поворот переводить не обязательно.

Есть две системы координат. Допустим, первая ― исходная (правосторонняя), вторая ― в которой мы хотим работать (левосторонняя).

+ Показать

Есть исходный кватернион. Допустим такой: (0, √2, 0, √2).
В исходной СК он описывает поворот вокруг оси Y, которая «вперёд-назад». Поворот на 90° по часовой стрелке, если смотреть по направлению оси.

Если этот кватернион не переводить в новую систему координат, а оставить как есть, то в новой СК он будет описывать поворот вокруг Y на 90° против часовой стрелки, если смотреть по направлению оси.

Т.е. вместо поворота на 90° по часовой стрелке вокруг оси «вперёд-назад» получили поворот на 90° против часовой вокруг оси «вверх-вниз». Вообще ничего общего.

Если кватернион таки перевести в новую СК: (0, 0, -√2, √2), то он начнёт описывать поворот вокруг оси Z («вперёд-назад») на 90° по часовой стрелке. Ровно тот же поворот, который был исходно в старой СК.

(Направления поворотов считал в голове, надеюсь, не накосячил.)

Страницы: 1 2 3 4 5 6 Следующая

/ Форум / Программирование игр / 2D графика и изометрия

2001—2017 © GameDev.ru — Разработка игр