본문 바로가기

정적 메시와의 기본 콜리전

Collision 모듈과 Distance Field를 이용해 파티클이 정적 메시를 감지하고 바닥에서 반사·마찰·소멸하도록 설정합니다.

파티클이 바닥에서 튕기거나 벽에 닿아 사라지게 하려면 충돌 감지와 반응을 설정해야 합니다. Niagara Collision은 시각 효과를 위한 근사이며 게임의 명중·피해 판정은 별도 게임플레이 로직으로 처리합니다.

먼저 시뮬레이션 경로 선택하기

Static Mesh는 메시 에셋 종류이며 반드시 움직이지 않는다는 뜻은 아닙니다. 이 절에서는 움직이지 않는 바닥 메시를 기준으로 시작합니다.

경로읽는 표면확인할 제한
CPU Collision월드에 대한 trace대상 컴포넌트의 query collision과 trace 채널 응답, 입자 수에 따른 CPU 비용
GPU Scene Depth현재 렌더된 깊이화면 밖·가려진 표면 정보와 카메라 변화에 의존
GPU Distance Fields전역 거리 필드거리 필드 생성·지원 플랫폼·얇은 표면과 해상도 오차

하나의 Collision Mode 목록에서 Trace, Static Mesh, Landscape를 서로 같은 선택지로 고르는 구조로 이해하지 않습니다. 모듈에 노출되는 항목은 Sim Target과 버전에 따라 다릅니다. GPU Ray Traces 같은 추가 기능은 별도의 지원 조건을 확인합니다.

Scene Depth는 현재 카메라의 깊이 데이터를 읽습니다. 그래서 월드에 같은 바닥이 있어도 카메라 뒤나 화면 밖, 다른 물체에 가려져 깊이에 남지 않은 표면은 조회할 수 없습니다. CPU trace는 입자의 조회 경로에 충돌 대상이 있는지 검사합니다. 화면 깊이 대신 월드의 query collision(조회 요청에 응답하는 충돌 설정)을 사용합니다. 바닥의 trace 채널 응답을 확인하고 소수의 입자로 반응을 비교할 때 기준으로 삼을 수 있습니다.

GPU Distance Fields는 월드 위치에서 거리 필드로 표현된 표면을 찾습니다. 화면에 보이지 않는 표면도 표현 범위 안에 있으면 조회할 수 있어 오래 남는 파편에 선택할 이유가 있습니다. 다만 Global Distance Field는 카메라 주변의 제한된 영역을 낮은 해상도로 표현합니다. 화면 밖 어디서나 충돌하거나 얇은 모든 표면에서 정확히 반사한다고 기대하지 않습니다. 표현 범위와 생성 조건은 Mesh Distance Fields 참조에서 확인할 수 있습니다.

충돌 입력의 관측 범위를 비교한 개념도 — 실제 엔진 캡처가 아닙니다

NIAGARA · CH7-1

같은 표면도 읽는 데이터가 다릅니다

위에서 본 배치로 한 시점의 카메라와 세 표면을 같은 위치에 둡니다. 실선 삼각형은 카메라가 보는 방향, 작은 원은 각 입자의 위치입니다. 표면의 포함 여부를 설명하는 개념도이며 공간 비율은 고정된 모델이 아닙니다.

CPU query collision

각 입자의 위치에서 월드 표면 조회 CPU trace는 각 입자에서 query collision 대상 A·B·C로 조회하며 카메라 시야로 대상을 제한하는 그림이 아닙니다. C 뒤/밖 A 앞쪽 B 가림 카메라 같은 카메라 · 표면 · 입자 위치
동일한 카메라·표면 배치에서 충돌 입력 비교CPU는각입자에서A/B/Cquery조회,SceneDepth는A앞표면만현재깊이에남음,DistanceField는유한표현범위안A/B/C를근사한다. C는카메라뒤,A는앞,B는A에가려짐. 카메라시야삼각형은CPU조회범위가아니다.C뒤/밖A앞쪽B가림카메라카메라 · 표면 위치 동일

CPU Sim에서는 각 입자의 위치에서 월드 query collision을 조회합니다. 이 예시는 A·B·C 모두 query 대상으로 준비돼 있다고 가정합니다.

입자에서 표면으로 향하는 짧은 화살표가 조회 경로입니다. C가 카메라 뒤에 있거나 B가 A에 가려져도 화면 깊이가 직접적인 조회 기준은 아닙니다.

대상 컴포넌트의 query collision·trace 채널 응답을 확인합니다. 카메라에서 쏘는 게임플레이 trace나 실제 충돌 성공 결과를 그린 것이 아닙니다.

GPU Scene Depth

현재 화면 깊이에 남은 표면 조회 GPU Scene Depth에서는 현재 깊이에 남은 A의 앞표면 부분을 강조하고 A에 가려진 B와 카메라 뒤 C는 깊이 데이터가 없는 경우로 구별합니다. C 뒤/밖 A 앞쪽 B 가림 카메라 같은 카메라 · 표면 · 입자 위치
동일한 카메라·표면 배치에서 충돌 입력 비교CPU는각입자에서A/B/Cquery조회,SceneDepth는A앞표면만현재깊이에남음,DistanceField는유한표현범위안A/B/C를근사한다. C는카메라뒤,A는앞,B는A에가려짐. 카메라시야삼각형은CPU조회범위가아니다.C뒤/밖A앞쪽B가림카메라카메라 · 표면 위치 동일

GPU Compute Sim · Scene Depth에서는 현재 카메라 깊이에 남은 표면을 읽습니다. 강조한 A의 앞표면 부분이 그 예시입니다.

B는 A에 가려지고 C는 카메라 뒤에 있어 이 시점의 깊이 데이터에 남지 않습니다. 점선 표면은 월드에 없는 메시가 아니라 이 조회에 필요한 화면 데이터가 없는 경우입니다.

카메라 방향이 바뀌면 깊이에 남는 표면도 달라질 수 있습니다. 입자가 반드시 관통하거나 소멸한다는 결과를 약속하지 않습니다.

GPU Global Distance Field

유한한 월드 표현 안의 근사 표면 조회 GPU Global Distance Field는 카메라 주변의 제한된 표현 영역 안에 있는 A·B·C의 근사 표면을 읽으며 화면 깊이가 없다고 그 표면 데이터가 곧 사라지는 것은 아닙니다. C 뒤/밖 A 앞쪽 B 가림 카메라 같은 카메라 · 표면 · 입자 위치
동일한 카메라·표면 배치에서 충돌 입력 비교CPU는각입자에서A/B/Cquery조회,SceneDepth는A앞표면만현재깊이에남음,DistanceField는유한표현범위안A/B/C를근사한다. C는카메라뒤,A는앞,B는A에가려짐. 카메라시야삼각형은CPU조회범위가아니다.C뒤/밖A앞쪽B가림카메라카메라 · 표면 위치 동일

GPU Compute Sim · Distance Fields에서는 생성된 거리 필드의 근사 표면을 읽습니다. 둥글게 표시한 A·B·C는 이 예시의 표현 범위 안에 있습니다.

카메라 주변의 점선 테두리는 유한한 표현 영역입니다. 화면에 보이지 않아도 이 범위 안의 표면은 조회할 수 있습니다. 실제 clipmap 개수·거리·해상도 또는 경계 모양을 그린 것은 아닙니다.

Generate Mesh Distance Fields와 지원 플랫폼·렌더 경로를 확인합니다. 표현 범위 밖이나 얇은 형상의 오차까지 해결하는 무한 월드 조회는 아닙니다.

표면 데이터와 Bounds·표시·수명·시뮬레이션 조건은 별도로 확인합니다. 그림은 데이터가 포함되는 조건을 설명하며 모든 입자의 반사를 보장하지 않습니다. 게임의 명중·피해 판정은 별도 게임플레이 로직의 책임입니다.

그림은 같은 카메라와 표면을 놓고 각 경로에 어떤 데이터가 있는지 비교합니다. A는 앞쪽 표면, B는 A에 가려진 표면, C는 카메라 뒤의 표면입니다. 실제 엔진 캡처나 정확한 공간 비율을 나타낸 그림은 아닙니다. CPU에서는 각 입자에서 query 대상 표면으로 조회하며, 카메라의 시야가 trace 범위가 되는 것은 아닙니다.

Particle Update 모듈 참조에 따라 기본 Collision은 Solve Forces and Velocity 바로 앞에 둡니다. 힘과 충돌 입력을 준비하는 순서는 기본 물리 시뮬레이션에서 이어서 살펴봅니다.

충돌 반응값

  • Restitution: 표면 법선 방향의 반발을 조절합니다. 0은 법선 방향 반발이 없는 상태이지 모든 접선 이동이 즉시 0이 된다는 뜻은 아닙니다. 1도 중력·저항·다른 손실까지 없애지는 않습니다.
  • Friction: 접선 방향 미끄러짐의 감쇠에 관여합니다. 정확한 범위와 반응은 모듈 버전 및 solver 조건을 확인합니다.
  • Collision Radius: 보이는 Sprite/메시와 충돌 근사가 맞는지 조절합니다. Sprite Size는 전체 폭·높이이므로 반경과 같은 숫자가 아닙니다. 모든 메시가 자동으로 정확한 바운딩 박스 충돌을 사용하는 것도 아닙니다.
  • 종료 조건: 충돌 후 제거가 필요하면 모듈의 kill 설정 또는 충돌 결과를 사용하는 Kill Particles를 구성합니다. 버전에 없는 Max Collisions 필드에 의존하지 말고, 반복 횟수가 필요하면 실제 제공되는 충돌 카운트/상태와 수명 제한을 확인합니다.

예시: 반발을 법선과 접선으로 나누기

표면 법선을 +Z로 놓은 단순 계산 모델에서 충돌 직전 속도를 (100, 0, −300) cm/s로 정합니다. 중력·마찰·추가 손실을 이 한 번의 계산에서 제외하고, 법선 성분만 충돌 후 = −Restitution × 충돌 전으로 바꾼다고 가정합니다. Restitution 0.7이면 Z 성분은 +210 cm/s, 접선 X 성분은 그대로 +100 cm/s입니다. 원 실습의 Friction 0.5를 적용한 실제 엔진 궤적을 이 계산과 같다고 보장하지 않습니다.

같은 모델에서 Restitution만 0으로 바꾸면 충돌 후 속도는 무엇일까요? 모든 방향으로 즉시 멈춘다는 설명이 맞는지도 판단하세요.

법선 성분만 바꾸어 풀이하기

속도는 (100, 0, 0) cm/s입니다. 법선 방향 반발은 없지만 접선 성분은 이 모델에서 유지됩니다. 접선까지 줄이려면 마찰이나 다른 감쇠 조건이 필요합니다. 실제 모듈 결과를 확인할 때는 시간 간격·반경·표면 근사와 다른 힘도 함께 기록합니다.

Distance Field 준비

Project Settings의 Rendering에서 Generate Mesh Distance Fields를 검색해 켭니다. 에디터가 요구하는 재시작과 데이터 생성이 완료되도록 합니다.

거리 필드 시각화에서 대상 바닥의 표면이 표현되는지 확인합니다. 너무 얇은 면, 작은 세부 형상, 비균일 스케일은 근사 오차를 만들 수 있습니다. 무조건 가장 정확한 충돌 방식이라고 보지 않습니다.

GPU 이미터의 Collision에서 Distance Fields 경로를 선택합니다. CPU trace와 비교하려면 Sim Target과 충돌 설정을 함께 바꾸며 두 경로의 대상 데이터가 다름을 기록합니다.

비교 전에 엔진 마이너 버전, 플랫폼/GPU, RHI(그래픽 API)와 렌더 경로를 기록합니다. Sim Target은 입자를 CPU와 GPU 중 어디에서 시뮬레이션할지 정하는 항목입니다. CPU Sim에서는 trace를, GPU Compute Sim에서는 지원되는 Scene Depth 또는 Distance Fields 경로를 사용합니다. 프로젝트 설정을 켰더라도 선택한 플랫폼과 렌더 경로가 GPU Distance Field Collision을 지원해야 합니다. 예를 들어 현재 렌더 기능 참조의 모바일 표는 이 기능을 미지원으로 표시합니다.

거리 필드 생성이 끝나지 않았거나 지원 경로가 없다면 해당 비교는 조건 부족으로 남기고 CPU 예제를 이어갑니다. 생성된 메시 표현과 Global Distance Field 시각화에서 목표 표면이 표현 범위에 있는지도 구별해 확인합니다. 설정을 켰다는 사실만으로 그 표면의 데이터까지 준비됐다고 판단하지 않습니다.

직접 해 보기: 바닥에서 튕기는 파티클

기본 Sprite 시스템을 복제해 NS_BouncingParticles로 저장합니다. Emitter State는 계속 재생되게 하고 Emitter Update에 Spawn Rate를 둡니다. 처음에는 20개/초처럼 소수로 시작합니다.

Particle Spawn의 Initialize Particle에서 Lifetime 2초, Sprite Size 10 cm, 밝은 Color를 설정합니다. Add Velocity도 Particle Spawn에 두고 Z=300 cm/s, X/Y는 각각 -50~50 cm/s 범위로 정합니다.

Particle Update에 Particle State, Gravity Force, Collision, Solve Forces and Velocity를 둡니다. Gravity Force는 아래 방향 가속도 (0,0,-980) cm/s²를 기준으로 하고 Collision은 solver 바로 앞에 둡니다.

우선 CPU Sim으로 두고 Collision의 trace 채널에 대해 바닥이 Block 응답을 하도록 설정합니다. Restitution 0.7, Friction 0.5부터 시작하고 반경은 10 cm 폭 Sprite에 대해 약 5 cm를 기준으로 시각 크기와 비교합니다. 충돌 즉시 제거하는 설정은 끕니다.

시스템을 바닥에서 약 100 cm 위에 배치합니다. 단순하고 충분히 두꺼운 바닥에서 재생해 반발과 미끄러짐을 각각 확인합니다. Particle State에서 수명 종료 시 제거되게 합니다.

기본 반응이 맞으면 복사본을 GPU Compute Sim으로 바꾸고 위에서 준비한 Distance Fields 경로를 적용합니다. 움직임이 들어갈 Bounds를 설정하고, 화면 밖과 얇은 표면에서 차이를 비교합니다.

예상 결과는 상승 후 낙하하고 표면에서 반발하는 움직임입니다. 지속적인 중력이 있으므로 저항·충돌 반응·수명 설정에 따라 완전히 멈추기 전에 제거될 수도 있습니다. 감지 자체가 실패하면 반발값보다 표면 데이터와 반경부터 확인합니다.

카메라 방향만 바꿔 비교하기

두 GPU 경로가 지원되고 거리 필드 준비가 끝났다면 CPU 예제를 기준으로 GPU 복사본을 두 개 만듭니다. NS_BouncingParticles_Depth는 Scene Depth, NS_BouncingParticles_DF는 준비한 Distance Fields 경로를 사용하고 둘 다 GPU Compute Sim으로 둡니다. 크기·수명·초기 속도·중력·반응값과 바닥/emitter 위치는 그대로 유지합니다. 한 번에 한 시스템만 재생하며 비교합니다. CPU에서 GPU로 바꾸는 단계는 Sim Target과 충돌 데이터 경로를 함께 바꾸는 비교입니다. 두 경로의 궤적이나 반사 횟수가 같아야 한다는 실험으로 보지 않습니다.

먼저 바닥 윗면과 입자의 낙하 영역을 함께 볼 수 있는 방향을 시점 1로 정합니다. 시점 2에서는 카메라 위치를 그대로 두고 바닥이 화면 밖이나 뒤가 되도록 방향만 돌립니다. 각 경로 안에서는 이 카메라 방향만 바꾸며 입자 설정값과 메시를 함께 수정하지 않습니다. Scene Depth 시각화에서는 목표 표면이 현재 깊이에 남는지, 거리 필드 시각화에서는 표면 표현이 있는지를 비교합니다.

조건예상할 차이다르면 먼저 확인할 곳
CPU trace에서 시점 1→시점 2같은 query 대상은 화면 깊이 유무가 직접적인 조회 기준이 아님바닥의 query collision·채널 응답, 시뮬레이션이 계속 유효한지
GPU Scene Depth에서 목표 표면이 깊이에 있음해당 화면 데이터가 충돌 입력이 될 수 있음Scene Depth에 표면이 남는지, 반경과 반응값
GPU Scene Depth에서 표면이 화면 밖·뒤·가림목표 표면의 현재 깊이 데이터가 부족할 수 있음먼저 표면 데이터, 그다음 Bounds·표시·수명 조건
GPU Distance Fields에서 표면이 생성된 표현 범위 안에 있음화면 깊이 유무만으로 표면 데이터가 사라지는 경로와 구별됨Mesh/Global Distance Field 시각화, 얇은 형상·해상도·반경
거리 필드 미생성·경로 미지원·표현 범위 밖현재 조건으로 그 비교를 판정할 수 없음생성 완료, 지원 플랫폼/RHI·렌더 경로와 표현 범위

시점 2에서 보이지 않는 입자의 충돌을 화면 관측 완료로 적지 않습니다. 다시 시점 1로 돌아온 새 입자의 반응도 화면 밖에 있던 특정 입자가 충돌했다는 증거는 아닙니다. 표면 데이터가 있었는지와 실제로 볼 수 있던 반응을 나누어 기록하고, 보이지 않은 반응은 관측 불가로 남깁니다.

효과가 사라졌다고 바로 충돌 실패로 판단하지 않습니다. Bounds는 효과의 움직임을 포함하는 영역입니다. 이 영역과 입자 수명, 표시 여부, 조건에 따라 표시나 시뮬레이션을 줄이는 culling 설정을 함께 확인합니다. 입자가 계속 시뮬레이션되는 조건에서 표면 조회 경로를 비교해야 데이터 차이를 해석할 수 있습니다. 위 표는 이런 조건을 만족할 때의 예상이며 모든 입자의 반사 성공을 보장하지 않습니다.

충돌 이벤트와 비용

CPU 파티클의 충돌을 다른 이미터에 전달하려면 별도 Generate Collision Event와 수신 이미터의 Event Handler/Receive Collision Event를 구성합니다. 소스의 Persistent IDs와 CPU 이벤트 지원을 확인합니다. Event Handler는 임의의 Blueprint 이벤트나 사운드 호출을 자동 실행하는 인터페이스가 아닙니다. 게임플레이 Hit, Niagara 데이터 내보내기, 오디오 기능은 각각의 전달 경로가 필요합니다.

충돌하는 동시 입자 수·수명·조회 범위를 줄이고 실제 장면에서 비용을 측정합니다. 눈에 잘 띄는 핵심 파편만 충돌시키거나 첫 충돌 후 제거하는 설계도 비교합니다.