И снова про кватернионы

02 сентября 2016 15:17
Здравствуйте, я все пытаюсь разобраться в кватернионах.
У меня есть такая задача: есть сфера, в разных точках этой сферы нужно ставить копии 3д объектов, с соответствующим поворотом конечно,
Я рассуждаю так:
Нужно найти вектор от центра сферы до точки куда я буду ставить
Текущий поворот объекта который я буду ставить
Из этого поворота получить вектор с помощью quat_to_dir
и по двух векторам функцией m_util.rotationTo получить кватернион и задать объекту,
Но так не выходит, начальный поворот нулевой, и к желающему результату это не приводит.
Или я рассуждаю не правильно?
02 сентября 2016 18:40
И еще про кватернионы, есть у меня все та же планета и корабль, корабль летит по сфере в точку над нажатой точкой на планете, и задача состоит в том чтобы до того как полететь развернуть корабль в сторону точки.
То есть чтобы его нос по направлению к точке в которую он летит.
Как поступать в таких случаях? чтобы не центр корабля смотрел на точку, а какая-то его часть
03 сентября 2016 12:19
Тоже интересен вопрос с кватернионами. Подготовил пример, где по клику по планете на эту точку прилетает корабль. Но как направить носом в нужную сторону, пока не знаю…

Сорцы прилагаю
Не стой, где попало… Попадет еще раз.
http://naviris.ru/
04 сентября 2016 13:51
Предлагаю такой алгоритм

Нужно всегда различать поворот и перемещение. То есть сначала определяем где будет находиться новый центр объекта, а потом куда он будет смотреть (можно и наоборот, и даже одновременно, используя векторы TSR).

Далее нужно понять, сохранять ли исходные пермещение и поворот. Если да, то нам нужно рассчитать относительное перемещение и прибавить (в случае с перемещением это будет вектор) или умножить (в случае с поворотом это будет кватернион) к/на текущим значениям. Если перемещение абсолютное (то есть мы знаем где будет находиться), то сразу выставляем полученные значения на объекте.

Рассмотрим первый пример: выставить объект на сфере.

По-видимому трансформация будет абсолютной. Всё что нам нужно, это знать центр сферы и координаты на сфере (удобнее в форме двух углов, как на глобусе). Для определения позиции считаем вектор перемещения с помощью двух кватернионов, изображающих два угла (перемножаем кватернионы, умножаем на вектор), прибавляем к вектору центра и получаем итоговую позицию объекта. С поворотом ещё проще, это будут два перемноженных кватерниона, полученных на предыдущем пункте.

Второй и третий пример: поворот объекта в нужном направлении.

Находим куда смотрит объект без поворота (зависит от того, как он моделируется), например объект смотрит в сторону оси Z (на нас). Далее берём относительный вектор куда направлена точка (вычитая из абсолютной позиции точки текущую позицию объекта). С помощью quat.rotationTo() вычисляем относительный поворот по этим двум векторам. Берём кватернион с объекта, умножаем, записываем результат на объект.

В любом случае, если не получается с первого раза, всегда разбивайте задачу на этапы: поворот отдельно от перемещения.
Команда Blend4Web
https://twitter.com/AlexKowel
05 сентября 2016 16:49
Здравствуйте, с элементом на сфере вроде получилось, спасибо..
А вот про нос корабля, я немного не понял, ведь по-сути нам нужен поворот не к точке в которую летим, и даже не к точке над той точкой, а поворот в сторону будущего движения. То есть в моем случае поворот по одной оси вокруг центра корабля.
А сейчас у меня получается что он весь разворачивается к точке, что смотрится неестественно.
05 сентября 2016 17:24
Попробуйте нарисовать траекторию и показать нам, не до конца понятно.
Команда Blend4Web
https://twitter.com/AlexKowel
06 ноября 2016 12:16
Вопрос) Как зная значения вектора поворота получить угол в градусах по одной из осей?
19 ноября 2016 14:44
Хотел предложить углы эйлера, а в текущем релизе сломали эту функцию.
В данной строчке переменная euler не определена.

Ну расковырял другую библиотеку, достал от туда алгоритм. Вставил в пример. Конвертирую кватернионы в углы эйлера. (смотри в консоль, там углы камеры будут)
rotation_euler.zip
Не стой, где попало… Попадет еще раз.
http://naviris.ru/
19 ноября 2016 20:04
Хотел предложить углы эйлера, а в текущем релизе сломали эту функцию.
В данной строчке переменная euler не определена.
Спасибо, Кирилл.
Починим эту функцию в ближайшем релизе.
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.