Войти
ПрограммированиеФорумГрафика

И опять эти кватернионы(((...

Страницы: 1 2 3 4 Следующая »
#0
16:15, 5 апр. 2018

Здравствуйте, уважаемые участники жизни форума!

Тема изъезженная 100 раз, причем 200 раз из них на этом форуме), но спрошу в очередной раз.

Для начала (повторюсь, что форум перечитал и предугадываю серию полезных вопросов) отвечу: Зачем тебе кватернионы? - Не за чем. Абсолютно. Тем более, что я их никак понять не могу. Есть более простое решение - я буду рад вашему предложению!
Теперь предисловие: управление космическим кораблем в космосе. Вращение корабля по всем осям: тангаж и на выбор пользователя либо рысканье, либо крен (а если придумаю, как это все уместить в интерфейсе, то и то, и другое, и третье). Углы Эйлера я отбросил сразу, прочитав про их недостатки. Сделал таким образом: при инициализации создаем объекту матрицу (почему объекту - потому что точно такими же свойствами, как и камера - она же и наш корабль, обладают и другие корабли, которые летают вокруг). Масштабируем, сдвигаем, поворачиваем, сохраняем. На каждом кадре есть некоторые повороты по всем осям (в данном случае уже локальным осям объекта), так как он может находиться в абсолютно любом положении, относительно глобальной системы (ГСК). Что я делаю, сдвигаю матрицу объекта в начало координат, создаю кватернионы из осей его матрицы и с нужными мне углами, из них матрицы поворота, вращаю матрицу объекта  этими матрицами возвращаю матрицу на свое место в ГСК. И все работает прекрасно. Прекрасно управляется корабль, прекрасно летают и ориентируются в пространстве враги, кроме одного большого НО. Через пару минут матрицы объектов перестают быть ортогональными. Из-за множественных вычислений с одной и той же матрицей копится ошибка.

Поэтому решил перейти на кватернионы. Очень многие (опять же на этом форуме)  утверждают, что для однозначного определения положения тела в пространстве достаточно одного кватерниона. Как-то это не укладывается в моей голове. Если мы представим себя внутри шара и будем смотреть на  его поверхность изнутри, то изменение направление нашего  взгляда однозначно умещается в один кватернион. А как же тогда наклон головы при этом?  Он уже в этот кватернион никак не умещается.  Отсюда сделал вывод, что мне нужны два. Завел нулевые кватернионы для тангажа и для рыскания. На каждом шаге считаю новый кватернион для изменения тангажа на данном шаге, домножаю исходный аккумулирующий кватернион на этот кватернион изменения. То же со вторым кватернионом. 2 кватерниона аккумулируют во времени все вращения, происходящие с объектом. Далее собирается кадр: берем наши кватернионы перемножаем для получения итогового вращения, делаем из  него матрицу поворота и вращаем единичную матрицу. Потом ее уже масштабируем, сдвигаем куда надо и по ней строим объект. И получается полное Г. Полный разворот тангажом - прекрасно работает, то же самое с рысканием. Но как только начинаем сочетать одновременно оба направления, тут получается полная каша. Итак собственно вопросы:

1. Есть ли предложения как упростить всю эту реализацию?
2. Если нет, то что в моих расчетах неверно?
3. Кватернион, создаваемый на каждом шаге и отображающий изменения данного шага строится на основе вектора (х или у) локальной системы координат объекта или на основе ГСК? Пробовал итак, итак - разница есть, но проблему не решает абсолютно.
4. Порядок перемножения кватернионов: аккумулирующий * кватернион данного шага, или наоборот. Пробовал итак, итак - разница есть, но проблему не решает абсолютно.
5. Перемножение двух аккумулирующих кватернионов перед  созданием матрицы поворота в каком порядке? Тангаж * рыскание, или наоборот, или как-то надо высчитывать порядок для каждого положения объекта? Пробовал итак, итак - разница есть, но проблему не решает абсолютно.
6. Попробовал строить отдельно 2 матрицы поворота из двух кватернионов. И сначала единичную вращаем первой матрицей, затем результат вращаем второй матрицей, потом уже двигаем. Изменения какие-то есть, но проблему не решает абсолютно.
7. Будут ли аккумулирующие кватернионы накапливать ошибку так же, как и матрицы при данном способе? И может быть просто прибегнуть к ортогонизации матрицы, хотя везде пишут, что это очень тяжелая операция.


#1
16:30, 5 апр. 2018

Bald
> 2. Если нет, то что в моих расчетах неверно?
Bald
> Отсюда сделал вывод, что мне нужны два

Bald
> для однозначного определения положения тела в пространстве достаточно одного
> кватерниона

#2
17:15, 5 апр. 2018

Большое спасибо за исчерпывающий ответ!

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

#3
17:26, 5 апр. 2018

Bald
> Если мы представим себя внутри шара и будем смотреть на  его поверхность
> изнутри, то изменение направление нашего  взгляда однозначно умещается в один
> кватернион. А как же тогда наклон головы при этом?  Он уже в этот кватернион
> никак не умещается.
в кватернионе 4 переменных
3 направление взгляда и еще 1 - как раз для наклона головы
http://wat.gamedev.ru/articles/quaternions

#4
17:37, 5 апр. 2018

Bald
> Большое спасибо за исчерпывающий ответ!
К сожалению, давать более исчерпывающий ответ бессмысленно, когда самое начало "вопроса" ошибочно.

> Все эксперименты  я начал именно с одного. Там картинка получалась еще более
> неоднозначна, чем с использованием двух.
Сравнивать правильность нерабочих вещей — так себе занятие.
Любое вращение в 3D описывается одним кватернионом.
Иногда их нужно больше. Твоя задача в это "иногда" не входит.

#5
17:38, 5 апр. 2018

>то изменение направление нашего взгляда однозначно умещается в один кватернион. А как же тогда наклон головы при этом?
Изменение направления взгляда однозначно умещается в один вектор. А вот наклон головы это как раз уже кватернион.

>Очень многие (опять же на этом форуме) утверждают, что для однозначного определения положения тела в пространстве достаточно одного кватерниона.

Для однозначного положения тела в пространстве нужны кватернион и вектор (или для упрощения вычислений два кватерниона).  Кватернион определяет только углы наклона относительно базиса.

#6
18:09, 5 апр. 2018

Bald
> Отсюда сделал вывод, что мне нужны два. Завел нулевые кватернионы для тангажа и
> для рыскания.
Как взять кватернионы, и превратить их в углы Эйлера.

#7
18:17, 5 апр. 2018

Изменение направления взгляда однозначно умещается в один вектор. А вот наклон головы это как раз уже кватернион.
Здесь ключевое слово ИЗМЕНЕНИЯ, а не направление! А то, что направление - это вектор, это по-моему ежу понятно. Так вот изменение одновременно может быть и направления взгляда и наклона. Я же описал картину.

Кватернион определяет только углы наклона относительно базиса.
Опять же. Относительно какого базиса? Относительно локального для объекта, или относительно мирового?

Как взять кватернионы, и превратить их в углы Эйлера.
Я вроде упомянул в вопросе, что не понимаю кватернионы. Поэтому пользуюсь наощупь.

Eugene
Много читал ваших таких же бесполезных ответов в других темах. Нет желания помочь, смысл тогда отвечать? Показать свой накопленный опыт? Я помощи просил, а не оценку своих знаний!

#8
18:24, 5 апр. 2018

Bald
> Много читал ваших таких же бесполезных ответов в других темах
Интересно, где ты их нашел?
Я уже довольно давно снизил активность на этом сайте до минимума.

> Я помощи просил, а не оценку своих знаний!
Никто не сможет помочь тебе, если ты не хочешь помочь себе сам.
Я уже ну почти прямым текстом сказал, что тебе нужно сделать.
Могу повторить, если ты вдруг не понял.
Выкинуть к чертовой матери второй кватернион.
А уже потом можно будет разбираться с остальными проблемами.

#9
18:36, 5 апр. 2018

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

P.S. Но все равно, прошу прощения. Я уже на нервах))) Неделю с ними бьюсь.

Хорошо, я беру один кватернион. Я смотрю прямо и голова ровно. Я поворачиваю шею вправо и при этом наклоняю голову. Представим, что это все происходит за  один шаг. Нос описывает ровную дугу параллельно пола, но при этом макушка головы описывает совсем другую дугу, постепенно приближаясь к полу, так как  голова наклоняется. Это одновременно описывается одним кватернионом? (Я следую из опыта матриц, что здесь понадобится 2 преобразования).

#10
18:38, 5 апр. 2018

Bald
http://mathworld.wolfram.com/EulerParameters.html
А когда научишься считать степени свободы, тогда можно будет и вернуться на форум.

#11
18:41, 5 апр. 2018

Bald
> Нос описывает ровную дугу параллельно пола, но при этом макушка головы
> описывает совсем другую дугу, постепенно приближаясь к полу, так как  голова
> наклоняется. Это одновременно описывается одним кватернионом?
Да.
То, что это два преобразования (хоть десять), не значит, что их нужно хранить раздельно.
Комбинация N преобразований — это всегда преобразование.
Накидываешь к кватерниону все нужные преобразования с выбранной стороны (левое/правое умножение зависит от принятого соглашения)

#12
18:46, 5 апр. 2018

Eugene
Спасибо. Буду дальше долбить в эту сторону, хотя сам от этого ушел.

Delfigamer
Ты, смотрю, в модераторы записался?

#13
18:56, 5 апр. 2018

Delfigamer
> Ну смотри, сколько, по-твоему, нужно параметров, чтобы указать направление
> луча?
Я спрашивал сколько мне надо параметров, чтобы повернуть луч? У меня объект, состоящий из сотни лучей, и как я описал выше они при общем повороте двигаются по совсем разным направлениям относительно друг друга. И, повторюсь, у меня не проблема повернуть объект. У меня проблема вращать его долго и счастливо, без нарушения геометрии.

Eugene, и самый главный вопрос остался в силе. При аккумулировании трансформаций в кватернионе в нем также будет накапливаться ошибка, которая приведет к неортогональности базиса модели, либо она будет существенно мала  даже при долгом аккумулировании? По сути вопрос, главным образом, у меня в этом.

#14
19:01, 5 апр. 2018

Bald
Ну смотри, сколько, по-твоему, нужно параметров, чтобы указать направление луча?

Упс, время потерялось в процессе редактуры.
Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.