본문 바로가기
vfxai 잡학지식 vfxai 잡학지식

후디니 POP 입자 수 계산: Birth Rate×Life

vfx 잡학지식 읽는 시간 약 12분 조회 4

후디니 POP 파티클이 동시에 몇 개 살아 있을지 먼저 알고 싶다면, 지속 생성에서는 Const. Birth Rate(초당 생성 수)와 평균 Life Expectancy(초)를 곱해 보세요. 예를 들어 초당 24개를 만들고 평균 수명이 2초라면 정상 상태에서는 약 48개가 동시에 존재합니다. 이 값은 연속 생성과 일정한 수명을 가정한 이상적인 평균이라, Houdini의 매 프레임 결과가 반드시 48개로 고정된다는 뜻은 아닙니다.

입자 수가 계산과 다르면 먼저 생성 위치를 고르는 Emission Type과 생성 수를 정하는 Birth 파라미터를 구분하세요. 이어 Life Variance와 시뮬레이션 Substeps를 확인하면 정상 상태에 도달하는 시간과 프레임별 흔들림을 설명할 수 있습니다.

POP Source에서 생성 위치와 횟수를 나눠 보세요

Emission Type은 어디서 태어날지 정합니다

Emission Type은 입자가 소스 지오메트리의 어떤 위치에서 만들어질지 고릅니다. All Points는 소스의 점들을 모두 대상으로 하고, Points는 설정한 수의 새 점을 소스 점에서 무작위로 뽑습니다. Scatter onto Surfaces는 면 위 임의 위치에 생성합니다. 이번 실측은 소스 위치와 전체 입자 수를 분리하기 위해 Points를 사용했습니다.

초당 개수와 cook당 개수는 단위가 다릅니다

Const. Birth Rate는 초당 생성할 입자 수입니다. 반면 Houdini 19.5.435 POP Source의 impulse 파라미터 라벨은 Impulse Count이며, 노드가 cook될 때마다 지정한 수를 생성합니다. 따라서 Impulse Count는 초당 개수가 아니라 한 번의 평가당 개수입니다. 매 프레임 한 번씩 평가되는 24fps 시뮬레이션에서 10개씩 impulse를 만들면 초당 240개가 될 수 있지만, DOP Substeps를 바꾸면 평가 횟수도 달라질 수 있습니다.

SideFX의 Houdini 22.0 POP Source 문서에서도 이번에 대조한 Emission Type, Impulse Count, Const. Birth Rate, Life Expectancy와 Life Variance의 핵심 정의는 Houdini 19.5 문서와 같았습니다. 확인한 범위에서 차이는 찾지 못했지만, 모든 버전의 UI 배치나 내부 구현까지 동일하다는 뜻은 아닙니다.

두 방식을 같이 쓸 수도 있지만, 입자 수를 먼저 계산할 때는 하나만 켜 두면 단위 혼동이 줄어듭니다. 지속적으로 일정한 양을 만들려면 Const. Birth Rate, 특정 시점마다 정해진 묶음을 만들려면 Impulse Count를 기준으로 계산하세요. 두 Activation이 꺼져 있으면 해당 방식으로는 생성되지 않습니다.

정상 상태 POP 파티클 수는 Birth Rate와 Life를 곱합니다

일정한 속도 R로 입자가 태어나고 각 입자가 평균 L초 동안 살아 있다면, 정상 상태의 기대 입자 수는 다음처럼 근사할 수 있습니다.

동시 입자 수 ≈ Const. Birth Rate × 평균 Life Expectancy

예를 들어 24 particles/s × 2 s = 약 48개입니다. 수명 변동이 없을 때 생성 시작 직후에는 아직 모든 수명의 입자가 쌓이지 않았으므로, 이상적인 연속 모델의 시점별 개수는 R × min(경과 시간, L)로 올라갑니다. 평균 수명이 2초라면 약 2초 동안 증가한 뒤 정상 구간에 들어갑니다. 24fps라면 2초는 48프레임이지만, 실제 생애주기 처리는 시뮬레이션 스텝 경계에서 일어나므로 프레임 하나의 개수가 이론값과 다를 수 있습니다.

이 식은 SideFX 문서에 그대로 적힌 공식이 아닙니다. SideFX가 정의한 초당 Birth Rate와 초 단위 Life를 바탕으로, 생성이 계속 켜져 있고 입자 제한이나 추가 삭제가 없는 경우를 계산한 근사치입니다. Max Sim Points, 다른 POP의 삭제, 충돌 반응, 활성화 애니메이션이 들어가면 실제 수는 이 값보다 줄거나 변합니다.

Houdini 19.5.435 hython에서 24fps, 고정된 소스, DOP Network Substeps 1, POP Solver Substeps 1로 3개 Birth Rate와 2개 수명을 교차해 기록했습니다. Probabilistic Emission은 켜고 Jitter Birth Time은 끈 상태이며, 별도 힘과 충돌은 두지 않았습니다. 아래 표는 이상적 계산값과 실제 정상 구간에서 관측한 수를 따로 보여 줍니다.

Const. Birth Rate (입자/초)Life Expectancy (초)계산값 R×L실측 정상 구간 입자 수관측 프레임
241242324–96
481484624–96
721726924–96
242484848–96
482969648–96
72214414448–96

초당 24개를 만드는 경우를 프레임별로 비교하면, Life가 1초일 때 정상 구간은 23개, 2초일 때는 48개였습니다. 점선은 연속 모델의 계산값이고 실선은 Houdini에서 관측한 수입니다.

Houdini 19.5.435에서 초당 24개를 생성하고 24fps로 계산한 Life 1초와 2초 실측경과 72프레임까지 이상적 계산값과 실측 입자 수를 비교합니다. Life 1초 실측은 23개, Life 2초 실측은 48개입니다.24 particles/s · 24 fps · DOP Substeps 1 · Life Variance 0010203040500122436486072시뮬레이션 경과 프레임동시 생존 입자 수23 실측 / 24 계산Life 1 실측계산Life 2 실측계산
Houdini 19.5.435 hython 실측. 1초 Life에서는 프레임 경계에서 계산값보다 1프레임 생성분이 적게 관측됐고, 2초 Life는 계산값과 일치했습니다. 점선은 이상적 연속 모델입니다.

Life 1초 조건에서 실측은 24·48·72개보다 각각 1·2·3개 적었습니다. 반면 Life 2초 조건은 48·96·144개로 계산값과 일치했습니다. 이 차이는 해당 설정에서 프레임 경계에 관측된 결과입니다. 모든 씬에 적용할 보정값은 아니므로, 계획할 때는 R×L을 평균으로 쓰고 최종 정확한 수는 자신의 시뮬레이션에서 확인하세요.

후디니 POP Source Birth 탭의 Const. Birth Rate 1000과 Life Expectancy 2 설정
Houdini 22.0.466 Apprentice의 POP Source Birth 탭입니다. Const. Birth Rate 1000, Life Expectancy 2라면 정상 상태에서 대략 1000×2 = 2000개가 동시에 떠 있습니다(Life Variance 0 기준).

Life Variance와 Substeps는 프레임별 개수를 흔듭니다

Life Variance는 Life Expectancy에 더하거나 뺄 초 단위 범위입니다. Life=2초, Variance=0.5초라면 각 입자의 수명은 1.5~2.5초 범위가 될 수 있습니다. 생성 직후 모든 수명이 채워질 때까지는 최대 수명인 2.5초가 필요합니다. 수명 분포가 Life를 중심으로 대칭인 경우 장기 평균 수명은 2초이므로, 기대 정상 수는 여전히 24 × 2 = 48개지만 매 프레임 실제 수는 흔들립니다.

같은 24 particles/s, Life=2초, Variance=0.5초 조건을 360프레임 돌렸을 때, 최대 수명을 지난 61~360프레임의 평균은 47.27개였습니다. 그 구간에서 최소 42개, 최대 53개를 관측했습니다. 한 번의 프레임에서 48이 아니라고 계산이 틀린 것은 아니며, 한 seed의 짧은 샘플만으로 모든 설정의 평균을 단정할 수도 없습니다.

Substeps도 비교 기준에 포함하세요. 같은 24 particles/s, Life=1초, Variance=0 조건에서 DOP Network Substeps를 4로 바꾸면 24·48·60번째 경과 프레임에서 각각 17·24·26개가 기록됐고, 마지막 24프레임 평균은 23개였습니다. 이 테스트에서는 Probabilistic Emission이 켜져 있어 4개의 하위 단계마다 기대 생성량이 0.25개로 나뉘었습니다. 프레임의 단일 수와 한 스텝 설정의 결과를 그대로 대조하지 말고, 같은 Substeps·seed·방출 설정으로 여러 프레임을 비교하세요.

SideFX의 POP Solver 문서는 age를 각 timestep마다 갱신하고 life를 넘긴 입자를 삭제 대상으로 표시한다고 설명합니다. DOP Network의 Substeps는 프레임당 시뮬레이션 단계 수를 정합니다. 따라서 FPS만 같아도 Substeps, Probabilistic Emission, Jitter Birth Time이 다르면 프레임에 찍히는 정수 개수가 달라질 수 있습니다.

Houdini POP · Birth Rate × Life

동시 입자 수와 메모리 어림하기

값을 바꾸면 프레임별 기대 입자 수와 수명 구간을 다시 계산합니다.

속성 기준 메모리 추정

기본 5개: P·v·age·life·id = 원시 값 36 B/입자

계산기는 연속 생성과 균등 수명 분포를 가정한 기대값입니다. 실제 Houdini의 프레임별 수는 emission 확률·Substeps·seed·Jitter Birth Time에 따라 달라집니다. 메모리는 속성의 원시 데이터값만 합산하며 Houdini 프로세스의 실제 RAM을 뜻하지 않습니다.

속성 기준 메모리는 하한으로만 어림하세요

입자 수가 늘면 메모리도 늘지만, 정확한 RAM은 입자 수만으로 결정되지 않습니다. 이 계산기의 기본값은 P와 v의 vector3 속성 2개, age와 life의 float 속성 2개, id의 int 속성 1개로 잡았습니다. float32와 int32 원시 값만 합하면 입자당 36바이트입니다. 추가 단일 float·정수 속성은 각각 4바이트, vector3 속성은 12바이트를 더해 추정합니다.

이 값에는 Houdini의 속성 배열·메모리 할당 오버헤드, DOP 캐시의 이전 프레임, 복사된 렌더 지오메트리와 GPU 데이터가 포함되지 않습니다. POP Solver 등에서 자동으로 더해지는 속성도 계산기에 자동 반영되지 않으므로, 36바이트는 선택한 5개 속성의 원시 값만 더한 하한입니다. 문자열이나 float·int·vector3 이외의 속성 형식은 계산하지 않습니다. 따라서 계산 결과는 실제 시스템 RAM 예상치가 아닙니다. POP Source가 상한에 도달하지 않았는데 입자 수가 계속 늘면 활성화 조건과 Max Sim Points도 확인하세요.

POP Life와 Pyro Dissipation은 다른 계산입니다

여기서 말하는 Life는 점으로 존재하는 POP 입자의 수명입니다. 연기 볼륨이 사라지는 양상을 같은 입자 수 공식으로 계산하면 안 됩니다. Pyro 연기의 소산을 조절하는 경우에는 후디니 Pyro Dissipation 값별 연기 수명 계산을 따로 확인하세요.

한 줄 정리

지속 생성 POP의 동시 입자 수는 Const. Birth Rate × 평균 Life로 먼저 근사하고, Life Variance와 Substeps를 고정한 뒤 실제 프레임 수로 검증하세요.

참고 자료

vfx 잡학지식

함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.