충돌 형상이 보여도 접촉이 계산된 것은 아니다
M25.02에서 관절 연결과 가동 범위를 확인했다. 그런데 손가락이 물체를 통과하거나 물체가 바닥을 뚫는다면 관절만 고쳐서는 해결되지 않을 수 있다. collider는 충돌 계산에 쓰는 형상이고, 필터는 어떤 형상 쌍의 충돌을 계산에서 제외할지 정하는 규칙이다. 접촉(contact)은 실제 시각/위치·형상·설정에서 엔진이 산출하는 정보다. 세 가지를 다른 열로 기록한다.
필터가 허용한 쌍이라도 멀리 떨어져 있으면 접촉하지 않는다. 반대로 시각 메시가 겹쳐 보여도 collider의 근사 형상이 다르거나 필터가 막았다면 같은 결과를 기대할 수 없다. 물리 접촉이 없었다는 주장과 접촉 보고서를 받지 못했다는 주장도 구분해야 한다.
그룹과 개별 제외는 적용 범위가 다르다
Collision Group은 collider 집합을 묶어 집합 사이의 충돌 규칙을 지정한다. OpenUSD CollisionGroup의 colliders collection은 구성원을, filteredGroups는 충돌을 제외할 상대 그룹을 나타낸다. 그룹 이름만 만들고 실제 collider 경로가 포함되지 않으면 의도한 규칙이 적용되지 않을 수 있다.
그림 M25.03-1. 각 칸은 서로 다른 역할/근거다. 아래 방향은 자료/처리의 연결이며 실제 성공을 자동으로 보장하지 않는다. 직접 제작한 개념도이며 본문의 조건과 함께 읽는다.
Filtered Pairs는 특정 객체 사이의 충돌을 제외하는 더 세밀한 방법이다. OpenUSD FilteredPairsAPI는 개별 제외가 그룹 필터보다 우선한다고 설명한다. 그룹이 허용해도 개별 제외가 남으면 해당 쌍을 복구했다고 할 수 없다. 반대로 개별 제외를 삭제하는 것은 적극적인 허용 명령이 아니므로 다른 그룹 차단까지 없애지는 않는다.
실제 장면에는 그룹 반전·다중 소속/합성, articulation의 self-collision, 관절 간 필터와 런타임별 규칙도 있을 수 있다. 이번 계산은 단일 그룹 소속·반전 없음·다른 제외 없음·모든 collider 활성으로 고정한다. raycast 같은 scene query 필터와 동역학 충돌 필터도 같은 것으로 가정하지 않는다. 실제 소비 엔진에서 적용된 규칙을 확인한다.
네 collider의 여섯 쌍을 먼저 펼친다
이번 합성 자산은 Robot={B(base),F(finger)}, Object={O(box)}, Ground={G(floor)}다. 서로 다른 두 collider의 무순서 쌍은 BF·BO·BG·FO·FG·OG의6개다. BF와 FB를 다른 쌍으로 중복 집계하지 않는다.
이 활동에서는 BF만 제외하기로 한 별도 설계 근거를 제공했다고 가정한다. 이는 제한된 가동 범위의 특정 조립 쌍에 대한 교육용 조건이다. 실제 인접 링크 전체나 닿을 수 있는 자기충돌 쌍을 일괄 제외하라는 뜻이 아니다. 실제 제외에는 구조·가동 범위·접촉 필요성의 검토가 필요하다.
| 쌍 | 이번 계약의 충돌 검사 | 근거 |
|---|---|---|
| BF | 제외 | 이 활동에 제공한 특정 조립 쌍의 설계 예외 |
| BO | 허용 | 베이스와 상자 충돌을 무시하지 않음 |
| BG | 허용 | 베이스-바닥 접촉을 보존 |
| FO | 허용 | 손가락-상자 파지 접촉을 보존 |
| FG | 허용 | 손가락-바닥 충돌도 무시하지 않음 |
| OG | 허용 | 상자의 바닥 지지를 보존 |
따라서 필터 후 검사 가능 후보는5쌍이다. 접촉5개가 발생했다는 계산은 아니다. 후보 집합을 얻은 뒤 현재 형상과 상태에서 실제 접촉이 생성되는지를 관찰해야 한다.
넓은 필터 한 줄이 필요한 접촉을 함께 없앨 수 있다
누군가 Robot과 Object 그룹 사이를 통째로 제외하면 BO와 FO가 모두 막힌다. 기존 BF제외까지 합치면 제외3쌍·후보3쌍(BG,FG,OG)이다. 의도했던 FO 파지 접촉도 사라진다. “관통 문제가 있으니 접촉을 더 많이 제외한다”는 수정은 그 문제를 숨길 수 있다.
이때 FO 개별 제외만 삭제해도 Robot-Object 그룹 차단이 남으면 FO는 여전히 차단된다. 반대로 그룹 차단을 제거했지만 FO 개별 제외가 남아 있다면 역시 복구되지 않는다. 필요한 수정은 잘못된 그룹 차단과 의도하지 않은 개별 제외를 각각 확인하고, BF의 근거 있는 예외만 남기는 것이다. 수정 뒤 후보5쌍과 필수 BO/FO/BG/OG를 다시 대조한다.
그룹 규칙을 전부 지우는 것도 충분한 해설이 아니다. 실제 파일에서 대상 경로가 존재하고, collection 합성과 제외 관계가 현재 collider에 해석되는지 대조한다. 왜 특정 예외가 있었는지·현재 가동 범위에서 어떤 접촉이 필요한지를 남겨야 한다. 변경 전후 규칙·collider 경로·원본/override 지문과 관찰을 보존한다.
Physics Debug는 어떤 상태를 보여 주는가?
먼저 렌더 메시와 실제 충돌 근사를 함께 읽는다. 원본 USD 형상과 엔진이 지원하지 못해 바꾼 fallback 형상이 다를 수도 있다. 그다음 collider/강체 활성 상태와 적용 필터·질량·관절을 확인한다. 화면에 선이 그려지는 것만으로 실제 접촉 계산/보고가 완료됐다고 승인하지 않는다.
NVIDIA Physics Debug 안내는 step별 관찰·엔진 상태 시각화와 로그 확인을 설명한다. 설치 버전마다 메뉴/도구가 달라질 수 있으므로 여기서는 특정 클릭 경로를 필수 실습으로 요구하지 않는다. 해당 도구를 실제 사용했다면 엔진/버전·설정·step과 무엇을 관찰했는지 남긴다.
특히 접촉점/형상이 update 시작 상태에서 표시되고 렌더 물체는 update 끝 상태를 나타내면 같은 화면에서도 시각이 다를 수 있다. 합성 예에서 접촉 기록은 physics tick10의 시작80ms, 렌더 pose는 같은 update 끝88ms라고 주어졌다. 두 기록은8ms 차이다. 즉시 “접촉점 위치가 틀렸으니 엔진 결함”이라고 결론 내리지 말고 같은 시각·프레임으로 맞추거나 차이를 표시한다.
접촉0을 설명할 근거를 순서대로 찾는다
아래는 실제 실행이 아닌 진단용 기록이다. 보고 수치0과 보고 미수집을 같은 값으로 채우지 않는다.
| 기록 | 제공 상태 | 무엇을 말할 수 있나 |
|---|---|---|
| T1 | FO 그룹 차단, active collider 확인, 보고 수집됨·접촉0 | 현재 필터에서 제외됨. 파지 접촉을 검증한 것이 아님 |
| T2 | FO 허용, collider 사이 간격0.10m, step/보고 확인·접촉0 | 현재 떨어진 형상에서0은 예상 가능. 접촉 조건의 필터 검증은 추가 필요 |
| T3 | FO 허용, 렌더만 갱신, 물리 step/보고 수집 여부 없음 | 실제 접촉 유무 미확인.0으로 채워 안전/완료를 보고하지 않음 |
| T4 | 필요한 접촉을 유도한 고정조건 시험, 엔진 형상·필터/step 확인, 보고에 FO존재 | 이 합성 시험에서 FO 접촉 근거 있음. 힘/유지·파지 성공·실물 안전은 별도 |
진단은 경로/최종 형상→활성/적용 필터→실제 물리 step·같은 시각→보고 구독/대상/임계값→접촉/힘·과업 결과 순서로 한다. 알려진 허용 접촉의 양성 대조와 의도한 제외 쌍의 음성 대조를 함께 두면 수집기 고장과 필터 오류를 구분하기 쉽다. 실제 시험을 하지 않았다면 이 표의 예측/제공 관찰로 표시한다.
기존 2.4 충돌 형상과 2.12 트러블슈팅을 보충 경로로 쓴다. 필요한 쌍이 계산되는지 확인한 다음 M25.04에서 질량·마찰·강성/감쇠를 보정한다. 필터로 사라진 접촉을 마찰 수치로 복구할 수는 없다.