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

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

Поделиться

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

FordPerfectПостоялецwww3 авг. 20172:46#45
alexzzzz
>Если кватернион таки перевести в новую СК: (0, 0, -√2, √2), то он начнёт описывать поворот вокруг оси Z («вперёд-назад») на 90° по часовой стрелке.
Ну так не применять его в новой системе. Применять в старой.

Всё равно преобразование старая-новая надо матрицей отдельно делать.
Так не пофиг ли, по какую сторону матрицы поворачивать фиговину кватернионом?
Т. е. зачем именно ТС для его задачи кватернион в новой системе?

Ну т.  е. ты предлагаешь полностью работать в новой
>вторая ― в которой мы хотим работать (левосторонняя).
и я говорю, что вроде пофиг.
r'_r=R_r * r_r
r'_l=T * r'_r
r'_l=T * R_r * r_r
У тебя
r'_l=T * R_r * T^-1 r_l
и ты предлагаешь считать
T * R_r * T^-1=R_l

Ну и по-моему что
r'_l= R_l * r_l с рассчётом R_l,
что
r'_l=T * R_r * r_r
хрен, редька.

TrouyanПостоялецwww3 авг. 201712:48#46
iKest
о_О Так же интересно посмотреть, как вы вообще модель вращаете кватернионом...

Transform.rotation=Current_Quaternion;
где Current_Quaternion - кватернион задающий текущее положение. Полученный либо на прямую из сенсора либо после тех или иных преобразований.

Вообще, как из только кватерниона Вы умудрились получить базис, да ещё и определить левый он или правый?

буду на пальцах объяснять и заменю слово "ось" словами "плоскость вращения" может так будет понятней ... у сенсора есть своя связанная правая СК, у модели своя локальная левая СК ( это изображено прямо на сенсоре и прямо в модели). Далее, совершаю ручками вращение сенсора в одной плоскости OX, модель так же вращается в плоскости OX и в том же направлении (у модели есть своя СК, и относительно нее и определялось направление вращения). т.е. вектор вращения сенсора совпадает с вектором вращения модели, не чушь вроде написал ? Идем дальше, вращаем сенсор в другой плоскости OY и модель так же вращается в этой же плоскости и в том же направлении, отлично. Идем дальше... вращаем в  плоскости OZ и модель вращается в этой же плоскости НО в другом направлении! - это показано на рисунке слева:

Преобразование осей | Кватернион в новой системе координат

Далее делаем преобразование (x, y, z, w) -> (-x, -z, -y, w). Т.е. программа считывает кватернион ориентации сенсора, и меняет значения коэффициентов. И новым кватернионом  используя Transform.rotation прорисовываем модель в новом положении.

В итоге после преобразования. Вращая сенсор рукой наблюдаем:
1) в плоскости OX модель вращается в OX, но уже в противоположную сторону
1) в плоскости OY модель вращается в OZ, но тоже в противоположную сторону (повторю что у модели есть своя СК, и относительно нее и определялось направление вращения)
1) в плоскости OZ модель вращается в OY, но уже в противоположную сторону

FordPerfect

А нафига вообще кватернион в системе Unity?

Положение модель задается переменной Transform.rotation -  которая является кватернионом.
Вот есть у тебя кватернион из сенсора, им и поворачивай.

Им и поворачиваю, но в одной плоскости при вращении сенсора имеем противоположное направление модели.
А уже к повёрнутой модели применяй матрицу преобразования базиса.

Да Я так тоже думал, так и делал, результат во втором посте http://www.gamedev.ru/code/forum/?id=228503#m1

Suslik
не сочтите за грубость... но подробно в ваш пост пока времени не было вникнуть... но скажу сразу то что после применения матрицу перехода между базисами Я получил матрицу поворота в новом базисе (как описано в посте №2) и если эту полученную матрицу, в новом базисе, перевести в кватернион (а мне нужен именно кватернион, т.к. он в программе задает ориентацию модели) , то получится исходный кватернион, но в котором две компоненты поменяли знак... очень сомневаюсь что где-то закралась ошибка .... но Я позже подробней еще перечитаю ваш пост....

alexzzzz
Аналогично... в течении дня подробней постараюсь вникнуть в ваши посты....

P.S. Вообще у меня складывается впечатление, что математика кватерниона изначально заложена на одну конкретную (правую или левую) СК и переход между ними не осуществляется. Там по всюду векторные произведения и смена направления оси должна менять и направление результирующего вектора .... в общем это пока коряво описанное мое предположение и не принимайте его в серьез =)

SuslikМодераторwww3 авг. 201713:30#47
ещё, кажется, формула перевода кватерниона в матрицу и обратно на самом деле зависит от ориентированности(*) системы координат. аналогичным образом, например, от ориентированности системы координат зависят знаки в произведениях псевдовекторов вроде угловой скорости, а ось поворота кватерниона -- это именно псевдовектор.

так что, повторяю — сначала протестируй код на одних только матрицах, потому что они от ориентированности не зависят. когда он заработает, уже переводи их в кватернионы.

(*) под ориентированностью понимается лево- и правосторонность.

Правка: 3 авг. 2017 13:32

TrouyanПостоялецwww4 авг. 201712:27#48
Чтобы поверить надо прорисовать объект используя кватернионы =(

Углы Эйлера как и говорил FordPerfect не спасли =(

iKestПостоялецwww4 авг. 201712:44#49
Всё таки меня не оставляет подозрение, что Вы не правильно крутите модель кватернионом. Не подозрительно, что при неоднократно тут подсказанном способе модель крутится по всем осям в другую сторону, исходного вращения?
TrouyanПостоялецwww4 авг. 201712:53#50
iKest в моем случае кватернион не задает поворот относительно предыдущего положения, а задает сразу новое положение(т.е. новую ориентацию).
MrShoorУчастникwww4 авг. 201723:41#51
Suslik
> ещё, кажется, формула перевода кватерниона в матрицу и обратно на самом деле
> зависит от ориентированности(*) системы координат. аналогичным образом,
> например, от ориентированности системы координат зависят знаки в произведениях
> псевдовекторов вроде угловой скорости, а ось поворота кватерниона -- это именно
> псевдовектор.
Вот это поворот вокруг вектора v на угол alpha, записанный в кватернион:
[x, y, z, w] = [sin(alpha/2)*v.x, sin(alpha/2)*v.y, sin(alpha/2)*v.z, cos(alpha/2)]
Вектор у нас не зависит от ориентированности СК. Скажи, какой на выходе у нас кватернион? Для правосторонней СК или для левосторонней?

Правка: 4 авг. 2017 23:41

SuslikМодераторwww5 авг. 20177:51#52
MrShoor
> Вот это поворот вокруг вектора v на угол alpha, записанный в кватернион:
> [x, y, z, w] = [sin(alpha/2)*v.x, sin(alpha/2)*v.y, sin(alpha/2)*v.z,
> cos(alpha/2)]
> Вектор у нас не зависит от ориентированности СК. Скажи, какой на выходе у нас
> кватернион? Для правосторонней СК или для левосторонней?
>
я говорю о формуле, по которой этот кватернион(псевдовектор), действует реальный вектор, его поворачивая.
MrShoorУчастникwww5 авг. 20179:52#53
Suslik
> я говорю о формуле, по которой этот кватернион(псевдовектор), действует
> реальный вектор, его поворачивая.
Раз 10 перепрочел... и ничего не понял. Тебя там не МАСТЕР покусал часом? :)

Правка: 5 авг. 2017 9:53

iKestПостоялецwww5 авг. 201710:20#54
Suslik
>я говорю о формуле, по которой этот кватернион(псевдовектор), действует реальный вектор, его поворачивая.

q*v*invert(q)
Разве не?

SuslikМодераторwww5 авг. 201711:07#55
iKest
> *
распиши operator *, покоординатно

Правка: 5 авг. 2017 11:08

iKestПостоялецwww5 авг. 201711:32#56
>распиши operator *, покоординатно
Вектор переводится в кватернион, поэтому ориентированность базиса тут вообще никаким боком. Главное, что-бы все величины были относительно одного базиса.
SuslikМодераторwww5 авг. 201718:44#57
iKest
> Вектор переводится в кватернион, поэтому ориентированность базиса тут вообще
> никаким боком. Главное, что-бы все величины были относительно одного базиса.
ты напишешь формулу действия кватерниона на вектор или как?

Правка: 5 авг. 2017 18:50

SuslikМодераторwww5 авг. 201718:57#58
суть в том, что в операции [cht]\b{q}\vec{v}\b{q}^{-1}[/cht] при покоординатном расписывании получается так:
[cht]\b{q}\vec{v}\b{q}^{-1}=(q_w+\vec{i}q_x+\vec{j}q_y+\vec{k}q_z)(\vec{i}p_x+\vec{k}p_x+\vec{k}p_z)(q^{-1}_w+\vec{i}q^{-1}_x+\vec{j}q^{-1}_y+\vec{k}q^{-1}_z)[/cht] далее, раскрывая скобки, часть множителей определяется однозначно. например, [cht]\vec{i}\vec{i}=-1[/cht] но результат некоторых умножений определяется именно ориентированностью системы координат. например, для правосторонней системы координат выполняется [cht]\vec{i}\vec{j}=-k, \vec{j}\vec{i}=k[/cht], а для левосторонней — наоборот, то есть [cht]\vec{i}\vec{j}=k, \vec{j}\vec{i}=-k[/cht]. и далее для остальных компонент — то же самое.

аналогично при переводе кватерниона в матрицу по формуле
Изображение
знаки множителей на двух побочных диагоналях на самом деле зависят от ориентированности системы координат.

на самом деле если копнуть глубже, то дело именно в том, что ось кватерниона — это псевдовектор и по сути вращения можно не менять, но тогда этот псевдовектор будет вращать вектора в противоположные стороны в зависимости от ориентированности системы координат. если же мы хотим, чтобы вращение всегда было в одном направлении, знаки в произведениях гиперкомплексных базисных векторов(а, следовательно, и в фомулах действия кватерниона на вектор для левосторонней системы координат) нужно поменять на противоположные.

житейская аналогия — это векторные произведения, которые при умножении реальных векторов тоже являются псевдовекторами. в правосторонней системе координат выполняются равенства векторных произведений:
[cht]\vec x \time \vec y = \vec z, \vec y \time \vec z = \vec x, \vec z \time \vec x = \vec y[/cht].
в левосторонней же множители меняются местами:
[cht]\vec y \time \vec x = \vec z, \vec z \time \vec y = \vec x, \vec x \time \vec z = \vec y[/cht]
что на самом деле эквивалентно смене знаков:
[cht]\vec x \time \vec y = -\vec z, \vec y \time \vec z = -\vec x, \vec z \time \vec x = -\vec y[/cht]

Правка: 5 авг. 2017 19:35

iKestПостоялецwww5 авг. 201719:22#59
Suslik
qq' = [ v×v' + w×v' + w'×v, w×w' – v•v' ]

Т.е. ты думаешь, что в векторном произведении надо домножать на эпсилон, для учёта ориентации (+1 правая, -1 левая)?

Правка: 5 авг. 2017 19:25

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

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

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