Utility helpers for skinned model bones and transforms. Provides methods to get a bone's local animated transform, convert positions between local and world using a renderer's WorldTransform, and compute a safe normalized vector with a fallback.
using System;
public static class SoftBoneSkinnedModelUtility
{
private const float Epsilon = 0.000008f;
public static bool TryGetBoneAnimationLocal( SkinnedModelRenderer renderer, BoneCollection.Bone bone, out Transform transform )
{
transform = default;
if ( renderer is null || !renderer.IsValid() || bone is null )
return false;
if ( renderer.TryGetBoneTransformAnimation( bone, out var worldTransform ) )
{
transform = renderer.WorldTransform.ToLocal( worldTransform );
return true;
}
if ( renderer.TryGetBoneTransform( bone, out worldTransform ) )
{
transform = renderer.WorldTransform.ToLocal( worldTransform );
return true;
}
return false;
}
public static Vector3 ToWorld( SkinnedModelRenderer renderer, Vector3 localPosition )
{
if ( renderer is null || !renderer.IsValid() )
return localPosition;
return renderer.WorldTransform.PointToWorld( localPosition );
}
public static Vector3 ToLocal( SkinnedModelRenderer renderer, Vector3 worldPosition )
{
if ( renderer is null || !renderer.IsValid() )
return worldPosition;
return renderer.WorldTransform.PointToLocal( worldPosition );
}
public static Vector3 SafeNormal( Vector3 value, Vector3 fallback )
{
if ( value.Length <= Epsilon )
return fallback.Length > Epsilon ? fallback.Normal : Vector3.Forward;
return value.Normal;
}
}