Impact Ripple
목적
UOverAnimImpactRippleModule은 gameplay contact point와 normal에서 시작해 표면을 가로질러 이동하는 압축(compression)·전단(shear) 파동을 만드는 Offset / Smear 모듈입니다.
- 헤더:
OverAnimation/Asset/OverAnimModule.h - 클래스:
UOverAnimImpactRippleModule - 실행 Phase:
Offset / Smear(EOverAnimModulePhase::Smear) - 기본 Input Composition:
Additive Offset - 기본 Phase 순서:
10(동일 Phase 내 실행 순서; Details에서는 숨김)
Simple과 Details 공통
Module Id, Module Name, 활성 상태 및 Order Within Module Phase는 Module Stack에서 관리되므로 이 Details 레퍼런스에는 포함하지 않습니다.
| UI 이름 | 소유 C++ 속성 | 기본값 / 범위 | 영향 |
|---|---|---|---|
| Master Effect Intensity | UOverAnimMeshDeformer::MasterEffectIntensity |
1.0 / 최소 0.0, UI 최대 3.0 |
선택한 모듈의 Details에서도 보이는 asset 공용 값입니다. asset 안의 모든 module authored strength를 배율 조정하며, 각 module의 safety limit은 별도로 유지됩니다. |
| UI 이름 | C++ 속성 | 기본값 / 범위 | 영향 |
|---|---|---|---|
| Input Composition | CompositionMode |
Additive Offset |
구성된 결과에 파동 offset을 더합니다. 생성자는 이 값을 AdditiveOffset으로 설정합니다. |
| Impact | SimpleImpact |
1.0 / 0–5 |
authored Maximum Compression과 Maximum Shear에 같은 비율을 곱하여 두 파동의 비율을 보존합니다. |
| Reach | SimpleReach |
1.0 / 0–5 |
authored Effect Radius에 비율을 곱합니다. 다른 길이와 변위는 resolved radius의 비율이므로 파동 전체의 world 크기가 함께 바뀝니다. |
| Snap | SimpleSnap |
1.0 / 0–5 |
authored Compression Travel Time에는 역비율, Damping Rate에는 정비율을 적용합니다. 2.0은 travel time을 절반으로 하고 damping을 두 배로 만듭니다. |
| Focus | SimpleFocus |
1.0 / 0–5 |
authored Wave Width에는 역비율, Oscillation Cycles에는 정비율을 적용합니다. 2.0은 width를 절반으로 하고 cycle 수를 두 배로 만듭니다. |
Simple knob의 런타임 해석
Simple 값은 Detailed 필드를 수정하지 않습니다. runtime은 현재 레이아웃과 관계없이 authored Detailed 값으로부터 다음 값을 해석합니다.
| Simple knob | 해석되는 속성 | 처리 |
|---|---|---|
SimpleImpact |
MaximumCompressionDisplacementRatio, MaximumShearDisplacementRatio |
두 authored 값에 같은 비율을 적용하고 각각 0–0.25로 제한합니다. |
SimpleReach |
EffectRadiusRatio |
authored radius에 비율을 적용하고 0.1–3.0으로 제한합니다. |
SimpleSnap |
CompressionTravelTime, DampingRate |
travel time에는 역비율, damping에는 정비율을 적용합니다. |
SimpleFocus |
WaveWidthRatio, OscillationCycles |
wave width에는 역비율, cycle 수에는 정비율을 적용합니다. |
Details: Ripple
| UI 이름 | C++ 속성 | 기본값 / 범위 | 영향과 관계 |
|---|---|---|---|
| Effect Radius | EffectRadiusRatio |
1.25 / 0.1–3.0 |
Region의 측정 bounds radius에 곱하는 최대 표면 이동 반경입니다. Response의 Ripple Radius가 이 결과에 다시 곱해집니다. |
| Compression Travel Time | CompressionTravelTime |
0.18 s / 0.03–1.0 s |
더 빠른 compression wave가 Effect Radius를 통과하는 시간입니다. Compression Speed는 EffectRadius / CompressionTravelTime으로 계산됩니다. |
| Maximum Compression | MaximumCompressionDisplacementRatio |
0.06 / 0.0–0.25 |
resolved Effect Radius에 대한 contact-normal 방향 최대 변위 비율입니다. Response의 Wave Strength 및 Asset의 Master Effect Intensity가 곱해집니다. |
| Maximum Shear | MaximumShearDisplacementRatio |
0.035 / 0.0–0.25 |
resolved Effect Radius에 대한 접선 방향 최대 변위 비율입니다. Wave Strength 및 Master Effect Intensity가 곱해집니다. |
| Shear Speed Ratio | ShearSpeedRatio |
0.62 / 0.1–0.95 |
shear wave 속도 / compression wave 속도입니다. 1보다 낮으면 뒤따르는 두 번째 파동이 분리되어 보입니다. |
| Wave Width | WaveWidthRatio |
0.16 / 0.03–0.5 |
Effect Radius 대비 authored Gaussian wave band 폭입니다. 최종 값에는 SimpleFocus의 역비율이 항상 곱해집니다. |
| Surface Depth | NormalDepthRatio |
0.75 / 0.05–2.0 |
Effect Radius 대비 normal-depth slab 깊이입니다. 얇은 limb의 반대편 표면까지 같은 세기로 움직이는 것을 제한합니다. |
| Damping Rate | DampingRate |
5.0 / 0.0–30.0 |
지수 시간 감쇠율입니다. 높을수록 ripple이 빨리 사라집니다. |
| Oscillation Cycles | OscillationCycles |
0.75 / 0.0–3.0 |
wave width 하나 안에 들어가는 부호가 바뀌는 lobe 수입니다. 0이면 단일 부드러운 traveling band입니다. |
Shear Speed Ratio, Wave Width, Surface Depth, Damping Rate, Oscillation Cycles는 Advanced Display 속성입니다. Advanced Display는 숨기기만 하며 runtime 동작이나 유효성 조건을 바꾸지 않습니다.
Details: Safety
| UI 이름 | C++ 속성 | 기본값 / 범위 | 영향 |
|---|---|---|---|
| Maximum Simultaneous Ripples | MaximumActiveRipples |
4 / 1–4 |
Region에서 동시에 유지할 독립 ripple 수의 고정 runtime budget입니다. 한도일 때 들어오는 ripple은 현재 가장 약한 ripple보다 높은 priority/magnitude/sequence 우선순위를 가져야 교체합니다. 그렇지 않으면 요청이 거부됩니다. |
4는 전역 최대치(GOverAnimMaximumImpactRipples)이므로 더 큰 값을 직렬화해도 runtime에서는 4로 제한됩니다.
실행·Signal·Response 범위
| 항목 | 지원 내용 |
|---|---|
| Signal | gameplay contact Signal만 사용합니다. |
| Response Mode | Pulse만 지원합니다. Sustained는 지원하지 않습니다. |
| Response Parameters | FOverAnimImpactRippleResponseParameters |
| Automatic Six-Stage Motion | 지원하지 않습니다. 이 모듈은 gameplay contact point와 normal이 필요합니다. |
| 필수 Signal 데이터 | bHasContactPoint, bHasContactNormal, 유효한 contact point·0이 아닌 normal. Contact Bone Name은 선택 사항이지만 유효하면 파동을 bone에 고정합니다. |
Submit OverAnim Impact Signal, Hit Result, Collision, Trace/Point/Radial Damage 계열이 contact 데이터를 포함하는 Signal 경로입니다. Pulse 이외의 Response Mode는 모듈에서 거부됩니다.
Response Rule 파라미터와 Signal 조건
Response Rule의 Module Parameters는 FOverAnimImpactRippleResponseParameters입니다.
| UI 이름 | C++ 속성 | 기본값 / 범위 | 영향 |
|---|---|---|---|
| Wave Strength | WaveStrengthAtMax |
1.0 / 0.0–2.0 |
최대 response에서 compression과 shear 변위를 함께 곱합니다. |
| Ripple Radius | RadiusScale |
1.0 / 0.25–2.0 |
모듈의 Region-relative travel radius에 곱하는 response별 배율입니다. |
요청이 수락되려면 다음을 모두 만족해야 합니다.
- Response Mode가
Pulse여야 합니다. WaveStrengthAtMax가 유한수0.0–2.0,RadiusScale이 유한수0.25–2.0이어야 합니다.ResolvedMagnitude와BlendWeight가 유한수이며 둘 다0보다 커야 합니다.- Signal에 contact point와 0이 아닌 contact normal이 있어야 하며 NaN을 포함할 수 없습니다.
Contact Bone Name이 비어 있으면 contact frame은 component space에 고정됩니다. 유효한 bone 이름이 있으면 contact point/normal을 그 bone local space에 저장해 이후 pose 변화에 따라 함께 움직입니다. 지정한 bone이 mesh에 없으면 요청은 거부됩니다.
제한 사항과 성능
- Automatic Six-Stage Motion은 사용할 수 없습니다. 이 모듈의 자동 단계 생성은 명시적으로 거부됩니다.
Pulse전용입니다.SustainedResponse Rule은 호환되지 않습니다.- ripple의 최대 lifetime은
CompressionTravelTime × (1 + 3 × WaveWidthRatio) / ShearSpeedRatio로 계산됩니다. 이 시간이 지나거나 response weight가 비활성화되면 active ripple이 제거됩니다. - contact point가 Region center에서
RegionBoundsRadius + EffectRadius보다 멀면 build 단계에서 해당 ripple은 출력하지 않습니다. - active ripple 수는
Maximum Simultaneous Ripples로 제한되므로, 동시에 접촉이 많아도 그 수만큼만 runtime proxy에 전달됩니다.