본문으로 건너뛰기

안동민 개발노트

본문 시작

유체 효과 구현

Grid 3D·Vector Field·Noise Force로 흐름과 난류를 만들고 밀도·부력·렌더링을 조정해 연기 기둥을 구현합니다.

나이아가라는 파티클에 중력이나 저항 같은 고전적인 물리 법칙을 적용하는 것을 넘어, 유체(Fluid)와 같은 동적인 환경 상호작용을 시뮬레이션할 수 있는 기능을 제공합니다.

복잡한 유체 역학 시뮬레이션은 아니지만, 파티클이 연기처럼 흐르거나, 물속에서 움직이거나, 소용돌이에 휩쓸리는 듯한 효과를 만들 수 있습니다.

이는 폭발 후의 연기 기둥, 물속 거품, 바람에 날리는 먼지 등 자연스러운 환경 효과를 구현하는 데 매우 유용합니다.

이 절에서는 나이아가라의 내장 기능을 활용하여 파티클에 간단한 유체 효과를 적용하는 기본적인 방법에 대해 알아보겠습니다.

유체 효과 구현 요소

나이아가라는 파티클에 중력이나 저항 같은 고전적인 물리 법칙을 적용하는 것을 넘어, 유체(좌표계와 감쇠값 정합)와 같은 동적인 환경 상호작용을 시뮬레이션하는 기능을 갖추고 있습니다. 복잡한 유체 역학 시뮬레이션은 아니지만, 파티클이 연기처럼 흐르거나, 물속에서 움직이거나, 소용돌이에 휩쓸리는 듯한 효과를 만들 수 있습니다.

  1. Grid 3D와 Force Field 연결 순서

    유체형 효과는 Collision 정합과 Grid 3D 시뮬레이션을 조합합니다. 2 더욱 직접적으로 유체와 유사한 흐름을 만들 때는 파티클에 힘(Force)을 가하는 필드를 활용합니다. 3 유체형 파티클은 투명도 정렬, 볼륨 해상도, 머티리얼 오버드로가 움직임보다 먼저 비용 병목을 만들 수 있습니다. 4 좌표계와 감쇠값 정합 응답은 지정한 영역 안에서 파티클이 유체처럼 움직이도록 만들 때 사용합니다.

  2. Grid 3D 기반의 유체 시뮬레이션

    유체형 효과는 Collision 정합과 Grid 3D 시뮬레이션을 조합합니다.

  3. Force 필드를 활용한 유체 흐름

    더욱 직접적으로 유체와 유사한 흐름을 만들 때는 파티클에 힘(Force)을 가하는 필드를 활용합니다.

  4. 유체 효과를 위한 렌더링 고려 사항

    유체형 파티클은 투명도 정렬, 볼륨 해상도, 머티리얼 오버드로가 움직임보다 먼저 비용 병목을 만들 수 있습니다.

  5. Collision 모듈의 좌표계와 감쇠값 정합 응답

    좌표계와 감쇠값 정합 응답은 지정한 영역 안에서 파티클이 유체처럼 움직이도록 만들 때 사용합니다.

  6. 유체형 파티클 검수 지점

    나이아가라는 중력과 저항뿐 아니라 유체처럼 주변 환경과 반응하는 효과도 표현할 수 있습니다. Grid 3D와 Collision을 조합해 공간 반응을 만듭니다. 충돌 표면, 힘장, 감쇠 값을 같은 좌표계에서 비교해야 흐름이 벽과 바닥을 통과하지 않습니다.


Grid 3D 기반의 유체 시뮬레이션

Grid 3D 비용은 셀 수와 반복 횟수가 곱해져 커진다

격자 해상도·Solver 반복·볼륨 샘플은 서로 독립된 숫자가 아니라 프레임마다 누적되는 계산량이다.

  1. 시뮬레이션 경로

    Resolution × Iterations × Advection step이 압력·확산·이동 계산을 만든다.

  2. 렌더 경로

    화면 점유 픽셀 × Ray step × Material 복잡도가 볼륨 샘플 비용을 만든다.

관측 신호먼저 낮출 값품질 확인
작은 해상도 변화에도 GPU 급증Grid size·voxel density실루엣과 얇은 소용돌이
부드럽지만 Solver가 비쌈Pressure·diffusion iterations흐름 안정성과 누출
화면을 덮을 때만 급증Ray steps·bounds·material농도와 가장자리

나이아가라에서 간단한 유체 효과를 구현하는 한 가지 방법은 Collision 모듈의 Fluid 응답과 그리드 기반 시뮬레이션을 활용하는 것입니다.

이는 파티클이 특정 영역 내에서 유체와 유사한 움직임을 보이도록 할 때 사용됩니다.

Collision 모듈의 Fluid 응답

이전 절에서 다룬 Collision 모듈에는 파티클이 충돌했을 때의 응답 방식 중 Fluid 옵션이 있습니다.

이는 파티클이 유체 표면에 닿았을 때 멈추거나 튕기는 대신, 유체 속으로 들어가 유체의 흐름에 영향을 받거나 유체의 특성에 따라 움직이는 것을 모방합니다.

  • 설정

    Particle Update 섹션에 Collision 모듈을 추가합니다.

    Collision 모듈의 Collision ModeDistance Field 또는 Trace로 설정합니다. (유체 표면과 충돌을 감지하기 위함)

    가장 중요한 설정으로, Collision 모듈의 Responses 섹션에서 Restitution이나 Friction 대신 Fluid 옵션을 활성화합니다.

    • Fluid Density Scale: 유체의 밀도에 대한 파티클의 상대적인 밀도를 조절합니다. 값이 낮으면 파티클이 더 쉽게 뜨거나 움직이고, 높으면 더 가라앉거나 저항을 더 받습니다.
    • Fluid Resistace: 유체가 파티클의 움직임에 얼마나 저항하는지를 조절합니다.
  • 활용: 파티클이 물 표면에 닿아 물속으로 가라앉는 듯한 효과나, 유체 경계면에서 움직임이 변화하는 효과를 만들 때 사용됩니다.

Force 필드를 활용한 유체 흐름

더욱 직접적으로 유체와 유사한 흐름을 만들 때는 파티클에 힘(Force)을 가하는 필드를 활용합니다.

이는 공간의 특정 영역에서 파티클에 일정한 힘을 가하여 마치 바람이나 물살에 휩쓸리는 듯한 효과를 줍니다.

Vector Field Force (방향성 흐름)

Vector Field Force 모듈은 미리 정의된 벡터 필드(Vector Field) 데이터를 참조하여 파티클에 힘을 가합니다.

벡터 필드는 공간의 각 지점에서 힘의 방향과 크기를 정의하는 3D 데이터입니다.

  • 설정

    Particle Update 섹션에 Vector Field Force 모듈을 추가합니다.

    Vector Field 속성에 원하는 Vector Field 에셋을 할당합니다.

    언리얼 엔진은 기본적으로 몇 가지 Vector Field 에셋(예: VF_Turbulence)을 제공하며, 외부 툴(Houdini, FumeFX 등)에서 커스텀 벡터 필드를 제작하여 임포트할 수도 있습니다.

    Intensity를 조절하여 벡터 필드가 파티클에 미치는 힘의 강도를 제어합니다.

  • 활용: 폭발 후의 회오리치는 연기, 물속 소용돌이, 특정 방향으로 흐르는 바람 효과 등 복잡하고 방향성 있는 유체 흐름을 모방할 때 사용됩니다.

Noise Force (불규칙한 흐름/터뷸런스)

Noise Force 모듈은 노이즈 함수를 기반으로 파티클에 불규칙하고 역동적인 힘을 가합니다.

이는 연기나 액체의 터뷸런스(Turbulence), 즉 난류 효과를 표현하는 데 매우 효과적입니다.

  • 설정

    Particle Update 섹션에 Noise Force 모듈을 추가합니다.

    Noise Strength (노이즈 강도): 노이즈가 파티클에 가하는 힘의 크기를 조절합니다.

    Noise Frequency (노이즈 주파수): 노이즈 패턴의 반복 빈도(세부 정도)를 조절합니다.

    주파수가 높으면 더 작고 빠른 변화가 생깁니다.

    Noise Speed (노이즈 속도): 노이즈 패턴이 시간에 따라 얼마나 빠르게 변하는지를 조절합니다.

    이 값이 높으면 연기가 빠르게 휘저어지는 것처럼 보입니다.

  • 활용: 연기나 구름의 불규칙한 움직임, 물속에서 발생하는 미세한 흐름, 먼지 폭풍의 난류 등 자연스러운 불규칙성을 가진 유체 효과를 표현하는 데 광범위하게 사용됩니다.

연기 기둥처럼 유체 느낌을 내는 효과는 힘 모듈을 한 번에 보지 말고 아래처럼 상승, 감쇠, 난류, 방향성 흐름으로 나눠 조합하면 튜닝이 쉬워집니다.

연기 흐름 힘 조합 기준

유체 느낌은 하나의 Fluid 옵션보다 상승 힘, 감속, 난류, 방향성 필드를 어떤 순서와 강도로 겹치는지에서 결정됩니다.

  1. 01 상승

    상승 Add Velocity Z를 낮게 주고 중력을 완화해 기본 실루엣을 만든다.

  2. 02 Drag

    Drag 위로 갈수록 속도를 줄여 연기가 퍼지고 멈추는 느낌을 만든다.

  3. 03 Noise

    Noise Strength와 Frequency로 작은 결, 큰 흔들림을 나눠 얹는다.

  4. 04 Vector

    Vector 바람, 통로, 소용돌이처럼 장면 전체의 큰 방향을 마지막에 더한다.


유체 효과를 위한 렌더링 고려 사항

유체와 유사한 파티클 효과를 만들 때는 렌더링 설정도 중요합니다.

  • Translucent 블렌드 모드: 연기, 안개, 물방울 등 대부분의 유체 효과는 반투명한 특성을 가지므로, 머티리얼의 Blend ModeTranslucent로 설정하는 것이 가장 일반적입니다.
  • Soft Particle: 파티클이 다른 오브젝트와 교차할 때 경계가 부드럽게 보이도록 Sprite RendererSoft Particle 옵션을 활성화하는 것이 좋습니다. 이는 파티클이 벽이나 바닥에 닿았을 때 부자연스럽게 잘리는 것을 방지합니다.
  • 볼류메트릭 렌더링 (고급): 나이아가라 렌더러는 아니지만, 언리얼 엔진의 Volumetric CloudVolumetric Fog와 같은 볼류메트릭 시스템과 나이아가라 파티클을 함께 사용하면 훨씬 더 사실적인 구름이나 안개 효과를 만들 수 있습니다.

직접 해보기: 간단한 연기 기둥 만들기

연기 기둥을 만들 때는 힘 모듈과 렌더링 설정을 아래 순서로 함께 조율합니다.

스프라이트 연기는 수명 0→1 동안 형태를 조율한다

Spawn 수량보다 밑동·상승·와류·팽창·소멸이 한 수명 안에서 자연스럽게 이어지는지 먼저 본다.

  1. 밑동

    Shape로 원천 폭을 만들고 Spawn Rate는 실루엣이 끊기지 않을 만큼만 둔다.

  2. 초기 상태

    Lifetime·Size·Color 범위를 좁혀 튜닝 기준을 고정한다.

  3. 상승

    Velocity·Acceleration로 큰 이동 방향을 먼저 만든다.

  4. 와류

    Curl Noise를 더하고 Drag로 속도 폭주를 누른다.

  5. 팽창

    Size Curve로 위로 갈수록 넓어지는 덩어리를 만든다.

  6. 소멸

    Alpha Curve를 0으로 보내며 SubUV 경계도 함께 흐린다.

조율 축먼저 볼 값화면에서 확인할 것
형태Shape·Velocity밑동 폭과 상승 방향
시간Lifetime·Size/Alpha Curve생성→팽창→소멸 연결
표면Material·SubUV·Renderer경계와 겹침 면적

중력과 노이즈 힘을 받아 하늘로 피어오르는 연기 기둥 효과를 만들어 보겠습니다.

새 나이아가라 시스템 생성: New system from selected emitters (기본 스폰, 중력 포함) 템플릿을 사용하여 NS_SimpleSmoke라는 이름의 시스템을 만듭니다.

Initialize Particle 설정
  • Lifetime: 3.0 ~ 5.0 (Random Float) (연기가 서서히 사라지도록)
  • Sprite Size: 50.0 ~ 100.0 (Random Float) (연기가 퍼지면서 커지도록)
  • Color: 어두운 회색 (R:0.1, G:0.1, B:0.1, A:1)
Add Velocity 설정
  • Velocity Z 값을 50.0 ~ 100.0 (Random Float) 정도로 설정하여 연기가 위로 천천히 솟아오르게 합니다.
  • XYRandom Range Float를 사용하여 -10.0 ~ 10.0 정도로 미세한 무작위 수평 속도를 추가합니다.

Add Gravity Force 확인: Particle Update 섹션에 Add Gravity Force 모듈이 있는지 확인하고, 필요하다면 Gravity 값을 낮게 설정하여 연기가 아주 천천히 떨어지도록 하거나 (예: Z: -200.0), 아예 제거하여 중력 영향을 받지 않게 할 수도 있습니다.

Drag 모듈 추가
  • Particle Update 섹션에 Drag 모듈을 추가합니다.
  • Drag 값을 0.5 정도로 설정하여 연기가 서서히 감속하도록 합니다.
Noise Force 모듈 추가
  • Particle Update 섹션에 Noise Force 모듈을 추가합니다.
  • Noise Strength: 500.0 ~ 1000.0 (Random Float) (연기가 휘저어지는 강도)
  • Noise Frequency: 0.1 ~ 0.3 (Random Float) (연기 패턴의 크기)
  • Noise Speed: 0.5 ~ 1.0 (Random Float) (연기 변화 속도)
렌더링 설정 (Sprite Renderer)
  • Sprite Renderer를 선택합니다.
  • Material: 연기 텍스처를 포함하고 Translucent 블렌드 모드로 설정된 머티리얼을 할당합니다. (엔진 기본 M_Smoke_SubUV 등을 사용하거나, 직접 만듭니다.)
  • Soft Particle 옵션을 활성화합니다.
파티클 색상 및 알파 변화 (Scale Color)
  • Particle Update 섹션에 Scale Color 모듈을 추가합니다.
  • Scale FactorColor From Curve로 설정하고, Particles.NormalizedAge를 입력으로 사용하여 수명에 따라 연기의 색상이 검은색에서 회색으로 변하고, 알파(투명도)는 1.0에서 0.0으로 점차 사라지도록 커브를 조절합니다.

이제 뷰포트에서 연기가 중력과 노이즈 힘에 의해 불규칙하게 휘저어지며 위로 솟아오르다가 서서히 사라지는 것을 확인할 수 있을 겁니다.

결과가 기대와 다르면 아래 증상표를 기준으로 실루엣, 움직임, 렌더링 중 어느 축을 먼저 조정할지 결정합니다.

유체 효과는 화면 증상에서 원인과 조절값을 역추적한다

한 번에 여러 값을 바꾸지 말고 증상 하나를 고른 뒤 Shape·Motion·Render 축 중 하나만 조정한다.

  1. Shape

    크기·수명·Spawn Area로 전체 실루엣을 맞춘다.

  2. Motion

    Velocity·Drag·Field·Noise로 큰 흐름과 변주를 나눈다.

  3. Render

    Alpha·Texture·Depth Fade로 농도와 경계를 마감한다.

  4. Retest

    같은 카메라에서 증상이 줄고 새 결함이 없는지 본다.

화면 증상가능성이 큰 원인한 번에 바꿀 값다시 볼 결과
한 덩어리로 뭉침Spawn 영역이 좁고 결이 작음Spawn Area↑ 또는 Noise Frequency↓큰 실루엣 분리
너무 빨리 솟음상승 속도 과다·감쇠 부족Z Velocity↓ 또는 Drag↑머무는 시간
흐름이 산만함Noise가 큰 방향을 덮음Noise Strength↓ 후 Vector Field 고정주 흐름 유지
벽·바닥에서 잘림깊이 교차가 딱딱함Depth Fade·Soft Particle교차 경계

간단한 유체 느낌은 Grid 3D를 바로 쓰기보다 힘 필드와 렌더링 비용을 비교하면서 단계적으로 접근합니다.

필요한 상호작용 수준이 연기 구현 방식을 결정한다

화면 설득력만 필요하면 스프라이트 힘 조합부터 시작하고, 격자 내부의 실제 상호작용이 필요할 때만 Grid 3D로 올라간다.

  1. 아니오 · 스프라이트 경로

    연기 기둥·마법 흐름처럼 카메라에서 보이는 방향과 부피감이 목표다. Shape → Vector Field → Noise → Soft Render 비용: 파티클 수·투명 오버드로우 중심

  2. 예 · Grid 3D 경로

    부력·압력·경계·와류가 공간 안에서 실제로 상호작용해야 한다. Bounds → Resolution → Solver → Volume Render 비용: 셀 수·반복 계산·볼륨 샘플 중심


나이아가라에서 간단한 유체 효과를 만들 때는 Drag, Noise Force, Vector Field Force 같은 힘 모듈과 렌더링 설정을 함께 조정합니다.

폭발 여파, 안개, 물속 움직임처럼 느린 흐름과 방향성이 중요한 효과에 적합합니다.

간단한 유체 효과 구현은 입력 데이터, 이미터 책임, 시뮬레이션 비용, 재현 기준으로 점검합니다.