如何在Three.js json场景中使用四元数旋转

我正在研究L系统解释器,我使用四元数作为旋转的内部表示。 我需要将结果导出到ThreeJs JavaScript场景,我发现json场景是最好的方法。

我在https://github.com/mrdoob/three.js/blob/master/examples/scenes/test_scene.js上发现了一个场景例子,但是没有关于四元数旋转的东西。

因此,我在http://threejs.org/io/s/quaternion上使用了帮助,发现THREE.Object3D具有属性quaternionuseQuaternion,但它似乎不起作用,错误由场景加载器引发(可能是因为缺少“旋转”属性,参见最后的编辑):

"obj": {
    ...
    "quaternion": [0.38268343236509,0,0,0.923879532511287],
    "useQuaternion": true
}

我也尝试将四元数转换为欧拉角,但它不适用于我,可能是因为其他角度的应用顺序(我假设为Y,Z,X)。 在上面的例子中,四元数表示围绕Z轴(音高)的135度旋转,将其转换为欧拉角[pi,pi,pi / 4],但在场景中显示不正确。

以下图片显示每个块比Z轴多旋转11度。 轴是X(红色),Y(绿色)和Z(蓝色)。 由于不正确的转换四元数到Euclid,上半部分被错误地旋转(我使用这个页面来实现:http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/)。


编辑:进一步检查后,由场景加载器引发的错误是因为缺少对象上的“旋转”属性。 以下输出不会抛出错误和场景被加载,但它是错误的(以与所示图像相同的方式),因为四元数旋转被忽略。

"obj": {
    ...
    "rotation": [3.14159265358979,3.14159265358979,0.785398163397449],
    "quaternion": [0.38268343236509,0,0,0.923879532511287],
    "useQuaternion": true
}

我想我解决了我的问题。 这不是我的问题的直接答案,只是我如何解决这个问题。

问题在场景加载器中,它不适用于四元数旋转。 我重写了场景生成脚本以直接在JS中生成场景。

var mesh = new THREE.Mesh(geometry, material);
... set position & scale ...
mesh.rotation.x = 3.141;
mesh.rotation.y = 3.141;
mesh.rotation.z = 0.785;
mesh.updateMatrix();
scene.add(mesh);

然后我发现THREE.Object3D魔法属性eulerOrder被设置为默认“XYZ”,这引起了我的问题(问题附图片),我的四元数,欧拉转换的目的是为“YZX”,让我改变了这一切。

mesh.eulerOrder = 'YZX';

而已。 我没有时间尝试使用场景加载器,但是如果可以使用场景加载器设置eulerOrder属性,而不是将其融入我的问题的第二部分。

最好的办法是直接在场景定义中设置四元数,但它可能需要在场景加载器本身中进行更改。

链接地址: http://www.djcxy.com/p/57643.html

上一篇: How to use quaternion rotation in Three.js json scene

下一篇: Get Website Title From User Site Input