您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
62 行
1.8 KiB
62 行
1.8 KiB
using UnityEngine;
|
|
|
|
namespace UniVRM10
|
|
{
|
|
public struct TR
|
|
{
|
|
public Quaternion Rotation;
|
|
public Vector3 Translation;
|
|
|
|
public static TR Identity => new TR(Quaternion.identity, Vector3.zero);
|
|
|
|
public static TR FromWorld(Transform t) => new TR(t.rotation, t.position);
|
|
|
|
public static TR FromParent(Transform t) => t.parent != null ? FromWorld(t.parent) : TR.Identity;
|
|
|
|
public static TR FromLocal(Transform t) => new TR(t.localRotation, t.localPosition);
|
|
|
|
public static TR FromRelative(Transform t, Transform from)
|
|
{
|
|
var toRelative = from.worldToLocalMatrix;
|
|
return new TR(toRelative.rotation * t.rotation, toRelative.MultiplyPoint(t.position));
|
|
}
|
|
|
|
public TR(Quaternion r, Vector3 t)
|
|
{
|
|
Rotation = r;
|
|
Translation = t;
|
|
}
|
|
|
|
public TR(Quaternion r) : this(r, Vector3.zero)
|
|
{
|
|
}
|
|
|
|
public TR(Vector3 t) : this(Quaternion.identity, t)
|
|
{
|
|
}
|
|
|
|
public Matrix4x4 TRS(float s) => Matrix4x4.TRS(Translation, Rotation, new Vector3(s, s, s));
|
|
|
|
|
|
/// <summary>
|
|
/// R1|T1 R2|T2 x R1R2|R1T2+T1 x
|
|
/// --+-- --+-- y => ----+------- y
|
|
/// 0| 1 0| 1 z 0| 1 z
|
|
/// </summary>
|
|
/// <param name="a"></param>
|
|
/// <param name="b"></param>
|
|
/// <returns></returns>
|
|
public static TR operator *(TR a, TR b) => new TR(a.Rotation * b.Rotation, a.Rotation * b.Translation + a.Translation);
|
|
|
|
/// <summary>
|
|
/// R|0 1|T R|RT
|
|
/// -+- -+- => -+--
|
|
/// 0|1 0|1 0| 1
|
|
/// </summary>
|
|
public TR Inverse()
|
|
{
|
|
var inv = Quaternion.Inverse(Rotation);
|
|
return new TR(inv, inv * -Translation);
|
|
}
|
|
}
|
|
}
|