将Unity的变换转换为THREE.js的旋转

8

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

Unity使用ZXY欧拉角顺序的左手坐标系,而THREE.js使用XYZ欧拉角顺序的右手坐标系。

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

3个回答

8
我们最终解决了这个问题:
假设您从Unity的四元数中获得了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 );

在所有轴旋转和方向上都正确运作。

three.js版本为r.59。


如果这个答案是正确的,那么它意味着你可以直接从Unity四元数(qx, qy, qz, qw)转换到three.js四元数,就像这样:THREE.Quaternion(qz, qw, qx, qy)。也许有人可以验证一下。 - WestLangley
你知道如何从Unity的欧拉角转换到three.js的吗? - Eli Davis

5
关键是要匹配Unity和Threejs之间模型的初始加载位置。 接受的答案可能只适用于其中1个匹配;但不是全部。
以下是2个示例:
示例1:Unity的初始加载位置为x-左,y-上,z-前

Sample 1

转换到three.js:

位置:翻转x轴,因为那是唯一不同的轴。

旋转:如果您有四元数,请将其转换为欧拉角,然后翻转旋转的y和z组件,然后设置顺序为“ZXY”。我们必须翻转y和z的原因是在这个示例中,unity和threejs的y和z轴方向相同,所以它们相反地旋转;翻转确保它们以相同的方向旋转。顺序设置为“ZXY”,因为这是unity旋转的顺序。

示例2:Unity的初始加载位置是x-右,y-上,z-向后

enter image description here

转换为three.js:

位置:翻转z轴,因为那是唯一不同的轴。

旋转:四元数 -> 欧拉角,翻转x和y,设置顺序为“ZXY”。与上述相同的推理。

正如您从这两个示例中所看到的,模型在unity和three.js中的起始位置会影响我们在它们之间转换位置和旋转的方式。


0
如果您将两个旋转都转换为四元数,我认为它们之间的差异是X轴上的-1缩放。

我尝试将Unity Quaternion XYZW值复制到THREE.Quaternion中,并执行x *= -1,但似乎不正确。 - Simon Cave
如果你从Unity转向Three.js,那么欧拉角 > 四元数,四元数 > 矩阵,矩阵 * 矩阵.scale(-1, 1, 1),矩阵 > 四元数。这是否会产生与欧拉角 > 四元数 > 四元数.x *= -1 相同的四元数? - theodox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接