8

如何将 THREE.js 相机或对象的旋转与 Unity GameObject 的变换相匹配?

Unity 使用具有 ZXY 欧拉顺序的左手系统。THREE.js 使用带有 XYZ 欧拉顺序的右手系统。

需要进行哪些转换才能将GameObject.transform.rotation(Quaternion) 转换为Object3D.rotation(THREE.Vector3)?

4

3 回答 3

7

我们最终解决了这个问题:

假设您从 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

于 2013-08-07T16:50:36.997 回答
5

关键是在unity和threejs之间匹配模型的初始加载位置。接受的答案可能仅适用于其中 1 个匹配项;但不是所有的。

下面是2个例子:

示例1:Unity初始加载位置为x-left、y-up、z-forward

样品 1

转换为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中模型的起始位置影响了我们如何转换它们之间的位置和旋转。

于 2018-10-26T21:23:58.260 回答
0

如果将两个旋转都转换为四元数,我认为差异是 X 轴上的 -1 比例。

于 2013-08-05T20:07:37.383 回答