Как получить исходный Кватернион вращения из Эйлера в Three.js

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

const rot = new THREE.Quaternion(-0.00122, 0.98602, -0.15773, -0.05371);
const {x, y, z} = new THREE.Euler().setFromQuaternion(
        rot,
        'YXZ',
      );
 // How to make rot1 euqal to rot (as close as possible)?
 const rot1 = new THREE.Quaternion().setFromEuler(new THREE.Euler(x, y, z));
 console.log(rot); // Quaternion {_x: -0.00122, _y: 0.98602, _z: -0.15773, _w: -0.05371}
 console.log(rot1); // Quaternion {_x: 0.0012199961779640698, _y: -0.9860197701687391, _z: -0.15688998318156033, _w: 0.056116464812051764}
 console.log(rot1.inverse()); // Quaternion {_x: -0.0012199961779640698, _y: 0.9860197701687391, _z: 0.15688998318156033, _w: 0.056116464812051764}

Маршрут неверный, и ошибка w кажется слишком большой. Вот fiddlejs


person Hengstar    schedule 01.03.2020    source источник


Ответы (1)


Здесь есть две проблемы с вашим скриптом.

1) Порядок оси вращения Эйлера 'YXZ' отсутствует при создании кватерниона под углом Эйлера:

const rot1 = new THREE.Quaternion().setFromEuler(new THREE.Euler(x, y, z, 'YXZ'));

2) Кватернион и угол Эйлера имеют разную точность. Используйте функцию, чтобы получить меньшую точность при преобразовании угла Эйлера в Кватернион:

 // Update decimal precision
 const decimalPrecision = 100000;
 function updatePrecision(input) {
    return Math.round(input*decimalPrecision) / decimalPrecision;
 }

 const rot1SmallerPrecition = {
    x: -updatePrecision(rot1.x),
    y: -updatePrecision(rot1.y),
    z: -updatePrecision(rot1.z),
 }

Здесь скрипка с исправлениями

person Damien Leroux    schedule 01.03.2020
comment
Это достаточно хорошо. Спасибо Дэмиен. Почему для получения исходного кватерниона все еще нужно все отрицать? Есть ли более простой способ добраться до него, если меня не волнует точность? - person Hengstar; 01.03.2020
comment
Quaternion.inverse кажется только обратным x, y, z, а не w - person Hengstar; 01.03.2020