Bone Scaler
UOverAnimBoneScalerModule은 bone velocity로 skeletal transform scale을 바꾸는 Dynamics Phase의 advanced module입니다. Target bone의 descendant, socket, attachment 위치까지 영향을 전파할 수 있습니다. 설정은 OverAnimation/Asset/OverAnimModule.h에 선언되어 있으며, 이 페이지는 OverAnim 0.1.0 Beta / UE 5.8 기준입니다.
목적
선택한 bone의 속도를 bone-local scale delta로 변환하고, 그 결과를 target bone transform에 적용합니다. 이 module은 surface displacement가 아니라 skeletal proportion을 변경합니다. Overwrite Bone Transform이 켜져 있으면 변경된 parent transform을 descendant control point에 전파합니다.
Details 레이아웃
Simple은 SimpleStrength, SimpleRange와 자산 공통 Master Effect Intensity를 표시합니다. 아래 나머지 표는 Details의 실제 category 순서입니다. Simple knob는 Detailed 값을 변경하지 않습니다.
공통 및 자산 강도
| 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 |
velocity-to-scale gain에 곱해지는 asset 공통 강도입니다. |
Simple·Details 모두, OverAnim|Intensity row |
response request weight에는 직접 곱하지 않고, 매 tick의 ScalePerVelocity에 곱해집니다. |
Simple
| UI 이름 |
C++ 속성 |
기본값 / 단위 / 범위 |
영향 |
표시 조건 |
연동 |
| Strength |
SimpleStrength |
1.0; 0–5 |
authored Scale Per Velocity에 비율을 적용합니다. 2.0은 velocity gain을 두 배로, 0은 성장을 제거합니다. |
Simple에서 표시, runtime은 항상 적용 |
Axis Mask는 바꾸지 않습니다. |
| Range |
SimpleRange |
1.0; 0–5 |
authored Max Scale에 비율을 적용합니다. |
Simple에서 표시, runtime은 항상 적용 |
cap이 1.0 이하가 되는 knob 위치는 authored Max Scale에 따라 달라집니다. |
런타임에서 해석하는 Detailed 기본값
| Simple knob |
해석 대상 |
처리 |
SimpleStrength |
ScalePerVelocity |
authored 값에 knob 비율을 곱하고 최소 0으로 제한합니다. |
SimpleRange |
MaxScale |
authored cap에 knob 비율을 곱하고 최소 0으로 제한합니다. 최종 scale growth가 막히는 지점은 authored cap에 따라 달라집니다. |
OverAnim | Activation
| UI 이름 |
C++ 속성 |
기본값 / 단위 / 범위 |
영향 |
표시 조건 |
연동 |
| Driver Mode |
DriverMode |
Automatic + Signal Boost |
Automatic Motion은 velocity-derived scale만 사용합니다. Signal Gated Motion은 response weight가 없으면 output multiplier가 0이 됩니다. Automatic + Signal Boost는 base multiplier 1에 response weight를 더합니다. |
항상 |
Automatic Motion은 Response Rule 요청을 거부합니다. 나머지 mode는 Pulse와 Sustained를 지원합니다. |
OverAnim
| UI 이름 |
C++ 속성 |
기본값 / 단위 / 범위 |
영향 |
표시 조건 |
연동 |
| Target Bones |
BoneMask |
빈 배열 |
skeletal scale을 적용할 source bone 목록입니다. |
Details 레이아웃 |
유효한 bone이 없으면 tick과 render proxy가 output을 만들지 않습니다. Automatic Six-Stage Motion response를 생성하려면 None이 아닌 bone이 하나 이상 있어야 합니다. |
| Overwrite Bone Transform |
bOverwriteBoneTransform |
true |
scale이 적용된 target bone의 descendant control point를 새 parent transform으로 다시 계산합니다. |
항상 |
켜면 child bone과 socket/attachment 위치가 함께 이동합니다. 꺼지면 mask에 직접 지정된 bone만 바뀝니다. |
OverAnim | Velocity
| UI 이름 |
C++ 속성 |
기본값 / 단위 / 범위 |
영향 |
표시 조건 |
연동 |
| Velocity Space |
VelocitySpace |
Component Space |
scale을 구동할 source bone velocity의 측정 기준입니다. Component Space는 control point의 linear velocity를 사용하고, World Space는 현재·이전 component world transform에서 velocity를 다시 계산합니다. |
항상 |
World Space를 선택하면 Use Component Scale이 편집 가능해집니다. |
| Use Component Scale |
bUseComponentScale |
true |
world velocity를 component space로 되돌릴 때 component scale을 반영할지 선택합니다. |
Velocity Space = World Space; 다른 경우 read-only |
true면 InverseTransformVector, false면 InverseTransformVectorNoScale을 사용합니다. |
| Apply Bone Scale to Velocity |
bUseBoneScale |
false |
component-space velocity를 bone space로 바꿀 때 현재 bone scale을 반영할지 선택합니다. |
항상 |
true면 InverseTransformVector, false면 InverseTransformVectorNoScale을 사용합니다. 이후 absolute velocity가 scale delta의 입력이 됩니다. |
OverAnim | Scale
| UI 이름 |
C++ 속성 |
기본값 / 단위 / 범위 |
영향 |
표시 조건 |
연동 |
| Axis Mask |
AxisMask |
(1, 1, 1); 각 성분 최소 0 |
velocity-derived scale을 적용할 local X/Y/Z 축별 weight입니다. |
항상 |
runtime은 음수 성분을 0으로 정리합니다. Uniform Scale이 켜져도 mask가 0인 축은 변경하지 않습니다. |
| Scale Per Velocity |
ScalePerVelocity |
0.01; 최소 0 |
bone-space absolute velocity를 skeletal scale delta로 환산하는 gain입니다. |
항상 |
실제 delta는 abs(VelocityBS) × AxisMask × ScalePerVelocity × SimpleStrength × Master Effect Intensity × MotionScaleMultiplier입니다. |
| Uniform Scale |
bUnifyAxis |
false |
mask가 켜진 축들의 scale delta를 그중 가장 큰 delta로 통일합니다. |
항상 |
Axis Mask가 axis별 값을 먼저 만든 뒤 이 옵션이 통일합니다. mask가 0인 축에는 delta를 넣지 않습니다. |
| Max Scale |
MaxScale |
3.0; 최소 0 |
final current bone scale의 각 성분 upper cap입니다. |
항상 |
runtime은 각 축을 min(current scale + delta, Max Scale × SimpleRange)로 제한합니다. 최종 cap은 최소 0입니다. |
실행·Response 호환성
| 항목 |
동작 |
| Module Phase |
Dynamics |
| Signal 지원 |
Driver Mode가 Automatic Motion이 아닐 때만 지원합니다. |
| Response Mode |
Pulse, Sustained를 지원합니다. |
| Automatic Six-Stage Motion |
Sustained response를 사용합니다. 기본 profile은 Anticipation·Recoil·Settle 비활성, Overshoot strength 0.25이며 Action은 기본 1.0을 유지합니다. timing role은 Shape입니다. |
| Response parameter type |
FOverAnimBoneScalerResponseParameters |
Automatic Motion은 velocity-derived scale을 response 없이 사용합니다. Signal Gated Motion은 active response weight를 velocity-derived scale multiplier로 사용하고, Automatic + Signal Boost는 그 multiplier를 기존 1에 더합니다.
공개 Enum
EOverAnimProceduralMotionDriverMode
DriverMode가 사용하는 BlueprintType enum입니다. velocity-derived scale과 Signal Response weight의 결합 방식을 정합니다.
| C++ 값 |
Editor UI |
의미 |
MotionOnly |
Automatic Motion |
velocity-derived scale만 사용합니다. SupportsSignals()가 거짓이므로 Response 요청을 수락하지 않습니다. |
SignalGatedMotion |
Signal Gated Motion |
velocity-derived scale에 active response weight를 곱합니다. response가 없으면 output multiplier는 0입니다. |
MotionWithSignalBoost |
Automatic + Signal Boost |
velocity-derived scale을 유지하고 active response weight를 기본 multiplier 1에 더합니다. |
VelocitySpace가 재사용하는 BlueprintType enum입니다. 이름은 transform buffer에도 쓰이지만 Bone Scaler에서는 source bone velocity의 측정 기준을 정합니다.
| C++ 값 |
Editor UI |
의미 |
Local |
Component Space |
현재 control point의 component-space linear velocity를 사용합니다. |
World |
World Space |
현재·이전 component world transform에서 world velocity를 계산한 뒤 component space로 되돌립니다. bUseComponentScale이 그 변환에서 scale을 반영할지 정합니다. |
Response Rule 파라미터와 입력 조건
Response Rule의 Module Response at 100%에는 FOverAnimBoneScalerResponseParameters가 사용됩니다.
| UI 이름 |
C++ 속성 |
기본값 / 단위 / 범위 |
영향 |
적용 조건 |
연동 |
| Motion Scale Strength at Full Response |
MotionScaleStrengthAtMax |
1.0; 0–1 |
response가 최대일 때 velocity-derived skeletal scaling에 사용할 weight입니다. |
Driver Mode가 Automatic Motion이 아님 |
resolved magnitude × 이 값을 0–1로 clamp하여 response weight로 저장합니다. Axis Mask와 Scale Per Velocity를 대체하지 않습니다. |
Response request는 다음 조건을 모두 충족해야 합니다.
Driver Mode가 Automatic Motion이 아니고, FOverAnimBoneScalerResponseParameters가 Rule에 있어야 합니다.
Motion Scale Strength at Full Response와 ResolvedMagnitude는 유한해야 하며 parameter는 0–1 범위여야 합니다.
- Response envelope의 Attack, Hold, Release time은 모두 유한한
0 이상이어야 합니다. Response weight state가 Pulse 또는 Sustained weight를 관리합니다.
- direction, contact point, contact normal, mesh component는 request 수락 조건이 아닙니다.
Automatic Six-Stage Motion response를 만들려면 Module이 활성 상태이고 이름이 있으며, Driver Mode가 Signal을 허용하고 Target Bones에 None이 아닌 bone이 하나 이상 있어야 합니다.
제한·성능·Validation
안전 제한
- 이 module은 skeletal transform을 직접 바꾸므로
Overwrite Bone Transform이 켜지면 descendant transform뿐 아니라 socket과 attachment 위치도 바뀝니다.
Max Scale은 upper cap입니다. authored 값과 SimpleRange의 곱이 1.0 이하이면 성장을 막거나 현재 scale보다 낮은 cap을 만들 수 있습니다. runtime은 최종 cap을 최소 0으로만 제한합니다.
Axis Mask와 Scale Per Velocity는 음수 scale delta를 만들지 않습니다. runtime은 velocity의 absolute value를 사용하고 Axis Mask와 gain을 최소 0으로 정리합니다.
성능 특성
- 매 fixed tick마다 mask bone을 찾아 velocity를 scale delta로 변환합니다.
Overwrite Bone Transform이 켜져 있으면 이어서 descendant control point의 transform도 재구성합니다.
Target Bones가 비어 있거나 fixed delta가 0 이하이면 tick은 즉시 끝납니다.
- runtime state는
BoneMask와 이전 component world transform을 보관합니다. transform history buffer는 사용하지 않습니다.
Validation 및 비활성 조건
- 빈
Target Bones, None만 있는 mask, 또는 현재 build context에 하나도 resolve되지 않는 mask는 output proxy를 만들지 않습니다.
- Automatic Six-Stage Motion response를 만들 때 유효한 target bone이 하나도 없으면 생성이 거부됩니다.
- runtime은
ScalePerVelocity, AxisMask, MaxScale의 음수를 0으로 정리하지만, Details 입력에서 semantic error를 자동으로 보정하는 별도 Bone Scaler validation 오류는 없습니다.
- response가
Signal Gated Motion에서 0 weight가 되면 velocity-derived scale은 계산 결과를 적용하지 않습니다.