Здравствуйте, уважаемые участники жизни форума!
Тема изъезженная 100 раз, причем 200 раз из них на этом форуме), но спрошу в очередной раз.
Для начала (повторюсь, что форум перечитал и предугадываю серию полезных вопросов) отвечу: Зачем тебе кватернионы? - Не за чем. Абсолютно. Тем более, что я их никак понять не могу. Есть более простое решение - я буду рад вашему предложению!
Теперь предисловие: управление космическим кораблем в космосе. Вращение корабля по всем осям: тангаж и на выбор пользователя либо рысканье, либо крен (а если придумаю, как это все уместить в интерфейсе, то и то, и другое, и третье). Углы Эйлера я отбросил сразу, прочитав про их недостатки. Сделал таким образом: при инициализации создаем объекту матрицу (почему объекту - потому что точно такими же свойствами, как и камера - она же и наш корабль, обладают и другие корабли, которые летают вокруг). Масштабируем, сдвигаем, поворачиваем, сохраняем. На каждом кадре есть некоторые повороты по всем осям (в данном случае уже локальным осям объекта), так как он может находиться в абсолютно любом положении, относительно глобальной системы (ГСК). Что я делаю, сдвигаю матрицу объекта в начало координат, создаю кватернионы из осей его матрицы и с нужными мне углами, из них матрицы поворота, вращаю матрицу объекта этими матрицами возвращаю матрицу на свое место в ГСК. И все работает прекрасно. Прекрасно управляется корабль, прекрасно летают и ориентируются в пространстве враги, кроме одного большого НО. Через пару минут матрицы объектов перестают быть ортогональными. Из-за множественных вычислений с одной и той же матрицей копится ошибка.
Поэтому решил перейти на кватернионы. Очень многие (опять же на этом форуме) утверждают, что для однозначного определения положения тела в пространстве достаточно одного кватерниона. Как-то это не укладывается в моей голове. Если мы представим себя внутри шара и будем смотреть на его поверхность изнутри, то изменение направление нашего взгляда однозначно умещается в один кватернион. А как же тогда наклон головы при этом? Он уже в этот кватернион никак не умещается. Отсюда сделал вывод, что мне нужны два. Завел нулевые кватернионы для тангажа и для рыскания. На каждом шаге считаю новый кватернион для изменения тангажа на данном шаге, домножаю исходный аккумулирующий кватернион на этот кватернион изменения. То же со вторым кватернионом. 2 кватерниона аккумулируют во времени все вращения, происходящие с объектом. Далее собирается кадр: берем наши кватернионы перемножаем для получения итогового вращения, делаем из него матрицу поворота и вращаем единичную матрицу. Потом ее уже масштабируем, сдвигаем куда надо и по ней строим объект. И получается полное Г. Полный разворот тангажом - прекрасно работает, то же самое с рысканием. Но как только начинаем сочетать одновременно оба направления, тут получается полная каша. Итак собственно вопросы:
1. Есть ли предложения как упростить всю эту реализацию?
2. Если нет, то что в моих расчетах неверно?
3. Кватернион, создаваемый на каждом шаге и отображающий изменения данного шага строится на основе вектора (х или у) локальной системы координат объекта или на основе ГСК? Пробовал итак, итак - разница есть, но проблему не решает абсолютно.
4. Порядок перемножения кватернионов: аккумулирующий * кватернион данного шага, или наоборот. Пробовал итак, итак - разница есть, но проблему не решает абсолютно.
5. Перемножение двух аккумулирующих кватернионов перед созданием матрицы поворота в каком порядке? Тангаж * рыскание, или наоборот, или как-то надо высчитывать порядок для каждого положения объекта? Пробовал итак, итак - разница есть, но проблему не решает абсолютно.
6. Попробовал строить отдельно 2 матрицы поворота из двух кватернионов. И сначала единичную вращаем первой матрицей, затем результат вращаем второй матрицей, потом уже двигаем. Изменения какие-то есть, но проблему не решает абсолютно.
7. Будут ли аккумулирующие кватернионы накапливать ошибку так же, как и матрицы при данном способе? И может быть просто прибегнуть к ортогонизации матрицы, хотя везде пишут, что это очень тяжелая операция.
Bald
> 2. Если нет, то что в моих расчетах неверно?
Bald
> Отсюда сделал вывод, что мне нужны два
Bald
> для однозначного определения положения тела в пространстве достаточно одного
> кватерниона
Большое спасибо за исчерпывающий ответ!
Если имелось ввиду использование одного кватерниона, то уточню. Все эксперименты я начал именно с одного. Там картинка получалась еще более неоднозначна, чем с использованием двух.
Bald
> Если мы представим себя внутри шара и будем смотреть на его поверхность
> изнутри, то изменение направление нашего взгляда однозначно умещается в один
> кватернион. А как же тогда наклон головы при этом? Он уже в этот кватернион
> никак не умещается.
в кватернионе 4 переменных
3 направление взгляда и еще 1 - как раз для наклона головы
http://wat.gamedev.ru/articles/quaternions
Bald
> Большое спасибо за исчерпывающий ответ!
К сожалению, давать более исчерпывающий ответ бессмысленно, когда самое начало "вопроса" ошибочно.
> Все эксперименты я начал именно с одного. Там картинка получалась еще более
> неоднозначна, чем с использованием двух.
Сравнивать правильность нерабочих вещей — так себе занятие.
Любое вращение в 3D описывается одним кватернионом.
Иногда их нужно больше. Твоя задача в это "иногда" не входит.
>то изменение направление нашего взгляда однозначно умещается в один кватернион. А как же тогда наклон головы при этом?
Изменение направления взгляда однозначно умещается в один вектор. А вот наклон головы это как раз уже кватернион.
>Очень многие (опять же на этом форуме) утверждают, что для однозначного определения положения тела в пространстве достаточно одного кватерниона.
Для однозначного положения тела в пространстве нужны кватернион и вектор (или для упрощения вычислений два кватерниона). Кватернион определяет только углы наклона относительно базиса.
Bald
> Отсюда сделал вывод, что мне нужны два. Завел нулевые кватернионы для тангажа и
> для рыскания.
Как взять кватернионы, и превратить их в углы Эйлера.
Изменение направления взгляда однозначно умещается в один вектор. А вот наклон головы это как раз уже кватернион.
Здесь ключевое слово ИЗМЕНЕНИЯ, а не направление! А то, что направление - это вектор, это по-моему ежу понятно. Так вот изменение одновременно может быть и направления взгляда и наклона. Я же описал картину.
Кватернион определяет только углы наклона относительно базиса.
Опять же. Относительно какого базиса? Относительно локального для объекта, или относительно мирового?
Как взять кватернионы, и превратить их в углы Эйлера.
Я вроде упомянул в вопросе, что не понимаю кватернионы. Поэтому пользуюсь наощупь.
Eugene
Много читал ваших таких же бесполезных ответов в других темах. Нет желания помочь, смысл тогда отвечать? Показать свой накопленный опыт? Я помощи просил, а не оценку своих знаний!
Bald
> Много читал ваших таких же бесполезных ответов в других темах
Интересно, где ты их нашел?
Я уже довольно давно снизил активность на этом сайте до минимума.
> Я помощи просил, а не оценку своих знаний!
Никто не сможет помочь тебе, если ты не хочешь помочь себе сам.
Я уже ну почти прямым текстом сказал, что тебе нужно сделать.
Могу повторить, если ты вдруг не понял.
Выкинуть к чертовой матери второй кватернион.
А уже потом можно будет разбираться с остальными проблемами.
Я уже довольно давно снизил активность на этом сайте до минимума.
А я и не говорил, что это были свежие посты.
P.S. Но все равно, прошу прощения. Я уже на нервах))) Неделю с ними бьюсь.
Хорошо, я беру один кватернион. Я смотрю прямо и голова ровно. Я поворачиваю шею вправо и при этом наклоняю голову. Представим, что это все происходит за один шаг. Нос описывает ровную дугу параллельно пола, но при этом макушка головы описывает совсем другую дугу, постепенно приближаясь к полу, так как голова наклоняется. Это одновременно описывается одним кватернионом? (Я следую из опыта матриц, что здесь понадобится 2 преобразования).
Bald
http://mathworld.wolfram.com/EulerParameters.html
А когда научишься считать степени свободы, тогда можно будет и вернуться на форум.
Bald
> Нос описывает ровную дугу параллельно пола, но при этом макушка головы
> описывает совсем другую дугу, постепенно приближаясь к полу, так как голова
> наклоняется. Это одновременно описывается одним кватернионом?
Да.
То, что это два преобразования (хоть десять), не значит, что их нужно хранить раздельно.
Комбинация N преобразований — это всегда преобразование.
Накидываешь к кватерниону все нужные преобразования с выбранной стороны (левое/правое умножение зависит от принятого соглашения)
Eugene
Спасибо. Буду дальше долбить в эту сторону, хотя сам от этого ушел.
Delfigamer
Ты, смотрю, в модераторы записался?
Delfigamer
> Ну смотри, сколько, по-твоему, нужно параметров, чтобы указать направление
> луча?
Я спрашивал сколько мне надо параметров, чтобы повернуть луч? У меня объект, состоящий из сотни лучей, и как я описал выше они при общем повороте двигаются по совсем разным направлениям относительно друг друга. И, повторюсь, у меня не проблема повернуть объект. У меня проблема вращать его долго и счастливо, без нарушения геометрии.
Eugene, и самый главный вопрос остался в силе. При аккумулировании трансформаций в кватернионе в нем также будет накапливаться ошибка, которая приведет к неортогональности базиса модели, либо она будет существенно мала даже при долгом аккумулировании? По сути вопрос, главным образом, у меня в этом.
Bald
Ну смотри, сколько, по-твоему, нужно параметров, чтобы указать направление луча?
Упс, время потерялось в процессе редактуры.
Тема в архиве.