如何将THREE.js相机或对象的旋转与Unity GameObject的变换匹配?
Unity使用ZXY欧拉角顺序的左手坐标系,而THREE.js使用XYZ欧拉角顺序的右手坐标系。
需要进行哪些转换才能将GameObject.transform.rotation
(四元数)转换为Object3D.rotation
(THREE.Vector3)?
如何将THREE.js相机或对象的旋转与Unity GameObject的变换匹配?
Unity使用ZXY欧拉角顺序的左手坐标系,而THREE.js使用XYZ欧拉角顺序的右手坐标系。
需要进行哪些转换才能将GameObject.transform.rotation
(四元数)转换为Object3D.rotation
(THREE.Vector3)?
// 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。
转换到three.js:
位置:翻转x轴,因为那是唯一不同的轴。
旋转:如果您有四元数,请将其转换为欧拉角,然后翻转旋转的y和z组件,然后设置顺序为“ZXY”。我们必须翻转y和z的原因是在这个示例中,unity和threejs的y和z轴方向相同,所以它们相反地旋转;翻转确保它们以相同的方向旋转。顺序设置为“ZXY”,因为这是unity旋转的顺序。
示例2:Unity的初始加载位置是x-右,y-上,z-向后
转换为three.js:
位置:翻转z轴,因为那是唯一不同的轴。
旋转:四元数 -> 欧拉角,翻转x和y,设置顺序为“ZXY”。与上述相同的推理。
正如您从这两个示例中所看到的,模型在unity和three.js中的起始位置会影响我们在它们之间转换位置和旋转的方式。
x *= -1
,但似乎不正确。 - Simon Cave