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

후디니 RBD 조각이 떨릴 때: Substeps·Collision Padding

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

RBD 떨림이 보이면 Substeps부터 올리기 쉽습니다. 하지만 조각이 바닥을 뚫고 지나가는지, 제자리에서 잔진동하는지, 충돌 때마다 튀어 오르는지에 따라 먼저 볼 값이 다릅니다. Bullet Substeps와 Collision Padding은 서로 다른 문제를 다룹니다.

작은 조각일수록 기본 Collision Padding이 조각 크기에 비해 커질 수 있습니다. 반대로 Substeps가 낮으면 빠르게 움직이는 조각의 충돌을 놓칠 수 있습니다. 그렇다면 내 장면에서는 어느 쪽이 원인인지 어떤 순서로 나눠 볼까요?

RBD 조각 진단 도구

증상을 고르면 먼저 확인할 설정과 이유를 순서대로 보여줍니다.


Substeps·Padding 실측 그래프

실측 씬의 수치입니다. 값을 바꾸면 같은 여섯 조건의 그래프가 바뀝니다.

1. Bullet Substeps와 Constraint Iterations는 다른 설정입니다

RBD Bullet Solver SOP에는 `Global Substeps`와 `Bullet Substeps`가 따로 있습니다. Global Substeps는 시뮬레이션 단계 자체를 나누고, Bullet Substeps는 각 단계 안에서 Bullet이 충돌을 계산하는 횟수를 정합니다. 빠르게 움직이는 물체의 충돌을 놓친다면 Bullet Substeps부터 비교하세요.

두 값을 한꺼번에 올리면 내부 계산량이 겹쳐 늘 수 있습니다. 우선 Global Substeps는 1로 두고 Bullet Substeps만 1, 2, 4처럼 바꿔 결과를 비교하세요. SideFX 문서도 충돌이 감지되지 않는 빠른 물체에 Substeps를 늘리는 것을 한 방법으로 안내합니다.

`Constraint Iterations`는 시간을 잘게 나누는 값이 아닙니다. 한 단계에서 접촉과 constraint를 더 반복해 푸는 설정입니다. 여러 조각이 포개졌거나 연결부가 흔들리는 문제에는 도움이 될 수 있지만, 바닥이 없거나 collision shape가 잘못된 상황을 이 값으로 고치지는 못합니다.

노드 이름도 확인하세요. 이 글의 `Bullet Substeps`는 RBD Bullet Solver SOP의 설정입니다. DOP 네트워크의 별도 `RBD Solver`는 `Minimum Substeps`, `Maximum Substeps`, `CFL Condition`으로 자동 분할을 다룹니다. 두 솔버의 Substeps 숫자를 같은 메뉴 값으로 옮기지 마세요.

후디니 RBD Bullet Solver의 Global Substeps, Bullet Substeps, Constraint Iterations 기본값
Houdini 22.0.466 Apprentice에서 RBD Bullet Solver SOP를 만든 직후의 Setup 탭입니다. 기본값은 Global Substeps 1, Bullet Substeps 10, Constraint Iterations 10입니다.

2. Collision Padding은 조각 크기와 함께 보세요

Bullet은 충돌 판정을 빠르게 하기 위해 실제 지오메트리와 별도로 충돌 형상을 씁니다. `Collision Padding`은 이 형상 사이의 여유를 더해 충돌 감지의 신뢰성과 성능을 돕습니다. 하지만 padding은 충돌 형상을 키울 수 있으므로 씬 단위와 작은 조각의 크기에 맞춰야 합니다.

예를 들어 한 변이 0.12인 조각에 Padding 0.02는 조각 크기의 약 6분의 1입니다. 같은 0.02라도 한 변이 2인 물체와 한 변이 0.12인 조각에서는 차지하는 비율이 다릅니다. 튜토리얼과 내 장면에 같은 값을 넣었는데 결과가 다르다면, 씬 스케일과 단위가 시뮬레이션에 미치는 차이도 확인하세요.

`Shrink Collision Geometry`가 켜져 있으면 `Shrink Amount`만큼 충돌 형상을 안쪽으로 줄여 padding이 물체의 유효 크기를 키우지 않도록 합니다. SideFX 문서는 기본 Shrink Amount가 padding과 같아 최종 충돌 크기를 원래 지오메트리와 같게 맞추는 설정이라고 설명합니다. Padding을 바꿀 때 Shrink 설정을 함께 확인하세요.

RBD Bullet Solver SOP의 `Display Visualization Geometry` 또는 guide 표시를 켜면 Bullet이 실제로 쓰는 모양과 padding을 볼 수 있습니다. 충돌 형상이 원래 조각을 너무 크게 감싸는지, 얇은 부분이 사라졌는지 확인한 뒤 한 값씩 바꿔 보세요. 진단이 끝나면 guide 표시를 꺼서 불필요한 뷰포트 비용을 줄입니다.

3. Ground Plane과 Collision Shape를 확인하세요

Houdini 19.5.435의 RBD Bullet Solver SOP에서 `Ground Type` 기본값은 `None`입니다. 즉 바닥처럼 보이는 그리드가 있어도 그 설정이 Bullet 충돌로 들어가지 않으면 조각은 바닥을 통과합니다. `Ground Type`을 `Ground Plane`으로 설정하거나, 사용자 바닥 지오메트리를 collision 입력에 연결했는지 확인하세요.

`Collision Shape`도 실제 조각과 맞아야 합니다. `Convex Hull`은 기본 형상이며 지오메트리의 점을 감싸는 볼록 껍질을 만듭니다. `Box`와 `Sphere`는 각각 경계 상자와 경계 구로 근사합니다. 상자 조각에 구체를 쓰면 모서리 접촉도 구체처럼 바뀝니다.

속도를 위해 `Concave`를 쓰기 전에 꼭 필요한지 확인하세요. SideFX는 도넛이나 빈 관처럼 오목한 형상에 Concave가 유용하지만, Convex Hull이 보통 더 빠르므로 필요할 때만 사용하라고 권합니다. 간단한 모양은 Box나 Sphere를 시험할 수 있지만, 결과가 원래 형상과 맞는지는 collision guide로 확인해야 합니다.

4. 튀어 오름과 Sleeping은 따로 점검하세요

조각이 충돌할 때마다 튀어 오르면 `Bounce`를 확인하세요. 조각의 Bounce와 Ground Plane의 Bounce가 따로 있습니다. 한쪽 값만 바꿔도 기대한 결과가 안 나올 수 있습니다. 빠른 충돌을 놓친 결과인지, 설정한 반발력인지 구분한 뒤 Bullet Substeps를 시험하세요.

`Sleeping`은 충분히 움직이지 않는 조각의 시뮬레이션을 잠시 비활성화해 정지한 물체가 많은 장면의 계산을 줄이는 기능입니다. `Linear Threshold`, `Angular Threshold`, `Sleeping Time`으로 잠들 조건을 정합니다. 잠자기는 떨림 원인을 고치는 값이 아니라, 정지한 조각의 계산을 줄이는 기능입니다.

잔진동을 진단할 때는 Sleeping을 잠시 꺼서 실제 움직임을 비교하거나, guide 색으로 조각이 잠들었는지 확인하세요. Threshold를 너무 높이면 움직이는 조각도 일찍 멈출 수 있으니, 안정된 최종 시뮬레이션에서는 샷에 맞는 값으로 다시 조정합니다.

먼저 볼 값은 증상마다 다릅니다

이제 처음 질문에 답할 수 있습니다. Substeps를 무조건 올리지 말고, 바닥과 충돌 형상을 확인한 다음 빠른 충돌에는 Bullet Substeps, 쌓임과 constraint 문제에는 Constraint Iterations를 비교하세요. Padding은 조각 크기와 Shrink Collision Geometry를 함께 보면서 조정합니다.

Houdini 19.5.435에서 확인한 RBD Bullet Solver 기본값은 Global Substeps 1, Bullet Substeps 10, Constraint Iterations 10, Collision Padding 0.02, Collision Shape Convex Hull, Ground Type None입니다. 이 값은 해당 설치본에서 읽은 값입니다. Houdini 22.0 문서에도 핵심 이름과 설명은 이어지지만, 최신 문서에는 `Enable Guides`, `Checkpoints` 같은 추가 항목이 있으므로 버전별 파라미터와 기본값을 확인하세요.

RBD 떨림 실측: Houdini 19.5.435의 Substeps·Padding 조합

한 변 0.12 Houdini-unit인 정육면체 27개를 3×3×3으로 배치하고 Ground Plane에 떨어뜨렸습니다. Python `random.Random(1350)`의 균등 난수로 위치를 고정했습니다. 행·열·층은 각각 0–2이며 중심 좌표는 x=(열−1)×0.12+uniform(−0.01, 0.01), z=(행−1)×0.12+uniform(−0.01, 0.01), y=0.24+층×0.12+uniform(−0.003, 0.003)입니다. 24fps, 1–180프레임에서 Global Substeps 1, Constraint Iterations 10, Bounce 0, Friction 0.8을 고정했고, Sleeping과 Shrink Collision Geometry는 껐습니다.

평균 속도는 27개 조각의 151–180프레임 속도 크기 평균입니다. 위치 흔들림 RMS는 같은 구간에서 조각별 중심의 x·y·z 좌표마다 선형 추세를 뺀 잔차를 모두 모아 계산했습니다. 시뮬 시간은 1–180프레임 순차 cook을 조건마다 3회 실행한 중앙값입니다.

Bullet SubstepsCollision Padding평균 속도 (unit/s)위치 흔들림 RMS (unit)180프레임 시간 중앙값 (초)마지막 평균 Y (unit)
10.0010.4159080.0153110.8180.036840
10.020.3786670.0174840.8320.019390
40.0010.0665690.0064510.9170.115912
40.020.0658140.0025860.8870.035257
80.0010.0077320.0002241.0510.137480
80.020.0078850.0005711.0190.085340
속도·위치 흔들림은 각각 scene unit/s와 scene unit입니다. 시간은 같은 컴퓨터에서 3회 cook한 중앙값이며, 다른 씬·PC의 성능 예측값은 아닙니다.

이 고정 장면에서는 Bullet Substeps를 1에서 4·8로 높일 때 두 Padding 조건 모두 평균 속도와 위치 흔들림 RMS가 낮아졌습니다. 반면 Padding의 영향은 한 방향으로 일정하지 않았습니다. 0.02는 Substeps 4에서 RMS를 낮췄지만 1과 8에서는 높였고, 마지막 평균 Y도 조건별로 달라졌습니다. Shrink Collision Geometry를 끈 실험이라 padding이 충돌 형상과 최종 배치에 함께 영향을 준 결과입니다. 이 표는 Substeps 증가의 효과를 이 장면에서 보여줄 뿐, 특정 Padding 값을 정답으로 권하지 않습니다.

실행 시간도 Substeps에 따라 일정한 비율로 늘지 않았습니다. 작은 씬을 한 번 실행한 값이므로 다른 컴퓨터나 실제 샷의 성능 예측값으로 쓰지 마세요. 자신의 장면에서는 collision guide, 한 프레임의 속도, 바닥 접촉을 확인하며 한 설정씩 비교하는 편이 안전합니다.

한 줄 정리

RBD 조각이 떨리면 Substeps부터 올리지 말고, Ground Plane과 충돌 형상을 확인한 뒤 증상에 맞는 값을 조정하세요.

참고 자료

vfx 잡학지식

함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.