如何在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具有属性quaternion和useQuaternion,但它似乎不起作用,错误由场景加载器引发(可能是因为缺少“旋转”属性,参见最后的编辑):
"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