我正在开发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 ,但它似乎无法正常工作,场景加载程序会引发错误(可能是由于缺少“ rotation”属性,参见末尾的EDIT):
我尝试将四元数转换为欧拉角,但是无法实现,可能是因为应用角度的顺序不同(我假设顺序为Y、Z、X)。在上面的例子中,四元数表示绕Z轴(俯仰)旋转135度,这被转换为欧拉角[pi,pi,pi/4],但在场景中显示不正确。
下图显示了每个块通过Z轴旋转比其他块多11度。轴是X(红色)、Y(绿色)和Z(蓝色)。由于将四元数错误地转换为欧几里得,所以上半部分被错误地旋转(我使用了这个页面进行实现:http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/)。
编辑:经过进一步检查,场景加载器引发的错误是因为对象缺少“rotation”属性。以下输出不会引发错误并且场景已加载,但是它是错误的(与图像显示的方式相同),因为四元数旋转被忽略了。
我在https://github.com/mrdoob/three.js/blob/master/examples/scenes/test_scene.js找到了一个场景的示例,但没有关于四元数旋转的内容。
因此,我在http://threejs.org/io/s/quaternion上寻求帮助,并发现 THREE.Object3D 具有属性 quaternion 和 useQuaternion ,但它似乎无法正常工作,场景加载程序会引发错误(可能是由于缺少“ rotation”属性,参见末尾的EDIT):
"obj": {
...
"quaternion": [0.38268343236509,0,0,0.923879532511287],
"useQuaternion": true
}
我尝试将四元数转换为欧拉角,但是无法实现,可能是因为应用角度的顺序不同(我假设顺序为Y、Z、X)。在上面的例子中,四元数表示绕Z轴(俯仰)旋转135度,这被转换为欧拉角[pi,pi,pi/4],但在场景中显示不正确。
下图显示了每个块通过Z轴旋转比其他块多11度。轴是X(红色)、Y(绿色)和Z(蓝色)。由于将四元数错误地转换为欧几里得,所以上半部分被错误地旋转(我使用了这个页面进行实现:http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/)。
![问题的说明](https://istack.dev59.com/DN65Q.webp)
编辑:经过进一步检查,场景加载器引发的错误是因为对象缺少“rotation”属性。以下输出不会引发错误并且场景已加载,但是它是错误的(与图像显示的方式相同),因为四元数旋转被忽略了。
"obj": {
...
"rotation": [3.14159265358979,3.14159265358979,0.785398163397449],
"quaternion": [0.38268343236509,0,0,0.923879532511287],
"useQuaternion": true
}