Fluid Interaction
유체 시뮬레이션과 파티클, 오브젝트, 게임플레이 간의 상호작용을 구현합니다.
외부 힘과 소스 주입
유체에 동적으로 영향을 주는 방법
유체 시뮬레이션에 외부에서 힘(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 // 캐릭터 위치에 연기 주입
);
유체-파티클 상호작용
유체 속도장이 파티클을 이동시키기
유체 시뮬레이션의 속도장(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 // 불씨 트레일
파티클이 유체에도 영향을 줄 수 있습니다(양방향 커플링). 파티클의 위치에 밀도와 힘을 주입하면, 파티클이 이동하면서 유체에 소용돌이를 만들 수 있습니다. 하지만 양방향 커플링은 비용이 높으므로, 일반적으로 유체 → 파티클 단방향 커플링이면 충분합니다.
오브젝트 장애물
유체가 장애물을 우회하기
유체 시뮬레이션에 장애물(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
);
실전 활용 예제
불, 폭발, 환경 효과
예제 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 같은 전문 유체 시뮬레이션 도구의 결과를 VDB(OpenVDB) 또는 Flipbook으로 베이크하여 Niagara에서 재생하는 방법도 있습니다. 실시간 시뮬레이션보다 품질이 높고 비용이 일정하지만, 인터랙티브하지 않다는 단점이 있습니다.
핵심 요약
- 외부 소스 주입: 특정 위치에 밀도, 온도, 속도를 주입하여 유체에 동적 영향을 줍니다.
- 유체-파티클 커플링: 유체의 속도장을 샘플링하여 일반 파티클이 유체 흐름을 따르게 합니다.
- 장애물: Distance Field이나 간단한 형상으로 유체가 우회하는 장애물을 정의합니다.
- Blueprint의
SetVectorParameter로 소스 위치와 힘을 런타임 제어합니다. - 하이브리드 접근(유체 + 파티클 조합)이 비용 대비 가장 효과적인 프로덕션 패턴입니다.
- 인터랙션이 불필요한 경우 베이크된 Flipbook/VDB 재생이 더 효율적일 수 있습니다.
도전 과제
배운 내용을 직접 실습해보세요
캐릭터가 이동할 때 Collision SDF 또는 Velocity Source로 유체에 힘을 전달하여, 캐릭터 주변의 연기가 밀려나는 효과를 구현하세요. Actor Position을 Data Interface로 읽어 사용하세요.
2개의 유체 시뮬레이션(불 + 연기)을 연결하세요. 불의 온도 필드가 연기의 부력에 영향을 주도록 Cross-Simulation 데이터 읽기를 구현하세요.
유체 시뮬레이션의 속도장이 일반 파티클 이미터의 파티클에 힘을 가하고, 동시에 파티클이 유체에 밀도를 주입하는 양방향 커플링을 구현하세요. 불꽃 속 불티 입자를 표현하세요.