3D Gas Simulation
Grid3D 기반 볼류메트릭 3D 가스/연기 시뮬레이션과 레이마칭 렌더링을 학습합니다.
3D 볼류메트릭 시뮬레이션
Grid3D Collection으로 3차원 유체 구현
Grid3D 기반 시뮬레이션은 3차원 공간에서 유체 역학을 시뮬레이션합니다. 2D와 동일한 나비에-스토크스(Navier-Stokes) 방정식을 3D로 확장하며, 볼류메트릭 렌더링으로 입체적인 연기/가스 효과를 생성합니다.
3D Gas System
Grid3D Collection:
Resolution: 128 x 128 x 128
// 메모리: 약 128^3 * 채널수 * 4bytes
// 128^3 * 6채널 * 4B = ~48MB GPU 메모리
Attributes:
Velocity (float3) // 3D 속도장
Density (float) // 가스 밀도
Temperature (float) // 온도 (부력)
Fuel (float) // 연료 (연소 시뮬레이션)
Pressure (float) // 압력
Divergence (float) // 발산 (압력 solve용)
Simulation Stages:
1. Advect // Semi-Lagrangian 이류
2. Add Buoyancy // 온도 기반 부력
3. Inject Source // 밀도/온도 주입
4. Compute Divergence
5. Pressure Jacobi // N회 반복 (20~40)
6. Subtract Gradient
7. Dissipation // 밀도/속도 감쇠
3D 시뮬레이션의 비용은 해상도의 세제곱으로 증가합니다. 해상도를 2배로 올리면 비용이 8배 증가합니다. 게임에서는 64~128, 시네마틱에서는 128~256 해상도를 권장합니다.
3D Gas 템플릿 설정
Niagara Fluids 3D 템플릿 활용
// Niagara System 생성
우클릭 → Niagara System → Niagara Fluids
→ Grid 3D Gas Dynamics Master Emitter
// 핵심 파라미터 조정
Grid Resolution:
X: 64, Y: 64, Z: 64 // 시작 해상도
World Size:
500 x 500 x 500 cm // 시뮬레이션 영역
Pressure Iterations: 30
// 높을수록 비압축성이 잘 유지됨 (비용 증가)
// 게임: 10~20, 시네마틱: 30~50
Density Dissipation: 0.97
Temperature Dissipation: 0.95
Velocity Dissipation: 0.98
Buoyancy:
Direction: (0, 0, 1) // 위쪽
Strength: 10.0
Vorticity Confinement: 5.0
// 소용돌이 디테일 보존. 높으면 더 소용돌이침
볼류메트릭 렌더링
Ray Marching으로 3D 가스 시각화
3D 유체의 밀도 데이터는 레이 마칭(Ray Marching)으로 렌더링됩니다. 카메라에서 쏜 광선이 볼륨을 통과하면서 밀도를 누적하여 연기의 불투명도를 계산합니다.
// Ray Marching 머티리얼 원리 (의사 코드)
for (int step = 0; step < MaxSteps; step++)
{
float3 SamplePos = RayOrigin + RayDir * StepSize * step;
// Grid3D에서 밀도와 온도 샘플링
float Density = SampleGrid3D(SamplePos, "Density");
float Temp = SampleGrid3D(SamplePos, "Temperature");
// 온도에 따른 색상 (차가운=회색, 뜨거운=주황)
float3 Color = lerp(SmokeColor, FireColor, Temp);
// Beer-Lambert 법칙으로 투과율 계산
Transmittance *= exp(-Density * AbsorptionCoeff * StepSize);
// 라이팅 (그림자 레이 추가 가능)
AccumulatedColor += Color * Density * Transmittance * StepSize;
}
// Niagara Fluids 템플릿에는 이 머티리얼이 포함되어 있음
| 렌더링 파라미터 | 설명 | 성능 영향 |
|---|---|---|
| Max Steps | 레이 마칭 최대 반복 수 | 높음 (직접 비례) |
| Step Size | 샘플 간격 (작을수록 정밀) | 높음 (반비례) |
| Absorption | 빛 흡수 계수 (불투명도) | 없음 |
| Shadow Steps | 자기 그림자 레이 반복 | 매우 높음 |
성능 최적화 전략
게임에서 사용 가능한 3D 유체
| 최적화 | 방법 | 트레이드오프 |
|---|---|---|
| 해상도 감소 | 64^3 또는 48^3 사용 | 디테일 감소, 블러로 보완 |
| Pressure 반복 감소 | 10~15회로 제한 | 비압축성 저하 (약간의 팝핑) |
| 비대칭 해상도 | Y축(높이)만 높게 설정 | 수직 디테일 유지, 수평 절약 |
| LOD | 거리에 따라 해상도/비활성화 | 먼 거리에서 품질 저하 |
| 시간 제한 | 짧은 수명으로 일시적 효과 | 지속적 이펙트에 부적합 |
3D 유체와 전통적 파티클을 조합하면 효과적입니다. 핵심 영역(폭발 중심)만 3D 유체로 처리하고, 외곽의 연기/파편은 일반 Sprite 파티클로 보충하면 비용을 크게 줄이면서 완성도를 유지할 수 있습니다.
핵심 요약
- Grid3D 기반 시뮬레이션은 3차원 나비에-스토크스 방정식으로 볼류메트릭 유체를 구현합니다.
- 비용은 해상도의 세제곱으로 증가하므로, 게임에서는 64~128 해상도를 사용하세요.
- Ray Marching으로 밀도 데이터를 볼류메트릭 렌더링하며, Step 수가 성능에 직접 영향을 줍니다.
- Vorticity Confinement으로 소용돌이 디테일을 보존할 수 있습니다.
- Pressure Iterations를 줄이면 비용이 감소하지만 비압축성이 저하됩니다.
- 3D 유체와 전통적 파티클을 하이브리드로 조합하면 비용 대비 높은 완성도를 달성할 수 있습니다.
도전 과제
배운 내용을 직접 실습해보세요
Grid3D Collection을 사용하여 3D 가스 시뮬레이션을 설정하세요. 온도(Temperature)에 따른 부력과 밀도(Density) 소멸을 구현하여 기본적인 화염 기둥 이펙트를 만드세요.
구체 영역에서 초기 밀도와 온도를 높은 값으로 분사(Inject)하여 폭발 시뮬레이션을 만드세요. Turbulence와 Dissipation Rate를 조절하여 폭발 후 연기가 퍼지는 과정을 표현하세요.
Volume Renderer의 Ray March Step Count, Shadow Step Count를 조절하며 품질과 성능의 균형을 찾으세요. LOD Distance에 따라 해상도를 동적으로 조절하는 시스템을 구현하세요.