PART 5 · 강의 3/3

Fluid Interaction

유체 시뮬레이션과 파티클, 오브젝트, 게임플레이 간의 상호작용을 구현합니다.

01

외부 힘과 소스 주입

유체에 동적으로 영향을 주는 방법

유체 시뮬레이션에 외부에서 힘(Force)이나 밀도/온도를 주입하여 동적인 인터랙션을 만들 수 있습니다.

외부 소스 주입 방법
// 1. 위치 기반 주입 (Emitter에서) Simulation Stage - Inject Source: Inject Density at Position { Position: User.SourcePosition // Blueprint에서 설정 Radius: 50.0 DensityAmount: 2.0 TemperatureAmount: 1.0 } // 2. 속도(힘) 주입 Simulation Stage - Add Force: Inject Velocity at Position { Position: User.ForcePosition Radius: 100.0 VelocityAmount: (0, 0, 500) // 위로 밀어냄 } // 3. Blueprint에서 런타임 제어 NiagaraComp->SetVectorParameter( "User.SourcePosition", CharacterLocation // 캐릭터 위치에 연기 주입 );
02

유체-파티클 상호작용

유체 속도장이 파티클을 이동시키기

유체 시뮬레이션의 속도장(Velocity Field)을 일반 Niagara 파티클에 적용하면, 파티클이 유체의 흐름을 따라 이동합니다.

유체 속도장으로 파티클 제어
NS_SmokeWithEmbers (System) Emitter 1: Smoke Fluid (Grid3D 유체 시뮬레이션) // 연기의 밀도와 속도장 시뮬레이션 Emitter 2: Ember Particles (일반 GPU 파티클) Particle Update: Sample Grid3D Velocity { Grid: SmokeFluid.Grid3D Position: Particles.Position → SampledVelocity } // 유체 속도를 파티클에 적용 Set (Particles.Velocity) += SampledVelocity * 0.8 // 80% 따라가기 Render: Sprite Renderer // 작은 불씨 스프라이트 Ribbon Renderer // 불씨 트레일
양방향 커플링

파티클이 유체에도 영향을 줄 수 있습니다(양방향 커플링). 파티클의 위치에 밀도와 힘을 주입하면, 파티클이 이동하면서 유체에 소용돌이를 만들 수 있습니다. 하지만 양방향 커플링은 비용이 높으므로, 일반적으로 유체 → 파티클 단방향 커플링이면 충분합니다.

03

오브젝트 장애물

유체가 장애물을 우회하기

유체 시뮬레이션에 장애물(Obstacle)을 정의하면, 유체가 해당 영역을 피해 흘러갑니다. Distance Field이나 직접 마스크를 사용하여 장애물을 정의합니다.

장애물 설정
// 방법 1: SDF(Signed Distance Field) 기반 장애물 Simulation Stage - Apply Obstacles: SDF Obstacle { SDF Source: Scene Distance Field // 또는 특정 Actor의 Distance Field Velocity Treatment: Zero at Boundary // 장애물 표면에서 속도를 0으로 (No-Slip) // 또는 Free-Slip: 법선 방향만 0으로 } // 방법 2: 구체/박스 형태의 간단한 장애물 Simulation Stage: Sphere Obstacle { Center: User.ObstaclePosition Radius: 100.0 } // Blueprint에서 장애물 위치 업데이트 NiagaraComp->SetVectorParameter( "User.ObstaclePosition", MovingObjectLocation );
04

실전 활용 예제

불, 폭발, 환경 효과

예제 1: 캐릭터 주변 연기 인터랙션

캐릭터가 연기를 밀어내는 효과
// Blueprint (매 Tick) float3 CharPos = Character->GetActorLocation(); float3 CharVel = Character->GetVelocity(); NiagaraComp->SetVectorParameter("User.CharPosition", CharPos); NiagaraComp->SetVectorParameter("User.CharVelocity", CharVel); // Niagara 유체 시뮬레이션 Inject Force: Position: User.CharPosition Velocity: User.CharVelocity * 2.0 // 캐릭터 방향으로 밀어냄 Radius: 80.0 // 캐릭터 크기

예제 2: 폭발 유체 + 파편

하이브리드 폭발 이펙트
NS_HybridExplosion Emitter 1: Fluid Core (Grid3D 64^3) // 폭발 중심의 고밀도 연기/불꽃 // 초기 프레임에 강한 밀도+온도+방사형 속도 주입 Emitter 2: Outer Smoke (Sprite Particles) // 유체 속도장을 샘플링하여 외곽 연기 파티클 이동 // 유체 영역 밖으로 나가면 자연스럽게 확산 Emitter 3: Debris (Mesh Particles) // 물리 기반 파편, 충돌 처리 Emitter 4: Sparks (Sprite + Ribbon) // 유체 속도장 영향을 받는 불꽃 입자 Emitter 5: Shockwave (Mesh) // 구체형 충격파, 빠르게 확대 후 소멸
EmberGen 스타일 워크플로

EmberGen 같은 전문 유체 시뮬레이션 도구의 결과를 VDB(OpenVDB) 또는 Flipbook으로 베이크하여 Niagara에서 재생하는 방법도 있습니다. 실시간 시뮬레이션보다 품질이 높고 비용이 일정하지만, 인터랙티브하지 않다는 단점이 있습니다.

SUMMARY

핵심 요약

  • 외부 소스 주입: 특정 위치에 밀도, 온도, 속도를 주입하여 유체에 동적 영향을 줍니다.
  • 유체-파티클 커플링: 유체의 속도장을 샘플링하여 일반 파티클이 유체 흐름을 따르게 합니다.
  • 장애물: Distance Field이나 간단한 형상으로 유체가 우회하는 장애물을 정의합니다.
  • Blueprint의 SetVectorParameter로 소스 위치와 힘을 런타임 제어합니다.
  • 하이브리드 접근(유체 + 파티클 조합)이 비용 대비 가장 효과적인 프로덕션 패턴입니다.
  • 인터랙션이 불필요한 경우 베이크된 Flipbook/VDB 재생이 더 효율적일 수 있습니다.
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: 캐릭터와 유체 상호작용

캐릭터가 이동할 때 Collision SDF 또는 Velocity Source로 유체에 힘을 전달하여, 캐릭터 주변의 연기가 밀려나는 효과를 구현하세요. Actor Position을 Data Interface로 읽어 사용하세요.

실습 2: 유체 간 상호작용

2개의 유체 시뮬레이션(불 + 연기)을 연결하세요. 불의 온도 필드가 연기의 부력에 영향을 주도록 Cross-Simulation 데이터 읽기를 구현하세요.

심화 과제: 양방향 유체-파티클 커플링

유체 시뮬레이션의 속도장이 일반 파티클 이미터의 파티클에 힘을 가하고, 동시에 파티클이 유체에 밀도를 주입하는 양방향 커플링을 구현하세요. 불꽃 속 불티 입자를 표현하세요.