Utility static class for skinned model bone transforms and vector helpers. It reads bone animation or pose transforms from a SkinnedModelRenderer, converts between world and local space using the renderer's WorldTransform, and provides a SafeNormal helper for vectors.
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;
}
}