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