UniVRMの座標系変換について
Mon, Apr 16, 2018UniVRMは、インポート・エクスポート時に自動で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;
}