如何在Three.js中从欧拉得到原始旋转四元数
How to get the original rotation Quaternion from the Euler in 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
你的脚本有两个问题。
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),
}
这里 fiddle 有更正
我有一个根据旋转四元数计算的欧拉。我想存储欧拉,然后将其加载到其他地方以计算原始四元数。我怎样才能做到这一点?
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
你的脚本有两个问题。
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),
}
这里 fiddle 有更正