Search code examples
3dunity-game-enginethree.jsunityscriptquaternions

Convert Unity transforms to THREE.js rotations


How can I match the rotation of a THREE.js camera or object to a transform from a Unity GameObject?

Unity uses a left-handed system with a ZXY euler order. THREE.js uses a right-handed system with an XYZ euler order.

What transformations need to be made to convert GameObject.transform.rotation (Quaternion) to Object3D.rotation (THREE.Vector3)?


Solution

  • We ended up fixing this as follows:

    Assuming you get qx, qy, qz and qw from Unity's quaternion, we apply the conversion below in 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 );
    

    That worked correctly in all axis rotations and directions.

    three.js r.59