如何将THREE.js相机或对象的旋转与Unity GameObject的变换相匹配?
Unity使用左手系统和ZXY euler命令。 THREE.js使用右手系统和XYZ euler命令。
需要进行哪些转换才能将GameObject.transform.rotation
(四元数)转换为Object3D.rotation
(THREE.Vector3)?
答案 0 :(得分:3)
我们最终修改如下:
假设您从Unity的四元数中获得qx
,qy
,qz
和qw
,我们会在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
要转换为three.js:
位置:翻转x,因为这是唯一一个不同的轴。
旋转:如果有四元数,请将其转换为Euler,然后翻转旋转的y和z分量,然后将顺序设置为“ ZXY”。我们必须翻转y和z的原因是因为在此示例中,y轴和z轴的统一轴和Threejs轴的方向相同,因此它们的旋转方向相反。翻转可确保它们沿相同方向旋转。该订单设置为“ ZXY”,因为这是单位正在旋转的订单。
示例2:Unity的初始加载位置为x向右,y向和z向后
要转换为three.js:
位置:翻转z,因为这是唯一一个不同的轴。
旋转:四元数-> Euler,翻转x和y,将顺序设置为“ ZXY”。与上述相同。
从两个示例中可以看到,模型在unity和three.js中的起始位置会影响我们如何转换它们之间的位置和旋转。
答案 2 :(得分:0)
如果将两个旋转转换为四元数,我认为X轴上的差异是-1比例。