콘텐츠로 이동

Follow Through

UOverAnimFollowThroughModule은 Anchor에서 Falloff까지의 parent-to-child bone chain에 pose history 기반 지연을 적용하는 Dynamics Phase 모듈입니다. 설정은 OverAnimation/Asset/OverAnimModule.h에 선언되어 있으며, 이 페이지는 OverAnim 0.1.0 Beta / UE 5.8 기준입니다.

목적

현재 chain pose와 이전에 보관한 pose 사이의 차이를 이용해, Anchor에서 Falloff 방향으로 지연된 transform을 만듭니다. 이 모듈은 명시적인 bone chain, pose history buffer, bend·pose-cut·direction-change safety layer를 함께 사용합니다.

Details 레이아웃

SimpleSimpleLag, SimpleLooseness, SimpleSnap, 필수 Anchor Bone·Falloff Bone, 자산 공통 Master Effect Intensity를 표시합니다. Anchor와 Falloff는 두 레이아웃이 공유하지만 Simple knob는 Detailed 값을 변경하지 않습니다. 아래 나머지 표는 Details의 실제 category 순서입니다.

공통 및 자산 강도

UI 이름 C++ 속성 기본값 / 단위 / 범위 영향 표시 조건 연동
Input Composition CompositionMode Additive Offset; Additive Offset / Re-Skinning Additive Offset은 이 module의 displacement를 현재 합성 결과에 더하고, Re-Skinning은 현재 control-point transform 기준으로 평가합니다. Details 레이아웃 모든 Module에 공통입니다. 같은 Phase 안에서의 실행 순서는 Module Stack이 관리합니다.
Master Effect Intensity UOverAnimMeshDeformer::MasterEffectIntensity 1.0; 최소 0, UI 상한 3 이 asset의 authored effect strength를 모두 배율 조정합니다. Simple·Details 모두, OverAnim|Intensity row Follow Through response weight도 이 값을 곱한 뒤 01로 제한합니다. asset 전역 속성입니다.

Simple

UI 이름 C++ 속성 기본값 / 단위 / 범위 영향 표시 조건 연동
Lag SimpleLag 1.0; 0–5 authored Buffer Size의 비율입니다. 2.0은 history frame 수를 두 배로 늘립니다. Simple에서 표시, runtime은 항상 적용 결과는 2–64 frames로 제한되며 pose 간격은 바꾸지 않습니다.
Looseness SimpleLooseness 1.0; 0–5 authored chain budget와 single-segment swing에는 비율을, bend guard 각도에는 additive span을 적용합니다. Simple에서 표시, runtime은 항상 적용 실제 사용값은 Safety와 Single Segment mode에 따라 달라집니다.
Snap SimpleSnap 1.0; 0–5 authored attenuation/recovery time에는 역비율을 적용하고 guard angle과 history retention에는 additive span을 적용합니다. Simple에서 표시, runtime은 항상 적용 Use Direction Change Guard가 꺼져 있으면 결과에 영향이 없습니다. 0은 guard 비활성 방향입니다.

런타임에서 해석하는 Detailed 기본값

Simple knob 해석 대상 처리
SimpleLag NumFrames (Buffer Size) authored frame 수에 knob 비율을 곱하고 반올림한 뒤 2–64로 제한합니다.
SimpleLooseness BendGuardStartAngleDegrees, BendGuardLimitAngleDegrees, MaximumCumulativeChainBendDegrees, MaximumSingleSegmentSwingAngleDegrees authored budget·swing에는 비율을 곱하고 guard start/limit에는 각각 최대 +30°/+5° span을 더한 뒤 안전 범위로 제한합니다.
SimpleSnap DirectionChangeGuardStartAngleDegrees, FullReversalHistoryRetention, DirectionChangeAttenuationTime, DirectionChangeRecoveryTime authored start angle에서 최대 60°, retention에서 최대 0.2를 빼며 두 time에는 역비율을 곱합니다.

OverAnim | Activation

UI 이름 C++ 속성 기본값 / 단위 / 범위 영향 표시 조건 연동
Driver Mode DriverMode Automatic + Signal Boost history와 Response Rule의 결합 방식을 선택합니다. Automatic Motion은 response 없이 authored history를 유지합니다. Signal Gated Motion은 history weight에 response weight를 곱합니다. Automatic + Signal Boost는 history weight를 min(history × (1 + response), 1)로 만듭니다. 항상 Automatic Motion은 Signal을 거부합니다. 나머지 두 mode는 PulseSustained response를 받습니다.

OverAnim | Anchor

UI 이름 C++ 속성 기본값 / 단위 / 범위 영향 표시 조건 연동
Anchor Bone AnchorBone None Follow Through chain의 시작 bone입니다. Simple·Details Falloff Bone과 달라야 하며 Target Skeleton의 단일 parent-to-child chain으로 연결되어야 합니다.
Falloff Bone FalloffBone None Follow Through chain의 끝 bone입니다. Simple·Details chain의 tip 역할을 하며 direction-change guard도 이 bone의 최근 이동 방향을 사용합니다.

OverAnim | Buffer

UI 이름 C++ 속성 기본값 / 단위 / 범위 영향 표시 조건 연동
Buffer Size NumFrames 2 frames; 2–64 보관하는 transform history frame 수입니다. 항상 최종 frame 수에는 SimpleLag가 항상 곱해집니다. frame 수는 transform buffer memory와 history depth에 직접 영향을 줍니다.
Transform Buffer Space TransformBufferSpace World Space delayed pose를 저장·재기준화하는 좌표 기준입니다. Component Space는 parent-relative animation pose를 재생하고, World Space는 과거 world motion을 현재 component 기준으로 rebase합니다. 항상 Follow Through constructor가 base class의 기본값을 World Space로 바꿉니다.
History Source HistorySource Source Animation Pose history를 source animation pose에서 읽을지, simulated guide에서 읽을지 선택합니다. 항상 Source Animation Pose는 source pose의 delayed local delta를 guide pose에 합성합니다.

OverAnim | History

UI 이름 C++ 속성 기본값 / 단위 / 범위 영향 표시 조건 연동
Buffer Weight To History Curve BufferWeightToHistoryCurve 기본 key (0, 0), (1, 1) chain alpha를 history weight로 바꿉니다. runtime은 curve 결과를 01로 제한합니다. 항상 chain의 각 control point가 사용하는 delayed pose 비율을 결정합니다. Response는 이 authored history weight를 gate 또는 boost합니다.

OverAnim | Safety

UI 이름 C++ 속성 기본값 / 단위 / 범위 영향 표시 조건 연동
Bend Guard Start Angle BendGuardStartAngleDegrees 150°; 0180° 이 angle보다 작은 bend는 감쇠하지 않습니다. guard는 거의 역방향이 된 joint에서 시작합니다. 항상 Bend Guard Limit Angle보다 클 수 없습니다. Looseness가 additive 변경합니다.
Bend Guard Limit Angle BendGuardLimitAngleDegrees 175°; 0180° 거의 reversal인 joint에서의 final safety limit입니다. 180°이면 이 guard는 사실상 비활성입니다. 항상 Start 이상이어야 합니다. Looseness가 additive 변경합니다.
Chain Safety Mode SafetyMode Segment Guard + Chain Budget Segment Guard Only는 joint별 guard만, Segment Guard + Chain Budget은 primary chain의 누적 bend도 제한합니다. 항상 후자일 때 Maximum Cumulative Chain Bend가 표시됩니다. authored budget에는 SimpleLooseness가 항상 곱해집니다.
Maximum Cumulative Chain Bend MaximumCumulativeChainBendDegrees 240°; 1720° primary chain 전체의 positional bend 또는 local rotation deviation 합계 상한입니다. Chain Safety Mode = Segment Guard + Chain Budget Single joint limit과 별도로 누적 exaggeration을 제한합니다.
Single Segment Mode SingleSegmentMode Rigid Swing Anchor와 Falloff가 하나의 segment만 만들 때의 solve 방식을 선택합니다. Rigid Swing은 leaf-local transform을 보존하면서 Anchor 주위로 회전하고, Full Transform Delay는 delayed leaf transform을 직접 재생합니다. 항상 Full Transform Delay는 큰 rotation에서 linear skinning geometry를 얇게 만들 수 있다는 validation warning 대상입니다.
Maximum Single Segment Swing MaximumSingleSegmentSwingAngleDegrees 45°; 1179° one-segment branch가 현재 방향에서 회전할 수 있는 최대 authored angle입니다. Single Segment Mode = Rigid Swing 최종 angle에는 SimpleLooseness가 항상 곱해집니다.

OverAnim | Safety | Pose Cut

UI 이름 C++ 속성 기본값 / 단위 / 범위 영향 표시 조건 연동
Reset History on Pose Cut bResetHistoryOnPoseCut true 한 sample에서 source chain이 과도하게 바뀌면 이 module의 history만 초기화합니다. 항상 abrupt montage 또는 animation transition의 stale history를 차단합니다.
Pose Cut Relative Tip Distance PoseCutRelativeTipDistanceRatio 0.75; 0.13.0 Anchor 대비 tip의 one-sample 이동 허용량을 현재 chain length의 비율로 설정합니다. Reset History on Pose Cut이 켜짐, Advanced 이 값 또는 segment angle 기준을 넘으면 history가 reset됩니다.
Pose Cut Segment Angle PoseCutSegmentAngleDegrees 90°; 1180° chain segment의 one-sample 방향 또는 local rotation 변화 허용량입니다. Reset History on Pose Cut이 켜짐, Advanced 위 relative tip distance와 함께 pose-cut 판정에 쓰입니다.

OverAnim | Safety | Direction Change

UI 이름 C++ 속성 기본값 / 단위 / 범위 영향 표시 조건 연동
Use Direction Change Guard bUseDirectionChangeGuard true Falloff tip이 급격히 방향을 바꿀 때 stale history를 일시 감쇠합니다. 항상 꺼지면 현재·이전·target history scale을 1로 되돌리고 아래 네 속성을 사용하지 않습니다.
Guard Start Angle DirectionChangeGuardStartAngleDegrees 120°; 0180° 이 angle보다 작은 방향 변화에서는 full history response를 유지합니다. Use Direction Change Guard가 켜짐, Advanced Snap을 높이면 이 angle이 낮아져 더 작은 turn에서도 guard가 시작합니다.
Full Reversal History Retention FullReversalHistoryRetention 0.2; 01 정확히 180° reversal일 때 남길 history의 비율입니다. Use Direction Change Guard가 켜짐, Advanced Snap을 높이면 이 값이 낮아집니다.
History Attenuation Time DirectionChangeAttenuationTime 0.025 s; 최소 0 stale history까지 낮아지는 시간입니다. Use Direction Change Guard가 켜짐, Advanced short non-zero 시간은 guard 자체의 one-frame pose jump를 완화합니다. Snap이 높을수록 짧아집니다.
History Recovery Time DirectionChangeRecoveryTime 0.12 s; 최소 0 direction reversal 이후 full Follow Through strength로 돌아가는 시간입니다. Use Direction Change Guard가 켜짐, Advanced Snap이 높을수록 짧아집니다.

실행·Response 호환성

항목 동작
Module Phase Dynamics
Signal 지원 Driver ModeAutomatic Motion이 아닐 때만 지원합니다.
Response Mode Pulse, Sustained를 지원합니다.
Automatic Six-Stage Motion Sustained response를 사용합니다. 기본 stage coverage는 Anticipation 비활성, Action 0.55, Overshoot 1.0, Recoil 0.45, Settle 0.15이며 timing role은 Dynamics입니다.
Response parameter type FOverAnimFollowThroughResponseParameters

Automatic Motion은 response를 받지 않고 authored history weight만 사용합니다. Signal Gated Motion은 response weight가 있을 때만 history를 노출하고, Automatic + Signal Boost는 기존 history weight를 유지한 뒤 response weight만큼 강화합니다.

공개 Enum

EOverAnimProceduralMotionDriverMode

DriverMode가 사용하는 BlueprintType enum입니다. Follow Through의 pose-history 출력과 Response Rule weight를 결합하는 방식을 정합니다.

C++ 값 Editor UI 의미
MotionOnly Automatic Motion authored pose history만 사용합니다. SupportsSignals()가 거짓이므로 Response 요청을 수락하지 않습니다.
SignalGatedMotion Signal Gated Motion authored history weight에 active response weight를 곱합니다. response가 없으면 출력 weight는 0입니다.
MotionWithSignalBoost Automatic + Signal Boost authored history를 유지하고 response weight만큼 history weight를 강화합니다. 최종 weight는 1을 넘지 않습니다.

EOverAnimTransformBufferSpace

TransformBufferSpace가 사용하는 BlueprintType enum입니다. transform history의 저장·재기준화 좌표를 정합니다.

C++ 값 Editor UI 의미
Local Component Space parent-relative animation pose를 지연 재생합니다.
World World Space 과거 world motion을 현재 component 기준으로 rebase하여 visible trailing inertia를 보존합니다.

EOverAnimTransformHistorySource

HistorySource가 사용하는 BlueprintType enum입니다.

C++ 값 Editor UI 의미
SourceAnimationPose Source Animation Pose source animation pose를 history 입력으로 사용합니다.
SimulatedGuide Simulated Guide 앞 단계 procedural guide transform을 history 입력으로 사용합니다.

EOverAnimFollowThroughSafetyMode

SafetyMode가 사용하는 BlueprintType enum입니다.

C++ 값 Editor UI 의미
SegmentGuardOnly Segment Guard Only 각 joint의 bend guard만 적용합니다. chain 전체의 누적 bend budget은 사용하지 않습니다.
SegmentGuardAndChainBudget Segment Guard + Chain Budget joint별 bend guard와 primary chain 전체의 누적 bend budget을 함께 적용합니다. Maximum Cumulative Chain Bend가 표시됩니다.

EOverAnimFollowThroughSingleSegmentMode

SingleSegmentMode가 사용하는 BlueprintType enum입니다. Anchor와 Falloff가 단일 segment를 만들 때의 solve 방식을 선택합니다.

C++ 값 Editor UI 의미
RigidSwing Rigid Swing 현재 leaf-local transform을 보존한 채 Anchor 주위로 짧은 branch를 회전시킵니다. Maximum Single Segment Swing이 적용됩니다.
FullTransformDelay Full Transform Delay 지연된 leaf transform을 직접 재생합니다. Maximum Single Segment Swing은 사용하지 않습니다.

Response Rule 파라미터와 입력 조건

Response Rule의 Module Response at 100%에는 FOverAnimFollowThroughResponseParameters가 사용됩니다.

UI 이름 C++ 속성 기본값 / 단위 / 범위 영향 적용 조건 연동
History Strength at Full Response HistoryStrengthAtMax 1.0; 01 response가 최대일 때 노출할 authored pose history의 비율입니다. Driver ModeAutomatic Motion이 아님 resolved magnitude × Master Effect Intensity × 이 값을 01로 clamp한 weight가 됩니다. chain, history curve, safety guard 자체를 대체하지 않습니다.

Response request는 다음 조건을 모두 충족해야 합니다.

  • Driver ModeAutomatic Motion이 아니고, FOverAnimFollowThroughResponseParameters가 Rule에 있어야 합니다.
  • History Strength at Full ResponseResolvedMagnitude는 유한해야 하며 parameter는 01 범위여야 합니다.
  • Response envelope의 Attack, Hold, Release time은 모두 유한한 0 이상이어야 합니다. Response weight state가 이를 받아 Pulse 또는 Sustained weight를 관리합니다.
  • direction, contact point, contact normal은 request 수락 조건이 아닙니다. 이 module은 request의 mesh component도 직접 사용하지 않습니다.

Automatic Six-Stage Motion response를 만들려면 Module이 활성 상태이고 이름이 있으며, Driver Mode가 Signal을 허용하고 Buffer Size >= 2, 서로 다른 Anchor/Falloff bone이 지정되어야 합니다.

제한·성능·Validation

안전 제한

  • Anchor와 Falloff는 서로 달라야 하고, Target Skeleton에서 하나의 parent-to-child chain으로 연결되어야 합니다. 참조 chain의 길이가 0이면 오류입니다.
  • Bend Guard Start Angle <= Bend Guard Limit Angle <= 180°가 유지되어야 합니다. Chain budget을 쓰면 Maximum Cumulative Chain Bend1720°여야 합니다.
  • source chain motion이 연속적이지 않거나 pose-cut 조건이 충족되면 runtime은 history를 reset합니다.
  • Full Transform Delay와 one-segment chain의 조합은 validation warning 대상입니다. 이 경우 large wrist rotation이 linear skinned geometry를 얇게 만들 수 있습니다.

성능 특성

  • runtime state는 transform buffer와 resolved ChainBoneNames를 보관합니다. Buffer Size가 커질수록 control point당 history memory가 증가합니다.
  • pose-history 메모리는 authored Buffer Size × SimpleLag의 최종 frame 수와 resolved control point 수에 따라 증가합니다. 최종 frame 수는 2–64로 제한됩니다.
  • direction-change guard는 falloff tip의 최근 이동 방향과 history duration을 계산합니다. 꺼져 있으면 관련 scale 계산을 하지 않습니다.

Validation 및 비활성 조건

  • Buffer Size < 2는 history module validation 오류입니다.
  • Anchor/Falloff 누락, 동일 bone, parent-to-child chain이 아닌 연결은 오류입니다.
  • pose-cut guard가 켜졌을 때 relative tip distance는 0.13.0, segment angle은 1180°이어야 합니다.
  • direction-change guard가 켜졌을 때 start angle은 0180°, full reversal retention은 01, 두 time은 0 이상이어야 합니다.