VRM - humanoid 3d avatar format for VR
  •  About coordinate system transformation of UniVRM(en)
  • UniVRMの座標系変換について

    UniVRMは、インポート・エクスポート時に自動でGLTFとの座標変換を実行しています。

    VRMの座標系

    VRMはGLTFの拡張なので、GLTFの座標系に準拠します。 OpenGL標準の右手系Y-UP座標系です。

    • 右:X+
    • 上:Y+
    • 前:Z-

    Unityの座標系

    左手系Y-UP座標系です。

    • 右:X+
    • 上:Y+
    • 前:Z+(+-が反転)

    各値の変換

    Z軸を反転します。

    Vector3(Position, Normalなど)

    public static Vector3 ReverseZ(this Vector3 v)
    {
        return new Vector3(v.x, v.y, -v.z);
    }

    Quaternion(Rotation)

    public static Quaternion ReverseZ(this Quaternion q)
    {
        float angle;
        Vector3 axis;
        q.ToAngleAxis(out angle, out axis);
        return Quaternion.AngleAxis(-angle, ReverseZ(axis));
    }

    Matrix(BindMatrices)

    スケール値が入っているとうまくいきません

    public static Matrix4x4 ReverseZ(this Matrix4x4 m)
    {
    #if UNITY_2017_1_OR_NEWER
        m.SetTRS(m.GetColumn(3).ReverseZ(), m.rotation.ReverseZ(), Vector3.one);
    #else
        m.SetTRS(m.ExtractPosition().ReverseZ(), m.ExtractRotation().ReverseZ(), Vector3.one);
    #endif
        return m;
    }
    VRM - humanoid 3d avatar format for VR