Форум

Поворот объекта относительно локальной оси

30 января 2018 19:00
Получить значение поворота ЛЮБОГО объекта сцены в градусах (т.е. локальное положение относительно мира).
Например (angle_X, angle_Y, angle_Z). Например (45, 267, 310).
Внутри движка ориентация объектов хранится в виде кватернионов. Преобразование кватернион -> углы Эйлера не является однозначным в общем случае.
Не совсем понял про локальное относительно мира…
Если вам необходимо только знать значение поворота вокруг локальной оси Х, который вы производили, то проще всего будет запоминать его в логике приложения в явном виде.
Либо придется вычислять угол между проекциями векторов до и после поворота на кватернион на локальную плоскость YZ.
Команда Blend4Web - разработчик
Twitter
LinkedIn
30 января 2018 19:29
Внутри движка ориентация объектов хранится в виде кватернионов. Преобразование кватернион -> углы Эйлера не является однозначным в общем случае.
Видимо, я с этим и столкнулся несколькими постами выше, когда танцевал с Эйлерами.

Если вам необходимо только знать значение поворота вокруг локальной оси Х, который вы производили, то проще всего будет запоминать его в логике приложения в явном виде.
Да вот я об этом тоже подумал, вы подтвердили моё предположение.


Либо придется вычислять угол между проекциями векторов до и после поворота на кватернион на локальную плоскость YZ.
Наверное не подойдет, т.к. планирую загрузку данных из webstorage (а там еще и историю операций хранить - совсем вешалка), т.е. мне будет видно только последнее состояние системы, без предыстории.

Всё-таки непонятно, почему ваша формула
Math.acos(tmp_quat[3]) * 2

работает только "наполовину" - в точках 180,270,360 ок, а в остальных погрешности в пару градусов. Моих знаний не хватает.
30 января 2018 21:58
Всё-таки непонятно, почему ваша формула
Math.acos(tmp_quat[3]) * 2

работает только "наполовину" - в точках 180,270,360 ок, а в остальных погрешности в пару градусов. Моих знаний не хватает.
Понятие поворота вокруг одной из локальных осей координат (или оси заданой в локальной системе координат) возникает только при произвдении кватернионов, которое является последовательностью поворотов. Т.е. можно мыслить так: мы повернули локальную систему координат с помощью одного кватерниона, затем совершили еще поворот вокруг оси "зашитой" во второй кватернион, но уже определяя эту ось в повернутой на первом шаге системе координат.
Но в итоге мы получаем результирующий кватернион, в который зашита вообще говоря новая ось вращения (не из 1-го и 2-го исходных кватернионов). То есть угол получаемый по формуле не является углом поворота вокруг локальной (после поворота 1-ым кватернионом) оси Х объекта, отсюда и расхождения.


Наверное не подойдет, т.к. планирую загрузку данных из webstorage (а там еще и историю операций хранить - совсем вешалка), т.е. мне будет видно только последнее состояние системы, без предыстории.
Тут немного другое имелось ввиду, не история операций, но в любом случае, если есть возможность просто в логике приложения хранить необходимый угол, то это будет оптимальным и наиболее надежным способом
Команда Blend4Web - разработчик
Twitter
LinkedIn
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.