기본 물리 기반 파티클 시뮬레이션
질량·중력·힘·공기 저항을 Force와 Solve 단계에 적용해 낙하하고 감속하는 폭발 파편의 움직임을 만듭니다.
Niagara에서는 초기 속도와 매 틱 적용되는 가속·저항을 조합해 폭발 파편의 궤적을 만듭니다. 이는 시각 효과용 입자 시뮬레이션이며 모든 파티클이 Chaos 강체가 되는 것은 아닙니다.
힘, 가속도, 질량 구분
물리식 a = F / m에서 힘과 가속도는 다릅니다. 위치를 cm, 시간을 s, 질량을 kg으로 두면 가속도는 cm/s², 힘은 kg·cm/s²입니다. 힘을 그대로 속도에 더하지 않고 가속도와 시뮬레이션 시간 간격을 통해 속도 변화를 계산합니다.
Niagara의 모듈 이름에 Force가 있어도 입력이 어떤 단위와 질량 처리를 사용하는지는 해당 모듈 계약을 확인해야 합니다. Linear Force, Acceleration Force, Point Attraction Force 등의 목적이 다르며, 모든 Add Force 모듈이 자동으로 Particles.Mass로 나눈다고 가정하지 않습니다.
- Gravity Force: 아래 방향 가속도를 적용합니다. (0,0,-980) cm/s²는 시작 기준이며 프로젝트나 효과에 따라 바꿀 수 있습니다. 같은 중력 가속도만 받으면 무거운 파티클이 더 빨리 떨어지는 것은 아닙니다.
- Drag: 속도를 감쇠합니다. 기본 Drag는 질량과 무관하게 적용되므로 질량만 바꾸어 감속 차이를 기대하지 않습니다.
- Mass: Initialize Particle 또는 Spawn의 속성 설정에서 0보다 큰 값을 지정합니다. 물리량을 직접 모델링하려면 질량을 읽는 계산을 명시하고, 다른 모듈에서 같은 질량 보정을 중복하지 않습니다.
- 초기 속도: Particle Spawn의 Add Velocity에서 한 번 설정합니다. Particle Update에서 매 틱 같은 속도를 더하면 다른 가속 효과가 됩니다.
업데이트 의존 관계
Particle Spawn의 초기 속도는 별도입니다. 실제 사용 모듈의 의존성 안내를 따르고 위치를 덮어쓰는 후처리도 확인합니다.
Particle Spawn에서 Lifetime·크기·색상·질량과 초기 위치/속도를 준비합니다.
Particle Update의 Particle State로 나이와 수명 종료를 관리하고, Gravity Force·선택한 힘 모듈·Drag에서 이번 틱의 입력을 준비합니다.
충돌이 필요하면 Collision을 Solve Forces and Velocity 바로 앞에 둡니다. solver 뒤에 Collision을 넣는 일반 규칙으로 설명하지 않습니다.
Solve Forces and Velocity가 누적 입력과 시간 간격을 이용해 속도·위치를 갱신합니다. 위치를 따로 덮어쓰는 제약이나 후처리가 있으면 그 의존성을 확인합니다. Update Age가 “위치 모듈”인 것은 아닙니다.
직접 해보기: 중력과 저항을 받는 폭발 파편
NS_BouncingParticles를 복제해 NS_PhysicsBlast를 만듭니다. 연속 Spawn Rate를 끄고 Emitter Update의 Spawn Burst Instantaneous에서 시간 0에 100개를 생성합니다. Emitter State를 Self/Once로 구성하고 입자의 자연 소멸까지 처리되게 합니다.
Initialize Particle에서 Lifetime은 23초, Sprite Size는 5 cm, Color는 회색·갈색 계열로 둡니다. Mesh Renderer를 쓴다면 메시 원본 크기를 확인합니다. 한 변 100 cm 큐브에 Scale (0.05,0.05,0.05)를 주면 약 5 cm가 됩니다. Mass는 15 범위로 한 번 정하되 아래 기본 궤적이 질량만으로 달라진다고 가정하지 않습니다.
Particle Spawn의 Add Velocity에서 임의의 단위 방향에 속력 100 cm/s를 곱한 벡터를 초기 속도로 줍니다. 해당 버전의 구면 방향 입력을 쓰거나 안전한 정규화로 방향을 만듭니다. 위치 분포의 Radius와 속력은 서로 다른 값입니다.
Particle Update에 Gravity Force와 Drag를 추가합니다. 먼저 Drag 0.5로 비교하고, 파편마다 다르게 하려면 Spawn에서 사용자 Float Particles.DragAmount를 0.5~2 범위로 한 번 기록한 뒤 Drag 입력에 연결합니다. Update에서 매번 난수를 다시 뽑는 효과와 구분합니다.
바닥 반응이 필요하면 Collision에서 Restitution 0.2, Friction 0.8을 시작값으로 사용합니다. 순서는 Particle State → 힘/Drag → Collision → Solve Forces and Velocity이며 사용 모듈의 의존성 안내도 확인합니다.
동일한 카메라에서 초기 속력, Gravity, Drag, 충돌 반응을 하나씩 바꿔 비교합니다. 낙하 중에는 중력이 계속 속도를 늘리므로 “모든 방향 속력이 계속 줄어든다”는 결과를 기대하지 않습니다.
질량 효과를 비교하려면 같은 외력 F에 대해 서로 다른 양의 m으로 a=F/m을 계산해 가속도 입력에 적용하는 별도 실험을 구성합니다. 현재 기본 예제의 초기 속도·중력·질량 무관 Drag만으로 질량별 차이가 보장되지는 않습니다.
더 복잡한 움직임
Vector Field·Curl Noise로 공간에 따라 다른 입력을 만들고, 위치에서 목표까지의 방향으로 사용자 정의 흡인력을 만들 수 있습니다. 목표와 현재 위치가 같은 경우 정규화의 0벡터를 처리합니다. Physics Asset과 상호작용하려면 그 충돌 데이터를 읽는 별도 경로를 선택합니다. Skeletal Mesh 표면 샘플링을 추가하는 것만으로 물리 충돌이 자동 완성되지는 않습니다.
모듈의 실제 역할은 Particle Update 참조를 따릅니다. 프레임 간격·좌표 공간·최댓값·수명을 고정하고 하나씩 조절하면 폭주나 관통 원인을 찾기 쉽습니다.