座標系の変換
UniVRMは、インポート・エクスポート時に座標変換を実行しています。
右 | 上 | 前 | 掌性 | UV原点 | ||
---|---|---|---|---|---|---|
Unity | +X | +Y | +Z | 左手 | 左下 | |
VRM-0 | +X | +Y | -Z | 右手 | 左上 | |
VRM-1 | -X | +Y | +Z | 右手 | 左上 | |
glTF | +Y | 右手 | 左上 | デフォルトはVRM-0方式。オプションでVRM-1方式を選べます |
UV
以下のように変換します。
V^{\prime} = 1 - V
Unity ↔️ VRM0
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;
}
Unity ↔️ VRM1
X軸を反転します。