如何将 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 中应用以下转换:qzqw
// 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 比例。