Sim*_*ave 7 3d quaternions unity-game-engine three.js unityscript
如何将 THREE.js 相机或对象的旋转与 Unity GameObject 的变换相匹配?
Unity 使用具有 ZXY euler 阶数的左手系统。THREE.js 使用具有 XYZ euler 阶数的右手系统。
需要进行哪些转换才能将GameObject.transform.rotation
(Quaternion)转换为Object3D.rotation
(THREE.Vector3)?
小智 7
我们最终解决了这个问题:
假设你得到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 );
Run Code Online (Sandbox Code Playgroud)
这在所有轴旋转和方向上都能正常工作。
三.js r.59
小智 5
关键是要匹配unity和 Threejs之间模型的初始加载位置。接受的答案可能只适用于其中一场比赛;但不是所有的。
以下是 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 向右、y 向上和 z 向后
转换为 Three.js:
位置:翻转 z 轴,因为这是唯一不同的轴。
旋转:四元数->欧拉,翻转x和y,将顺序设置为“ZXY”。道理和上面一样。
从两个示例中可以看出,unity 和 Three.js 中模型的起始位置会影响我们在它们之间转换位置和旋转的方式。