2012-02-21 424 views
7

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

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

所以我用帮助在http://threejs.org/io/s/quaternion和发现,THREE.Object3D具有性能四元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/)。

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

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

有没有更多的由场景加载器引发的错误信息,具体说明什么它不喜欢使用四元数? – 2012-02-29 22:13:57

+0

好的,错误是由于缺少“旋转”属性造成的。场景加载器可能根本不加载四元数旋转。 – NightElfik 2012-03-06 10:47:04

回答

4

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

问题出现在场景加载程序中,它不适用于四元数旋转。我重写了场景生成脚本以直接在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); 

后来我发现魔法属性eulerOrderTHREE.Object3D这是在默认情况下这是导致我的问题(问题附图片)设置为“XYZ”,我的四元数,欧拉转换的目的是为'YZX',所以我改变了。

mesh.eulerOrder = 'YZX'; 

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

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