diff --git a/Assets/External/OptiTrack Unity Plugin/OptiTrack/Scripts/OptitrackSkeletonAnimator_Mingle.cs b/Assets/External/OptiTrack Unity Plugin/OptiTrack/Scripts/OptitrackSkeletonAnimator_Mingle.cs index b8e8cb6ee..c05a24ea5 100644 --- a/Assets/External/OptiTrack Unity Plugin/OptiTrack/Scripts/OptitrackSkeletonAnimator_Mingle.cs +++ b/Assets/External/OptiTrack Unity Plugin/OptiTrack/Scripts/OptitrackSkeletonAnimator_Mingle.cs @@ -36,12 +36,16 @@ public class OptitrackSkeletonAnimator_Mingle : MonoBehaviour [Header("본 1€ 필터 (속도 적응형 저역통과)")] [Tooltip("활성화 시 빠른 움직임은 그대로, 정지/느린 움직임의 노이즈를 제거합니다.\n단순 EMA보다 모션 보존이 훨씬 우수합니다.")] public bool enableBoneFilter = true; - [Tooltip("최소 차단 주파수 (Hz). 낮을수록 정지 시 노이즈 제거 강화. 권장: 1~3 Hz")] + [Tooltip("최소 차단 주파수 (Hz). 정지 시 노이즈 제거 강도. 낮을수록 강함. 권장: 2~4 Hz")] [Range(0.1f, 10f)] public float filterMinCutoff = 3.0f; - [Tooltip("속도 계수. 높을수록 빠른 움직임 시 지연 감소. 권장: 0.3~1.0")] + [Tooltip("속도 계수. 빠른 동작에서 cutoff 상승 속도. 높을수록 지연 감소. 권장: 0.5~2.0")] [Range(0f, 5f)] public float filterBeta = 1.5f; + [Tooltip("최대 차단 주파수 상한 (Hz). 빠른 동작에서도 이 이상 주파수는 항상 제거됩니다.\n" + + "MagicaCloth2 지터가 빠른 동작에서 발생하면 낮추세요. 권장: 10~20 Hz")] + [Range(5f, 120f)] + public float filterMaxCutoff = 15.0f; private OptitrackSkeletonDefinition m_skeletonDef; private string previousSkeletonName; @@ -449,8 +453,8 @@ public class OptitrackSkeletonAnimator_Mingle : MonoBehaviour float dAlpha = OE_Alpha(k_DCutoff, dt); float filtDeriv = s.dOriMag + dAlpha * (speed - s.dOriMag); - // 적응 cutoff: 빠르면 cutoff 상승 - float cutoff = filterMinCutoff + filterBeta * filtDeriv; + // 적응 cutoff: 빠르면 cutoff 상승, 단 maxCutoff 이상은 항상 제거 + float cutoff = Mathf.Min(filterMinCutoff + filterBeta * filtDeriv, filterMaxCutoff); float alpha = OE_Alpha(cutoff, dt); Quaternion filtered = Quaternion.Slerp(s.prevOri, raw, alpha); @@ -478,7 +482,7 @@ public class OptitrackSkeletonAnimator_Mingle : MonoBehaviour float dAlpha = OE_Alpha(k_DCutoff, dt); float filtDeriv = s.dPosMag + dAlpha * (speed - s.dPosMag); - float cutoff = filterMinCutoff + filterBeta * filtDeriv; + float cutoff = Mathf.Min(filterMinCutoff + filterBeta * filtDeriv, filterMaxCutoff); float alpha = OE_Alpha(cutoff, dt); Vector3 filtered = Vector3.Lerp(s.prevPos, raw, alpha);