보이는 것과 부딪히는 것은 별도다
화면의 메시가 있다는 사실은 물체가 중력에 반응하거나 다른 물체와 부딪힌다는 뜻이 아니다. 동적 RigidBody는 질량·관성·힘에 따른 운동 상태를 갖는 강체다. Collider는 충돌 검사에서 쓰는 형상과 관련 설정이다. 표시 메시, 강체, 충돌 형상을 나누어 보면 ‘바닥을 뚫고 떨어짐’이 서로 다른 원인에서 나올 수 있음을 이해할 수 있다. 강체만 있고 collider가 없으면 중력으로 움직여도 접촉할 형상이 없다.
정적 환경은 동적 강체 없이 충돌 형상을 둘 수 있다. 바닥은 충돌하되 중력에 떨어지는 물체가 아닐 수 있다. kinematic 물체는 애플리케이션이 정한 운동을 따르는 방식으로 쓰며 접촉의 영향을 받아 자유 동역학처럼 밀려나는 물체와 다르다. 구체적인 이동 API와 속도 전달 방식도 확인해야 한다. 위치를 매 프레임 강제 설정하는 것과 힘/토크로 움직이는 것을 같은 실험으로 읽지 않는다.
충돌 형상이 있어도 pair 필터가 접촉을 제외하거나 해당 형상의 simulation 참여가 꺼졌을 수 있다. 또 raycast 같은 장면 질의의 참여와 물리 접촉 참여는 구분될 수 있다. 광선이 검출했다는 사실만으로 그 물체가 물리적으로 받쳐 준다고 단정하지 않는다. 공식 PhysX 충돌 설명은 simulation shape와 scene query shape를 구분한다. 여기서는 API 실행 없이 이 역할을 가상 구성표로 검사한다.
얇은 벽은 두 표본 사이에서 사라질 수 있다
이산 충돌 검출은 스텝의 표본 위치에서 형상을 비교한다. 일정 속도 크기 v(m/s), 스텝 간격 Δt(s)라면 이동거리는 d=vΔt(m)다. v=2 m/s, Δt=0.01 s이면 d=0.02 m, 즉 20 mm다. 이동 방향을 x축으로 두고 중심이 −0.01에서 +0.01 m로 이동하는 반지름 0.001 m 구와 벽 x∈[−0.001,0.001] m를 생각하자. 양 끝 표본에서 구는 벽과 겹치지 않지만 중간 경로는 벽을 지나간다. 두 끝만 검사하면 이 접촉을 놓칠 수 있다.
그림 M10.03-1. 개념도에서 두 표본 위치는 벽과 겹치지 않지만 이동 구간은 벽을 지난다. CCD/스텝 설정의 필요성을 보여 주며 특정 엔진의 CCD 보장을 뜻하지 않는다. 직접 제작.
스텝을 줄이면 이동거리가 줄어들지만 모든 형상/운동에서 관통을 막는 충분조건이 되는 것은 아니다. 실제 검출의 여유와 회전·상대 운동·필터·형상 조건도 있다. ‘d가 두께보다 크면 반드시 실패’, ‘작으면 무조건 통과’라는 법칙으로 바꾸지 않는다. 위 예는 실패 가능성을 직접 보이는 한 가지 경로다.
CCD는 Continuous Collision Detection의 약자로 표본 사이의 운동도 고려해 충돌 누락을 줄이는 방법이다. PhysX의 sweep 방식과 speculative 방식은 방법과 한계가 다르다. Isaac Sim 6.2의 sweep CCD 예제는 scene과 body 양쪽의 활성화를 요구한다. 설정 하나만 켰다는 기록으로 적용됐다고 단정하지 않는다. 빠른 회전이나 지원 형상·경로의 조건도 확인하고 계산 비용/새 접촉 오류와 함께 비교한다. CCD를 켠 뒤에도 collider 누락·필터 제외·잘못된 scale은 별개 결함이다.
접촉 생성 시점과 쉬는 간격을 구별한다
PhysX의 contactOffset은 두 형상이 가까워질 때 접촉 후보/제약 생성을 준비하는 거리와 관련되고 restOffset은 쉬는 상태의 상대 간격과 관련된다. 두 형상의 효과는 쌍으로 읽는다. 이 설명은 PhysX 경로의 속성 의미이며 다른 백엔드에 같은 숫자를 그대로 이식하는 규칙이 아니다. 각 contactOffset은 음수가 아니고 해당 restOffset보다 커야 한다.
가상 형상 A/B의 contactOffset을 각각 0.002/0.003 m라면 합은 0.005 m다. 형상 간 분리 거리가 그 합보다 작아지면 침투 전에도 접촉 생성이 시작될 수 있다. 이것이 5 mm에서 즉시 강한 반발력이 튀어나온다는 뜻은 아니다. 두 restOffset이 0이면 그 합은 0이므로 쉬는 간격의 의도도 contact 합과 다르다. 공식 PhysX 접촉 거리 설명을 이 구분의 근거로 삼는다.
접촉 거리를 너무 크게 하면 불필요한 접촉과 계산 비용/형상 해석 문제가 늘 수 있고, 너무 작게 하면 주어진 스텝에서 접촉을 늦게 다루는 문제가 생길 수 있다. 값 하나를 늘려 모든 떨림을 해결하려 하지 않는다. collider의 두께/scale·초기 겹침·상대 속도·질량비·drive 이득·스텝/solver 설정을 함께 기록한다. 원인을 바꿔 가며 같은 초기 조건에서 비교할 때도 한 번에 바꾸는 항목을 제한한다.
정마찰은 항상 최대값으로 작용하지 않는다
단순 Coulomb 마찰 모형에서 접촉 법선력 크기를 N_f(N), 접선 마찰력 크기를 F_t(N), 정/동마찰계수를 μ_s/μ_d로 쓰자. 계수는 무차원이다. 정지 상태의 마찰은 필요한 범위에서 최대 μ_s N_f까지 제공될 수 있고, 미끄러짐에서는 단순화한 크기 μ_d N_f를 쓴다.
가상 수평면에서 질량 m=1 kg, 중력가속도 g=10 m/s², 수직 가속도와 다른 수직 힘이 없다고 가정하면 N_f=mg=10 N이다. μ_s=0.4, μ_d=0.3이면 정마찰 최대는 4 N이다. 수평으로 3 N을 밀 때 필요한 마찰은 3 N이며 4 N을 항상 거는 것이 아니다. 5 N을 밀어 미끄러진다면 단순 동마찰은 3 N, 순수 수평 힘은 2 N, 가속도는 2 m/s²다. 힘 방향은 운동을 방해하는 쪽이고, 정지에서는 움직이려는 경향을 막는다.
이 계산은 접촉이 유지되는 단일 평면의 단순 모형이다. 실제 PhysX 접촉 solver의 모든 마찰 patch/충격량 계산을 재현한 것은 아니다. 두 재질의 계수와 combine mode, 접촉 위치/법선·형상·drive 상태가 결과에 영향을 준다. 물체가 떨어지는 원인이 collider 누락인데 마찰을 올리거나, 충돌이 없는 상황에서 μ만 추정하면 원인을 잘못 고른 것이다. 기존 2.5 CCD와 2.6 접촉의 자세한 적용에서도 표시→구성→시간/검출→접촉 힘의 순서로 근거를 좁힌다.