후디니 nearpoints·pcfind 반경과 최대 개수: 찾는 점 수 계산기
Houdini에서 Scatter로 점을 뿌린 뒤 nearpoints를 실행했는데, 예상보다 점이 적게 잡히는 경우가 있습니다. 반경을 늘려도 결과 개수가 그대로이거나, 주변 점 16개를 찾으려 했는데 실제로는 15개만 남기도 합니다.
이웃 점 수를 조절하려면 반경과 최대 개수를 따로 설정해야 합니다. 반경(radius 또는 maxdist)은 검색할 공간의 크기를 정하고, 최대 개수(maxpoints 또는 maxpts)는 반환할 점 수의 상한을 정합니다. 최대 개수를 100으로 설정했다고 주변 점 100개가 생성되는 것은 아닙니다.
점이 균일하게 분포한 평면이라면 밀도와 반경만으로 평균 이웃 수를 계산할 수 있습니다. 반경을 먼저 추정하고, 최대 개수는 그 결과를 불필요하게 자르지 않도록 설정하세요. 검색 위치가 원래 점과 같다면 자기 자신이 결과에 포함되는지도 확인해야 합니다.
반경 안에 점이 몇 개 들어오는지 먼저 계산합니다
평평한 표면에 점이 균일하게 분포했다면 반경 안의 평균 점 수는 원의 면적과 점 밀도로 추정할 수 있습니다.
2D 표면에서 자기 자신을 제외한 기대 이웃 수는 다음과 같습니다.
기대 이웃 수 k ≈ 밀도 ρ × π × 반경 r²
밀도는 scene unit²당 포인트 수입니다. 예를 들어 면적 400인 평면에 점 8,000개가 균일하게 분포했다면 밀도는 20 points/unit²입니다.
이 밀도에서 반경을 0.5로 설정하면 다른 이웃의 기대 개수는 20 × π × 0.5² ≈ 15.71개입니다. 반대로 원하는 다른 이웃 수가 정해져 있다면 공식을 반경 기준으로 바꿀 수 있습니다.
2D 반경 r ≈ √(k / (π × ρ))
예를 들어 밀도 20에서 평균적으로 다른 점 16개를 찾고 싶다면 반경은 약 0.505입니다. 이는 평균 이웃 수에 맞춘 초기 반경이지, 모든 점에서 정확히 16개가 검색된다는 뜻은 아닙니다.
3D 부피에 점이 분포한 경우에는 원의 면적 대신 구의 부피를 사용합니다.
3D 기대 이웃 수 k ≈ ρ × (4/3) × π × r³
3D 반경 r ≈ ∛(3k / (4πρ))
이때 3D 밀도는 scene unit³당 포인트 수입니다. 표면 밀도와 부피 밀도는 단위가 다르므로 같은 숫자를 그대로 바꾸어 사용하면 안 됩니다.
nearpoints·pcfind 반경과 이웃 수 계산기
아래 계산기는 점 밀도와 반경을 입력해 예상 이웃 수를 구하거나, 원하는 다른 이웃 수에서 필요한 반경을 역산하는 용도입니다. 표면 분포는 2D, 부피 분포는 3D를 선택하세요.
반경과 밀도로 평균 이웃 수 계산
균일하게 분포한 점의 평균을 추정합니다. 분포 차원, 점 밀도, 검색 반경을 입력하세요.
계산식: ρ × π × r²
이 값은 평균 근사입니다. 경계, 비균일 밀도, Scatter Relax, maxpoints 상한 때문에 특정 점의 실제 반환 수는 달라질 수 있습니다. 자기 점이 검색 목록에 없으면 체크를 끄세요.
계산 결과는 자기 자신을 제외한 평균 이웃 수를 기준으로 해석하세요. 같은 입력 점의 위치에서 검색하고 자기 자신이 반환되는 경우에는 함수의 반환 개수가 예상 이웃 수보다 하나 많을 수 있습니다. 또한 최대 개수 상한이 작으면 계산된 기대 개수보다 실제 반환 개수가 줄어듭니다.
계산기는 균일 밀도와 경계 영향이 작은 지역을 가정합니다. 실제 Attribute Wrangle에서 반환된 점 수가 다르다면 우선 반경, 최대 개수, 검색 위치를 확인하세요.
반경과 maxpoints는 서로 다른 제한입니다
반경과 최대 개수를 같은 개념으로 생각하면 검색 결과를 해석하기 어렵습니다.
| 설정 | 역할 | 결과에 미치는 영향 |
|---|---|---|
| radius / maxdist | 검색할 거리 범위 | 반경 밖의 점을 제외합니다. |
| maxpoints / maxpts | 반환 개수 상한 | 반경 안의 포인트 중 최대 지정 개수까지 반환합니다. |
| 실제 반환 개수 | 조건을 만족한 점의 수 | 반경과 개수 상한을 모두 적용한 결과입니다. |
예를 들어 검색 반경 안에 점이 40개 있어도 최대 개수를 20으로 지정하면 반환은 최대 20개입니다. 반대로 반경 안에 점이 7개뿐이라면 최대 개수를 100으로 높여도 100개를 반환하지 않습니다.
maxpoints는 목표 개수가 아니라 잘라낼 상한입니다. 원하는 이웃 수를 기준으로 반경을 계산한 다음, 최대 개수는 그 결과를 자르지 않을 만큼 여유 있게 설정하세요. 필요한 여유는 실제 점 분포에 따라 달라지므로 모든 장면에 적용할 고정 숫자는 없습니다.
반경을 키웠는데 결과 수가 최대 개수에서 멈춘다면 상한에 걸렸는지 확인하세요. 반면 반환 개수가 상한보다 적다면 반경 안에 있는 점 자체가 적을 수 있습니다.
2D·3D 구분과 자기 자신 포함을 확인하세요
SideFX Houdini 19.5의 Scatter 문서에서 By Density는 표면에 대해 단위 면적당 기대 점 수를, 볼륨에 대해 단위 부피당 기대 점 수를 사용합니다. Force Total Count를 켜면 지정한 전체 점 수를 정확히 생성합니다.
평면이나 곡면에 Scatter한 점은 3차원 좌표를 가지더라도 3D 부피 전체에 분포하는 점이 아닙니다. 곡면 Scatter에는 표면 밀도에 기반한 2D 근사를 사용합니다. 곡률과 검색 반경의 관계에 따라 실제 검색 개수는 달라질 수 있습니다.
Scatter의 전체 점 수와 면적을 계산하는 과정이 필요하다면 후디니 Scatter 포인트 수와 밀도: 면적당 개수 계산을 참고하세요. 이웃 검색에서는 전체 점 수를 면적 또는 부피로 나눈 밀도를 출발점으로 사용합니다.
또 하나 중요한 점은 자기 자신입니다. Point Wrangle에서 현재 점의 @P를 기준으로 같은 입력 지오메트리를 검색하면 검색 위치와 자기 점 위치가 일치합니다.
Houdini 19.5.435의 아래 실측에서는 nearpoints, pcfind, pcopen 모두 자기 점이 검색 결과에 포함됐습니다. 다만 이 자기 포함 여부는 해당 실측으로 확인한 결과이며, 여기서 참조한 공식 함수 문서에 자기 포함 규칙이 명시된 것은 아닙니다.
따라서 자기 점이 포함되는 조건이라면 다른 이웃 16개를 목표로 할 때 반환 상한에는 자기 점 한 자리를 고려해야 합니다. 계산기에서 얻은 다른 이웃 기대 개수와 함수가 반환하는 전체 개수를 구분하세요.
nearpoints·pcfind·pcopen의 인자와 반환 방식

세 함수 모두 주변 점을 찾는 데 사용할 수 있지만 인자 이름과 결과를 읽는 방식이 다릅니다. 특히 배열의 정렬 순서를 전제로 코드를 작성한다면 문서 보장 범위를 확인해야 합니다.
| 함수 | 거리·개수 인자 | 반환 형태 | 거리순 정렬 |
|---|---|---|---|
nearpoints | maxdist, 선택적 maxpts | 포인트 번호 배열 | 19.5 공식 문서에 순서 명시 없음 |
pcfind | radius, 필수 maxpoints, Pchannel | 포인트 번호 배열 | 가장 가까운 점이 0번, 이후 거리 증가순 |
pcopen | radius, maxpoints, Pchannel | 포인트 클라우드 handle | pciterate로 순회하면 가까운 순서 |
nearpoints: 포인트 번호 배열을 얻을 때
nearpoints는 지정 위치에서 maxdist 안에 있는 포인트 번호를 배열로 반환합니다. 개수를 제한하려면 선택적 인자 maxpts를 지정합니다.
다음 코드는 첫 번째 입력 지오메트리의 현재 점 위치를 기준으로 검색하고, 자기 포인트 번호를 제거하는 Point Wrangle 예시입니다.
int want_other = 16;
float radius = 0.5;
int found[] = nearpoints(0, @P, radius, want_other + 1);
int others[];
foreach (int id; found)
{
if (id != @ptnum)
{
append(others, id);
}
}
i@other_count = len(others);
want_other + 1이 중요한 부분입니다. 다른 이웃 16개가 목표여도 자기 점이 포함된다면 검색 결과 배열에 한 자리가 사용됩니다. 따라서 maxpts를 17로 지정하고 자기 번호를 제외합니다.
이 코드는 자기 점이 검색 결과에 포함되는 동일 입력 점 검색을 전제로 합니다. 반경 안에 다른 점이 충분하지 않다면 결과는 16개보다 적습니다. 또한 nearpoints의 반환 순서를 공식적으로 보장된 거리순으로 가정하지는 마세요.
pcfind: 가까운 점부터 정렬된 배열이 필요할 때
pcfind는 검색 위치를 지정하는 P, 위치 속성을 가리키는 Pchannel, 반경 radius, 필수 최대 개수 maxpoints를 사용합니다.
float radius = 0.5;
int maxpoints = 17;
int found[] = pcfind(0, "P", @P, radius, maxpoints);
i@found_count = len(found);
SideFX 19.5 문서는 pcfind의 반환 배열에서 가장 가까운 점이 0번이고 나머지가 거리 증가순으로 정렬된다고 명시합니다. 따라서 배열의 순서가 필요한 작업에서는 이 문서상 동작을 기준으로 판단할 수 있습니다.
pcopen: handle을 통해 점을 순회할 때
pcopen은 포인트 번호 배열을 직접 반환하지 않고 handle을 반환합니다. 해당 handle로 pciterate를 실행하면 가까운 점부터 순회합니다. 반환된 점 수를 확인하려면 pcnumfound를 사용할 수 있습니다.
float radius = 0.5;
int maxpoints = 17;
int handle = pcopen(0, "P", @P, radius, maxpoints);
i@found_count = pcnumfound(handle);
pcclose(handle);
단순히 반환된 포인트 번호 목록이 필요한 상황과 handle을 이용해 포인트 클라우드 데이터를 순회하는 상황을 구분하세요. 이 선택만으로 어느 함수가 모든 장면에서 빠르다고 판단할 수는 없습니다.
8,000점 평면에서 반경별 반환 개수를 측정했습니다
앞의 기대 개수 공식이 실제 함수 반환 수와 얼마나 가까운지 확인한 실측 자료입니다. 테스트는 Houdini 19.5.435 hython Commercial, Windows 10 Pro 25H2, build 26200 환경에서 실행됐습니다.
20 × 20 scene units의 Grid를 만들고 Scatter의 Force Total Count로 8,000개 점을 생성했습니다. 면적은 400이므로 실제 전체 평균 밀도는 20 points/unit²입니다. Seed는 203이며 Relax는 껐습니다.
경계 영향을 줄이기 위해 Grid 경계에서 1.1 scene units 이상 떨어진 7,150개 쿼리 점을 대상으로 평균을 측정했습니다. 세 함수의 평균 반환 개수는 일치했습니다.
아래 표에서 이론상 다른 이웃 수는 2D 면적 공식으로 계산했습니다. 실측 반환 수는 자기 점을 포함한 값이므로, 실측 다른 이웃 수는 반환 평균에서 1을 뺀 값입니다.
| 반경 | 이론 다른 이웃 | 이론 자기 포함 | 실측 반환 평균 | 실측 다른 이웃 |
|---|---|---|---|---|
| 0.25 | 3.93 | 4.93 | 4.87 | 3.87 |
| 0.50 | 15.71 | 16.71 | 16.66 | 15.66 |
| 1.00 | 62.83 | 63.83 | 62.73 | 61.73 |
반경 0.5에서 다른 이웃의 이론 기대값은 15.71개이고 실측은 15.66개였습니다. 자기 점을 포함한 전체 반환 평균은 16.66개였습니다.
반경 1.0에서는 이론상 다른 이웃이 62.83개, 실측 다른 이웃은 61.73개였습니다. 평균 근사는 실제 반환 개수를 이해하는 기준이지만 정확히 일치하는 공식은 아닙니다.
이 차이는 Seed 203으로 생성한 한 평면 구성에서 관측된 결과입니다. 다른 Scatter 분포나 시드에서 동일한 수치가 나온다는 의미는 아닙니다.
자기 포함과 반환 순서도 확인했습니다
같은 7,150개 쿼리에서 자기 점 포함률은 세 함수 모두 100%로 측정됐습니다. nearpoints와 pcfind는 반환된 포인트 번호로 자기 포함을 확인했고, pcopen은 반환된 위치 P가 쿼리 점의 위치와 일치하는지 확인했습니다.
세 함수 모두 해당 테스트에서 가까운 거리순 검사를 통과했습니다. 그러나 nearpoints의 거리순 반환은 이 19.5.435 실측 결과입니다. SideFX 19.5 공식 문서가 순서를 명시한 것은 아니므로, 이를 모든 버전에서 보장되는 규칙으로 확대해서는 안 됩니다.
maxpoints를 높이면 Cook 시간은 얼마나 달라질까요?
최대 개수는 단순한 숫자 제한이지만, 더 많은 점을 반환할 수 있는 설정이 Cook 시간에 어떤 영향을 주는지는 실제 장면에서 확인해야 합니다.
같은 8,000점 Grid에서 반경을 1.5로 설정하고, 경계에서 1.5 scene units 이상 떨어진 6,844개 점을 쿼리했습니다. 최대 개수는 64와 8001을 비교했습니다.
함수별로 첫 번째 warm-up 실행을 제외한 뒤 3회 강제 Cook을 측정했고, 아래 시간은 그 중앙값입니다. 측정 대상은 nearpoints, pcfind, pcopen + pcnumfound입니다.
| 측정 대상 | 상한 64 | 상한 8001 |
|---|---|---|
nearpoints | 38.67 ms | 48.45 ms |
pcfind | 34.50 ms | 54.62 ms |
pcopen + pcnumfound | 71.35 ms | 125.61 ms |
이 테스트에서 상한을 64로 설정했을 때 평균 반환 개수는 63.998개였습니다. 상한을 8001로 높였을 때는 평균 138.442개가 반환됐습니다.
세 측정 대상 모두 이 환경에서는 상한 8001일 때 Cook 시간이 더 길었습니다. 다만 반환 개수도 달라졌으므로 동일한 작업량을 처리한 시간 비교는 아닙니다.
이 수치는 해당 PC의 한 테스트 구성에서 측정된 결과입니다. 함수별 절대 속도 순위나 보편적인 최대 개수 권장값으로 해석해서는 안 됩니다. 높은 상한이 Cook 시간에 미치는 영향은 점의 분포, 검색 반경, 쿼리 개수와 실제 반환 개수에 따라 달라질 수 있습니다.
실측을 재현하는 스크립트는 D:\Aside\VFX\.work\evidence\V128-neighbor-test.py에 있습니다. 이 스크립트에는 테스트 시드와 좌표, 3회 측정 절차가 포함돼 있습니다.
경계와 비균일 밀도에서는 계산값이 달라집니다
반경 공식이 잘 맞으려면 검색 영역 안에 점이 대체로 균일하게 분포하고, 경계의 영향이 작아야 합니다. 실제 장면에서는 이 조건이 항상 성립하지 않습니다.
표면의 가장자리에서 검색하면 반경 안의 원 일부가 지오메트리 밖으로 벗어납니다. 평면 내부에서 계산한 평균 개수를 그대로 기대하기 어렵습니다.
점이 한쪽으로 몰려 있거나 영역마다 밀도가 다르다면 전체 평균 밀도만으로 특정 위치의 반환 수를 예측하기 어렵습니다. 곡면에서도 표면 분포와 실제 3차원 거리 검색의 관계를 고려해야 합니다.
또한 계산된 기대 이웃 수가 충분하더라도 최대 개수 상한에 걸리면 반환 배열은 잘립니다. 반대로 상한이 넉넉해도 해당 위치의 반경 안에 점이 적다면 기대값에 못 미칠 수 있습니다.
실제 작업에서는 다음 순서로 확인하세요.
- 점이 표면에 분포하는지, 부피에 분포하는지 확인하세요.
- 전체 점 수와 면적 또는 부피에서 평균 밀도를 계산하세요.
- 원하는 다른 이웃 수를 기준으로 초기 반경을 계산하세요.
- 자기 점이 포함되는 검색인지 확인하고 최대 개수 상한을 설정하세요.
- 실제 반환 개수를 측정해 경계와 밀도 차이를 확인하세요.
- 검색 수가 충분하다면 상한을 불필요하게 크게 두지 않고 해당 장면의 Cook 시간을 비교하세요.
마무리: 이웃 수는 반경으로 추정하고 최대 개수로 제한합니다
nearpoints와 pcfind에서 원하는 점 수를 찾으려면 먼저 밀도와 검색 반경의 관계를 확인해야 합니다. 표면은 원의 면적, 부피는 구의 부피를 이용해 평균 다른 이웃 수를 추정할 수 있습니다.
반경은 후보 점의 범위를 정하고, 최대 개수는 반환 상한을 정합니다. 따라서 원하는 이웃 수가 있다고 해서 maxpoints만 그 숫자로 설정하면 부족할 수 있습니다. 자기 점이 포함되는 경우에는 그 한 자리도 고려해야 합니다.
계산기로 초기 반경을 구한 뒤 실제 반환 개수와 Cook 시간을 확인하세요. 이론값은 출발점이며, 최종 설정은 작업 중인 지오메트리의 분포와 경계 조건에 맞춰 결정해야 합니다.
참고 자료
함수 인자와 반환 방식, Scatter의 밀도 설정은 SideFX Houdini 19.5 공식 문서를 기준으로 확인할 수 있습니다.
vfx 잡학지식

댓글 0
첫 댓글을 남겨보세요.