66 lines
2.1 KiB
C#
66 lines
2.1 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace Obi
|
|
{
|
|
public struct AffineTransform
|
|
{
|
|
public Vector4 translation;
|
|
public Vector4 scale;
|
|
public Quaternion rotation;
|
|
|
|
public AffineTransform(Vector4 translation, Quaternion rotation, Vector4 scale)
|
|
{
|
|
// make sure there are good values in the 4th component:
|
|
translation[3] = 0;
|
|
scale[3] = 1;
|
|
|
|
this.translation = translation;
|
|
this.rotation = rotation;
|
|
this.scale = scale;
|
|
}
|
|
|
|
public void FromTransform3D(Transform source, ObiRigidbody rb)
|
|
{
|
|
if (rb != null && rb.unityRigidbody != null)
|
|
{
|
|
translation = source.position - rb.unityRigidbody.transform.position + rb.position;
|
|
rotation = (source.rotation * Quaternion.Inverse(rb.unityRigidbody.transform.rotation)) * rb.rotation;
|
|
}
|
|
else
|
|
{
|
|
translation = source.position;
|
|
rotation = source.rotation;
|
|
}
|
|
|
|
scale = source.lossyScale;
|
|
}
|
|
|
|
public void FromTransform2D(Transform source, ObiRigidbody2D rb)
|
|
{
|
|
if (rb != null && rb.unityRigidbody != null)
|
|
{
|
|
translation = source.position - rb.unityRigidbody.transform.position + (Vector3)rb.position;
|
|
rotation = (source.rotation * Quaternion.Inverse(rb.unityRigidbody.transform.rotation)) * Quaternion.AngleAxis(rb.rotation, Vector3.forward);
|
|
}
|
|
else
|
|
{
|
|
translation = source.position;
|
|
rotation = source.rotation;
|
|
}
|
|
|
|
scale = source.lossyScale;
|
|
translation[2] = 0;
|
|
}
|
|
|
|
public AffineTransform Inverse()
|
|
{
|
|
var conj = Quaternion.Inverse(rotation);
|
|
var invScale = new Vector3(1 / scale.x, 1 / scale.y, 1 / scale.z);
|
|
return new AffineTransform(conj * Vector3.Scale(translation , -invScale),
|
|
conj,
|
|
invScale);
|
|
}
|
|
}
|
|
}
|