UniVRM/Assets/VRM/Runtime/SpringBone/Logic/SphereCollider.cs
2024-10-07 16:38:58 +09:00

37 lines
1.2 KiB
C#

using UniGLTF;
using UnityEngine;
namespace VRM.SpringBone
{
readonly struct SphereCollider
{
public readonly Vector3 Position;
public readonly float Radius;
public SphereCollider(Transform transform, VRMSpringBoneColliderGroup.SphereCollider collider)
{
Position = transform.TransformPoint(collider.Offset);
var ls = transform.lossyScale;
var scale = Mathf.Max(Mathf.Max(ls.x, ls.y), ls.z);
Radius = scale * collider.Radius;
}
public bool TryCollide(SpringBoneSettings settings, Transform transform, Vector3 nextTail, out Vector3 posFromCollider)
{
var m_radius = settings.HitRadius * transform.UniformedLossyScale();
var r = m_radius + Radius;
if (Vector3.SqrMagnitude(nextTail - Position) <= (r * r))
{
// ヒット。Colliderの半径方向に押し出す
var normal = (nextTail - Position).normalized;
posFromCollider = Position + normal * (m_radius + Radius);
return true;
}
else
{
posFromCollider = default;
return false;
}
}
}
}