충돌을 켰는데도 물체를 뚫고 지나간다 — 빠른 움직임에 서브스텝이 필요한 이유
충돌을 켰는데도 뚫린다면 반응 강도가 아니라 검사 사이 이동거리를 봐야 합니다.
한 프레임 전에는 앞에 있었는데 다음 프레임에는 뒤에 있습니다
프레임을 한 장씩 넘겨 보면 작은 파편이나 빠르게 날아간 공이 충돌체 앞에 있습니다. 다음 프레임에는 이미 반대편이에요. 중간 프레임이 없으니 화면상으로는 벽을 순간이동해 통과한 것처럼 보입니다. 검색창에 ‘충돌 뚫고 지나감’이나 ‘빠른 물체 충돌’을 입력하게 되는 장면이 바로 이것입니다.
충돌을 켜지 않은 것도 아닙니다. RBD Bullet Solver의 네 번째 입력에 벽을 연결했고, Collision Geometry도 활성화했습니다. 느리게 굴러오는 조각은 잘 막히는데 빠르게 튀는 조각만 통과합니다. 한 번은 막히고 한 번은 뚫리는 식으로 결과까지 들쭉날쭉할 수 있습니다.
렌더 프레임 수가 같아도 솔버가 프레임 사이를 몇 번 나누어 계산하는지에 따라 충돌 발견 여부가 달라집니다.
충돌 강도를 올려도 없는 접촉은 강해지지 않습니다
가장 먼저 손대기 쉬운 값은 Bounce, Friction, Constraint Iterations입니다. 하지만 셋은 통과 자체를 잡는 첫 번째 손잡이가 아닙니다. Bounce는 접촉 뒤 얼마나 튕기는지, Friction은 닿은 면을 따라 얼마나 미끄러지는지 정합니다. Constraint Iterations는 이미 만들어진 접촉과 제약을 더 정확히 푸는 쪽에 가깝습니다.
문제는 그보다 앞에서 벌어집니다. 솔버가 어느 검사 시점에도 두 충돌 형상이 겹치거나 닿았다고 판단하지 못했다면 처리할 접촉점 자체가 없습니다. 마찰을 0에서 크게 올려도, 바운스를 없애도 빠른 조각은 그대로 벽 뒤에 나타나는 이유입니다. 충돌 반응의 세기를 바꾸었을 뿐 충돌을 발견하는 시간 해상도는 그대로인 거죠.
벽에 두께를 더 주는 시도는 가끔 효과가 있습니다. 그러나 이것도 원인을 가립니다. 물체가 한 계산 구간에 이동하는 거리보다 벽과 물체의 유효 충돌 두께가 커지면 우연히 잡히기 쉬워질 뿐입니다. 벽을 두껍게 만들 수 없는 샷이나 더 빠른 파편이 등장하면 다시 뚫립니다.
솔버는 궤적 전체가 아니라 계산 시점의 형상을 봅니다
일반적인 이산 충돌 검사는 한 시점의 위치에서 충돌 형상을 비교하고, 다음 계산 시점으로 이동한 뒤 다시 비교합니다. 두 검사 사이에 물체가 얇은 벽을 완전히 건너면 양쪽 시점 모두 겹치지 않습니다. 실제 궤적은 벽을 통과했지만 계산 기록에는 접촉이 없는 셈이죠. 이를 흔히 터널링이라고 부릅니다.
서브스텝은 한 프레임의 시간을 더 작은 구간으로 나눕니다. 같은 속도라도 한 구간에 이동하는 거리가 짧아져 접촉을 발견할 기회가 늘어납니다. 그래서 후디니 서브스텝은 렌더 프레임을 늘리는 기능이 아닙니다. 출력은 여전히 같은 프레임에 나오지만 그 프레임에 도달하기 전 계산 횟수가 늘어납니다.
여기서 충돌 두께와 연속 충돌 감지를 분리해야 합니다. 충돌 두께나 패딩은 검사 대상 형상의 경계를 넓혀 놓습니다. 서브스텝은 검사 시점 사이의 간격을 줄입니다. 연속 충돌 감지는 시작 위치와 끝 위치 사이의 이동 경로를 쓸어 보며 충돌 시점을 찾는 방식입니다. 셋 다 터널링을 줄일 수 있지만 같은 기능은 아닙니다.
값의 목적부터 구분해야 합니다. 패딩을 서브스텝처럼, 반복 횟수를 연속 충돌처럼 취급하면 수정 방향이 어긋납니다.
다른 엔진의 튜토리얼에서 CCD라는 이름을 봤다고 해서 Houdini RBD Bullet Solver SOP에서 같은 이름의 스위치부터 찾을 필요는 없습니다. 이 노드에서 빠른 물체 충돌을 직접 점검할 때 먼저 볼 값은 General의 Simulation 영역에 있는 Bullet Substeps입니다. Vellum을 쓰는 장면이라면 Vellum Solver의 Solver 영역에 있는 Substeps가 대응하는 시간 분할 값입니다.
이 현상은 카메라 솔브가 프레임마다 맞는데 중간 움직임 때문에 CG가 미끄러져 보이는 경우와 친척입니다. 둘 다 끝 프레임의 숫자만 보고 프레임 사이에서 벌어진 일을 놓칩니다. 숫자만으로 판단하기 어려운 카메라 솔브에서 이어집니다.
30초 안에는 속도를 낮추지 말고 검사 횟수를 바꿔 봅니다
RBD Bullet Solver에서 문제가 재현되는 짧은 구간을 잡습니다. Reset Simulation으로 캐시를 비운 뒤 Bullet Substeps가 1이라면 진단용으로 4로 올려 같은 구간만 다시 재생합니다. 1에서는 벽 뒤로 넘어가던 조각이 4에서 접촉하거나 튕긴다면 시간 해상도가 원인일 가능성이 큽니다. 최종값이 반드시 4라는 뜻은 아닙니다. 원인 분리를 위한 스위치예요.
변화가 없다면 무작정 8, 16으로 올리지 않습니다. Visualization의 Visualize Geometry를 켜서 Bullet이 실제로 쓰는 형상을 봅니다. 렌더 메시와 전혀 다른 상자, 구, 볼록 껍질이 보이거나 벽에 구멍이 필요한데 Convex Hull이 입구를 막고 있다면 시간 문제가 아니라 충돌 표현 문제입니다. 네 번째 입력의 충돌체는 Show Collision Shape도 함께 확인합니다.
서브스텝 변화에 반응하는지를 먼저 보고, 반응하지 않을 때 충돌 형상과 입력 설정으로 넘어갑니다.
고칠 때는 형상을 먼저 맞추고 시간을 잘게 나눕니다
첫째, RBD Bullet Solver의 Visualization에서 충돌 형상을 표시합니다. 렌더 지오메트리가 아니라 솔버가 보는 프록시가 벽과 조각의 크기, 빈 공간, 오목한 부분을 제대로 대표하는지 확인합니다. 프록시가 지나치게 얇거나 깨져 있다면 메시를 고치거나 단순하지만 닫힌 충돌용 형상을 따로 만듭니다.
둘째, 네 번째 입력의 Collision Geometry에서 Collision Type을 움직임에 맞춥니다. 움직이지 않는 벽은 Static, 오브젝트 단위로 키프레임 이동하는 충돌체는 Animated, 점 위치가 변형되는 메시라면 Deforming입니다. 움직이는 문을 Static으로 둔 채 서브스텝만 올리면 잘못된 충돌체 상태를 더 자주 계산하는 것에 불과합니다.
셋째, Collision Shape을 확인합니다. Convex Hull은 빠르고 안정적인 기본 선택이지만 오목한 홈과 터널 내부를 그대로 보존하지 않습니다. 속이 빈 관이나 오목한 고정 충돌체처럼 꼭 필요한 경우에만 Concave를 검토하고, 움직이는 복잡한 물체는 여러 개의 단순한 볼록 조각으로 나누는 편이 결과를 판단하기 쉽습니다.
넷째, General → Simulation의 Bullet Substeps를 한 단계씩 올려 문제 구간을 다시 계산합니다. 관통이 사라지는 가장 낮은 값을 찾습니다. Global Substeps는 서브스텝 지오메트리를 내보내거나 내부에 추가한 솔버까지 함께 세분해야 할 때 쓰는 값입니다. Bullet 충돌만 더 촘촘히 풀 목적이라면 Global Substeps를 1로 두고 Bullet Substeps를 조정하는 편이 효율적입니다.
다섯째, 여전히 얇은 조각끼리 접촉을 놓친다면 Properties → Pieces의 Collision Padding을 장면 스케일에 맞게 조금씩 조정합니다. 패딩은 충돌 형상을 키우므로 물체가 공중에 떠 보이거나 실제보다 일찍 부딪힐 수 있습니다. Shrink Collision Geometry를 함께 확인하고, 관통이 없어졌다는 이유만으로 큰 패딩을 그대로 확정하지 마세요.
Vellum에서는 두께가 별도 의미를 가집니다. Vellum Solver의 Visualize 탭에서 두께를 표시해 점 주위의 충돌 반경을 확인합니다. 충돌 지오메트리에 직접 만든 pscale 포인트 속성이 있으면 그 값이 두께를 덮어쓸 수 있습니다. 이 경우 Substeps를 올리기 전에 지나치게 작은 pscale이 들어왔는지 확인해야 합니다.
Blender의 강체 시뮬레이션에서도 같은 진단 순서를 적용할 수 있습니다. Scene Properties → Rigid Body World → Settings의 Substeps Per Frame은 프레임당 계산 구간을 늘립니다. 반면 개별 강체의 Collision Margin은 충돌 형상의 여유 거리입니다. 이름은 달라도 시간 간격과 형상 여유를 구분하는 기준은 같습니다.
애니메이션에서 키를 더 찍었는데 움직임이 끊기는 문제도 같은 착각에서 출발합니다. 보이는 프레임에 정보를 더하는 것과 프레임 사이의 시간 구조를 고치는 것은 다릅니다. 키 개수보다 먼저 볼 타이밍과 간격에서 이어집니다.
서브스텝을 올려도 그대로라면 원인은 다른 곳에 있습니다
느린 물체까지 같은 위치에서 통과한다면 터널링보다 충돌 설정을 먼저 의심합니다. Collision Geometry가 꺼져 있거나 입력이 잘못 연결됐거나, 충돌 형상이 렌더 메시와 다르거나, 충돌 제외 관계가 설정된 경우입니다. 특히 문이나 캐릭터처럼 움직이는 충돌체의 Collision Type이 실제 움직임과 맞는지 확인해야 합니다.
물체가 벽을 완전히 통과하지는 않지만 깊게 박혔다가 튀거나 쌓인 조각이 떨린다면 이야기가 달라집니다. 이때는 접촉은 발견됐고 해결 과정이 부족한 상태일 수 있습니다. 장면 스케일, 초기 겹침, Collision Padding, Constraint Iterations를 살펴야 합니다. ‘접촉을 못 찾음’과 ‘찾은 접촉을 제대로 못 풂’을 같은 관통으로 묶으면 값만 계속 커집니다.
한 줄로 정리하면 검사 사이 이동거리를 줄여야 합니다
빠른 물체가 충돌체를 건너뛴다면 반응 강도보다 충돌 형상을 먼저 확인하고, 한 서브스텝에 이동하는 거리가 충분히 짧아질 때까지 Bullet Substeps를 올립니다.
vfx 잡학지식



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