VRM - humanoid 3d avatar format for VR

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