如何将 THREE.js 相机或对象的旋转与 Unity GameObject 的变换相匹配?
Unity 使用具有 ZXY 欧拉顺序的左手系统。THREE.js 使用带有 XYZ 欧拉顺序的右手系统。
需要进行哪些转换才能将GameObject.transform.rotation
(Quaternion) 转换为Object3D.rotation
(THREE.Vector3)?
如何将 THREE.js 相机或对象的旋转与 Unity GameObject 的变换相匹配?
Unity 使用具有 ZXY 欧拉顺序的左手系统。THREE.js 使用带有 XYZ 欧拉顺序的右手系统。
需要进行哪些转换才能将GameObject.transform.rotation
(Quaternion) 转换为Object3D.rotation
(THREE.Vector3)?
我们最终解决了这个问题:
假设您从 Unity 的四元数中获得qx
、和qy
,我们在 JavaScript / Three.JS 中应用以下转换:qz
qw
// 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 );
这在所有轴旋转和方向上都能正常工作。
三.js r.59
关键是在unity和threejs之间匹配模型的初始加载位置。接受的答案可能仅适用于其中 1 个匹配项;但不是所有的。
下面是2个例子:
示例1:Unity初始加载位置为x-left、y-up、z-forward
转换为three.js:
位置:翻转 x,因为这是唯一不同的轴。
旋转:如果有四元数,将其转换为欧拉,然后翻转旋转的y和z分量,然后将顺序设置为“ZXY”。我们之所以要翻转y和z,是因为在这个样本中,unity和threejs的y和z轴方向相同,所以它们的旋转方向相反;翻转确保它们沿相同的方向旋转。订单设置为“ZXY”,因为这是统一旋转的订单。
示例 2:Unity 初始加载位置为 x-right、y-up 和 z-backward
转换为three.js:
位置:翻转 z,因为这是唯一不同的轴。
旋转:四元数->欧拉,翻转x和y,设置顺序为“ZXY”。道理同上。
从两个例子可以看出,unity和three.js中模型的起始位置影响了我们如何转换它们之间的位置和旋转。
如果将两个旋转都转换为四元数,我认为差异是 X 轴上的 -1 比例。