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

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

Поделиться

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

TrouyanПостоялецwww31 июля 201720:12#0
Добрый день.
Последнюю неделю бьюсь со следующей задачей:
Имею кватернион определяющий ориентацию в пространстве моего объекта. Данный кватернион выдает величины в правой системе координат.
Объект же вырисовываю в Unity , а там везде левая СК. И не зависимо от типа СК(левая или правая), порой возникает необходимость изменить направление какой-либо из оси для получения наклона (вращения) в другом направлении. Без особых проблем можно менять направления вращения в двух осях одновременно (т.е. в данном случае сохранятся изначальная правая СК), но изменить вращения только одной оси используя кватернионы не получается.

Сейчас решил пойти по следующему алгоритму:
1. Сделать преобразование : Кватернион -> Матрица поворотов
2. Получение матрицы поворотов в новой СК
3. Новая матрица поворотов -> новый кватернион

Жизнесопосбный ли данный алгоритм и даст ли он нужный мне результат?
На данный момент получается ерунда =). При перемножении матрицы поворота на матрицу перехода в новую(левую) СК, использую следующую матрицу перехода:
-1  0  0
0  1  0
0  0  1
И положительного эффекта не наблюдаю, направление не только не меняется, но и появились скачки (тут Я еще буду проверять алгоритм). Но если же просто повернуть базис например вокруг оси OZ используя следующую матрицу поворота
0  1  0
-1  0  0
0  0  1
То результат соответствует ожиданиям.

Весь инет перекопал, тема избитая, но готового решения ни где не встретил.
Заранее благодарю!

Правка: 1 авг. 2017 12:15

TrouyanПостоялецwww1 авг. 201719:05#1
Нашел вариант использования матрицы перехода:
      1  0  0
S=  0  1  0
      0  0  -1
New Matrix= S*M*S

Но данный вариант меняет направление сразу в двух осях. Т.е. тот же самый случай, что и в кватернионе поменять знаки в двух величинах =( А мне надо поменять направление только одной оси...
Понимаю что это легко сделать в углах Эйлера, но из gimbal lock данный метод не подходит...

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

iKestПостоялецwww1 авг. 201720:11#2
Может я чего-то не догоняю, но фраза "Данный кватернион выдает величины в правой системе координат" мне кажется слегка абсурдной....
TrouyanПостоялецwww1 авг. 201720:42#3
Кватернион берется с внешнего устройства на котором по умолчанию правая СК. В Unity левая СК. В итоге всегда как минимум одна ось направлена не в нужном направлении.
Но не зависимо от этого хочется иметь удобный инструмент для быстрой смены ОДНОЙ любой оси. Две поменять легко...а чтобы одну поменять, Я вторую неделю мучаюсь =(
alexzzzzПостоялецwww1 авг. 201722:29#4
Trouyan
> Но данный вариант меняет направление сразу в двух осях. Т.е. тот же самый
> случай, что и в кватернионе поменять знаки в двух величинах =( А мне надо
> поменять направление только одной оси...

Инверсия знака в одном компоненте кватерниона даёт не то что надо?

iKestПостоялецwww1 авг. 201722:46#5
>Кватернион берется с внешнего устройства на котором по умолчанию правая СК. В Unity левая СК. В итоге всегда >как минимум одна ось направлена не в нужном направлении

Ну тогда, если правый кватернион (a,b,c,d), то левый будет  (a,-b,-d,-c)

ЗЫ: Это для случая, когда в правой системе ось Z направлена вверх (3Ds Max), а в левой - ось Y (Unity).

ЗыЗы. Да, тут а это w в стандартном обозначении.

Правка: 1 авг. 2017 23:26

MrShoorУчастникwww1 авг. 201722:55#6
iKest
> Ну тогда, если правый кватернион (a,b,c,d), то левый будет  (a,-b,-d,-c)
Так просто это не работает. Нужно определить какая именно ось отражена наоборот на устройстве и флипать только эту ось.
FordPerfectПостоялецwww1 авг. 201722:58#7
[cht]r'_{right}=R_{right} \cdot r_{right}[/cht]
[cht]R_{right}=\begin{bmatrix}
1-(y^2+z^2) & xy - zw & xz + yw\\
xy + zw & 1-(x^2+z^2)  & yz - xw\\
xz - yw &  yz - xw & 1-(x^2+y^2)
\end{bmatrix}
[/cht]
[cht]r_{left}=T \cdot r_{right}[/cht]
[cht]T=\begin{bmatrix}
-1 & 0 & 0\\
0 & 1  & 0\\
0 &  0 & 1
\end{bmatrix}
[/cht]
[cht]r'_{left}=T \cdot R_{right} \cdot T^{-1} \cdot r_{left}[/cht]
[cht]r'_{left}=
\begin{bmatrix}
-1 & 0 & 0\\
0 & 1  & 0\\
0 &  0 & 1
\end{bmatrix} 
\cdot
\begin{bmatrix}
1-(y^2+z^2) & xy - zw & xz + yw\\
xy + zw & 1-(x^2+z^2)  & yz - xw\\
xz - yw &  yz - xw & 1-(x^2+y^2)
\end{bmatrix}
\cdot
\begin{bmatrix}
-1 & 0 & 0\\
0 & 1  & 0\\
0 &  0 & 1
\end{bmatrix} \cdot r_{left}[/cht]
[cht]r'_{left}=
\begin{bmatrix}
1-(y^2+z^2) & -(xy - zw) & -(xz + yw)\\
-(xy + zw) & 1-(x^2+z^2)  & yz - xw\\
-(xz - yw) &  yz - xw & 1-(x^2+y^2)
\end{bmatrix}
\cdot
r_{left}[/cht]
[cht]R_{left}=
\begin{bmatrix}
1-(y^2+z^2) & -(xy - zw) & -(xz + yw)\\
-(xy + zw) & 1-(x^2+z^2)  & yz - xw\\
-(xz - yw) &  yz - xw & 1-(x^2+y^2)
\end{bmatrix}
[/cht]
Легко видеть, что она получается из кватерниона [-x,y,z,-w].

Правка: 1 авг. 2017 23:00

iKestПостоялецwww1 авг. 201723:01#8
>Так просто это не работает. Нужно определить какая именно ось отражена наоборот на устройстве и флипать только эту ось.
С чего-то это? о_о
Исходная система (x,y,z), итоговая (x, z, y), плюс из за смены ориентации делаем реверс. Что сложного?
MrShoorУчастникwww1 авг. 201723:06#9
iKest
> С чего-то это? о_о
> Исходная система (x,y,z), итоговая (x, z, y), плюс из за смены ориентации
> делаем реверс. Что сложного?
Флип то конечно уйдет, но кватернион станет показывать совершенно другую ориентацию, и для того, чтобы получить праивльную ориентацию - придется доворачивать кватернион. Проще сразу флипнуть нужную ось.
iKestПостоялецwww1 авг. 201723:22#10
MrShoor
>Флип то конечно уйдет, но кватернион станет показывать совершенно другую ориентацию, и для того, чтобы получить праивльную ориентацию >- придется доворачивать кватернион. Проще сразу флипнуть нужную ось.
Ещё раз повторюсь - с чего-то это? Если можно - математически...

Правка: 1 авг. 2017 23:24

MrShoorУчастникwww1 авг. 201723:29#11
iKest
> Ещё раз повторюсь - с чего-то это? Если можно - математически...
 (-a, b, d, c) !=  (a, -b, d, c) !=  (a, b,-d, c)
А еще ты только  что гранату

Правка: 1 авг. 2017 23:29

FordPerfectПостоялецwww1 авг. 201723:46#12
Trouyan
>Но данный вариант меняет направление сразу в двух осях. Т.е. тот же самый случай, что и в кватернионе поменять знаки в двух величинах =(
Ну так и правильно делает же.
>А мне надо поменять направление только одной оси...
Гм?
FordPerfectПостоялецwww1 авг. 201723:53#13
Стоит Алиса перед зеркалом, вертит в руках апельсин.
Если она его крутит вокруг нормали к зеркалу - зазеркальный апельсин вращается в ту же сторону.
Если вокруг оси параллельной зеркалу - в противоположную.
TrouyanПостоялецwww2 авг. 20172:23#14
alexzzzz - конечно хотелось бы так просто, но с кватернионом такое не прокатит.
FordPerfect, делая флип результат такой:
Flip | Кватернион в новой системе координат
т.е. смена направления двух осей, дает тот же правый кватернион только с повернутыми на 180 градусов осями. В итоге имею смену направления сразу двух осей.... а надо изменить только одну =(

FordPerfect, так и делал - результат выше на картинке. Как была правая СК так и осталась...

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

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

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