【问题标题】:Convert Unity transforms to THREE.js rotations将 Unity 转换转换为三个.js 旋转
【发布时间】:2013-08-05 19:53:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: 3d unity3d three.js unityscript quaternions


    【解决方案1】:

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

    假设您从 Unity 的四元数中获得 qxqyqzqw,我们在 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)。也许有人可以验证。
    • 你知道从Unity的欧拉角到three.js的过程吗?
    【解决方案2】:

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

    以下是 2 个示例:

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

    要转换成three.js:

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

    Rotation:如果有四元数,将其转换为 Euler,然后翻转旋转的 y 和 z 分量,然后将 order 设置为“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中模型的起始位置影响了我们如何转换它们之间的位置和旋转。

    【讨论】:

      【解决方案3】:

      如果将两个旋转都转换为四元数,我认为区别在于 X 轴上的 -1 比例。

      【讨论】:

      • 我已尝试将 Unity 四元数 XYZW 值复制到 THREE.Quaternion 和 x *= -1 中,但这似乎不正确。
      • 如果你要从一到三,欧拉 > quat, quat > 矩阵, matrix * matrix.scale(-1, 1, 1), matrix > quat。这会产生与 euler > quat > quat.x *= -1 相同的 quat 吗?
      猜你喜欢
      • 1970-01-01
      • 2016-11-02
      • 2013-11-12
      • 1970-01-01
      • 2017-07-26
      • 2010-12-06
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      相关资源
      最近更新 更多