转换Unity转换为THREE.js旋转

时间:2013-08-05 19:53:39

标签: 3d unity3d three.js unityscript quaternions

如何将THREE.js相机或对象的旋转与Unity GameObject的变换相匹配?

Unity使用左手系统和ZXY euler命令。 THREE.js使用右手系统和XYZ euler命令。

需要进行哪些转换才能将GameObject.transform.rotation(四元数)转换为Object3D.rotation(THREE.Vector3)?

3 个答案:

答案 0 :(得分:3)

我们最终修改如下:

假设您从Unity的四元数中获得qxqyqzqw,我们会在JavaScript / Three.JS中应用以下转换:

// convert Quaternion from Left-handed coordinate system to Right-handed

var q = new THREE.Quaternion( -qx, qy, qz, -qw );

var v = new THREE.Euler();  
v.setFromQuaternion( q );

v.y += Math.PI; // Y is 180 degrees off

v.z *= -1; // flip Z

object.rotation.copy( v );

在所有轴旋转和方向上都能正常工作。

three.js r.59

答案 1 :(得分:3)

关键是要在unity和threejs之间匹配模型的初始加载位置。  接受的答案可能仅适用于其中的一场比赛;但不是全部。

下面是两个示例:

示例1:Unity初始加载位置为x左,y-up和z-forward

Sample 1

要转换为three.js:

位置:翻转x,因为这是唯一一个不同的轴。

旋转:如果有四元数,请将其转换为Euler,然后翻转旋转的y和z分量,然后将顺序设置为“ ZXY”。我们必须翻转y和z的原因是因为在此示例中,y轴和z轴的统一轴和Threejs轴的方向相同,因此它们的旋转方向相反。翻转可确保它们沿相同方向旋转。该订单设置为“ ZXY”,因为这是单位正在旋转的订单。

示例2:Unity的初始加载位置为x向右,y向和z向后

enter image description here

要转换为three.js:

位置:翻转z,因为这是唯一一个不同的轴。

旋转:四元数-> Euler,翻转x和y,将顺序设置为“ ZXY”。与上述相同。

从两个示例中可以看到,模型在unity和three.js中的起始位置会影响我们如何转换它们之间的位置和旋转。

答案 2 :(得分:0)

如果将两个旋转转换为四元数,我认为X轴上的差异是-1比例。