캐릭터 컨트롤러
물리 디버그 시각화

연속 충돌 검사(CCD)

CCD는 빠르게 움직이는 바디가 오브젝트를 지나치거나 통과하지 않고 충돌하도록 합니다. Unity는 다음의 CCD 메서드를 제공합니다.

스위핑 기반의 CCD를 사용하려면 인스펙터 창에서 RigidBody를 선택하고 Collision DetectionContinuous 또는 Continuous Dynamic 으로 설정합니다. 추측성 CCD의 경우 Collision DetectionContinuous Speculative 로 설정합니다.

스위핑 기반 CCD

스위핑 기반 CCD는 충돌 시점(TOI) 알고리즘을 사용하여 오브젝트의 현재 속도를 이용해 앞쪽 궤도를 스위핑함으로써 해당 오브젝트의 잠재 충돌을 계산합니다. 오브젝트의 이동 방향에 컨택트가 존재하는 경우 알고리즘은 충돌 시간을 계산하여 이 시간까지 오브젝트를 이동시킵니다. 알고리즘은 이 시간부터 TOI 이후의 속도를 계산한 다음 다시 스위핑하는 하위 단계를 수행할 수 있습니다. 단, 이 경우 CPU 사이클이 늘어납니다.

그러나 이 메서드는 리니어 스위핑에 의존하므로 바디의 각도 모션을 무시합니다. 이로 인해 오브젝트가 빠르게 회전하는 경우 터널링 효과가 발생할 수 있습니다. 한 쪽 끝이 고정된 상태로 고정된 포인트 주변을 회전하는 핀볼 기계의 플리퍼를 예로 들 수 있습니다. 플리퍼는 각도 모션만 수행하며 리니어 모션은 수행하지 않으므로, 핀볼과의 충돌이 빗나가기 쉽습니다.

연속 다이나믹 프로퍼티가 활성화된 얇은 막대 게임 오브젝트. 막대는 빠르게 피벗 포인트 주위로 회전하는 과정에서 구체와 접촉하지 않습니다.
연속 다이나믹 프로퍼티가 활성화된 얇은 막대 게임 오브젝트. 막대는 빠르게 피벗 포인트 주위로 회전하는 과정에서 구체와 접촉하지 않습니다.

이 메서드의 또 다른 문제는 성능입니다. 이 CCD로 속도가 빠른 오브젝트를 대량 처리하는 경우, 추가 스위핑 때문에 CCD 오버헤드가 빠른 속도로 증가하며 물리 엔진이 더 많은 CCD 하위 단계를 수행해야 합니다.

추측성 CCD

추측성 CCD는 오브젝트의 리니어 및 각도 모션을 기반으로 오브젝트의 넓은 페이즈 축에 정렬된 최소 경계 상자(AABB)를 늘리는 방식으로 작동합니다. 이 알고리즘이 ’추측성’으로 명명된 이유는 다음 물리 단계에서 접촉 가능한 모든 컨택트를 가져오기 때문입니다. 그런 다음 모든 컨택트 제약이 충족되어 오브젝트가 충돌을 통과하지 않도록 모든 컨택트가 솔버로 피드됩니다.

다음 다이어그램은 t0 에서 이동하는 구체가 경로에 벽이 없다면 t1 포지션에 도달할 수 있는 경우를 나타냅니다. 추측성 알고리즘은 AABB를 타겟 포즈로 팽창시켜 각각 n1n2 노멀을 포함하는 2개의 컨택트를 가져옵니다. 그런 다음 알고리즘은 구체가 벽면을 통과하지 않도록 솔버에 이러한 컨택트를 유지하도록 요청합니다.

현재 속도에 기반하여 팽창된 AABB는 이동 궤도의 가능한 모든 컨택트를 감지할 수 있도록 지원하여 솔버가 터널링을 방지할 수 있게 합니다.

추측성 CCD의 경우 컨택트가 솔빙 및 통합 단계가 아닌 충돌 감지 단계 동안에만 컨택트를 계산하므로 스위핑 기반 메서드보다 더 적은 리소스를 소모합니다. 또한 추측성 CCD는 오브젝트의 리니어 및 각도 모션에 기반하여 넓은 페이즈 AABB를 확대하므로 스위핑 기반 CCD에서 누락될 수 있는 컨택트까지 감지합니다.

추측성 CCD가 활성화된 얇은 막대 게임 오브젝트. 막대는 빠르게 피벗 포인트 주위로 회전하는 과정에서 구체와 접촉하며 충돌이 발생합니다.
추측성 CCD가 활성화된 얇은 막대 게임 오브젝트. 막대는 빠르게 피벗 포인트 주위로 회전하는 과정에서 구체와 접촉하며 충돌이 발생합니다.

그러나 추측성 CCD는 오브젝트의 모션이 부적절하게 추측성 컨택트 포인트의 영향을 받는 고스트 충돌을 초래할 수 있습니다. 이는 추측성 CCD가 근접점 알고리즘에 기반하여 모든 잠재 컨택트를 수집하여 컨택트 노멀의 정확도가 감소하기 때문입니다. 이러한 이유로 속도가 빠른 오브젝트가 테셀레이션된 충돌 부분을 따라 미끄러져 튀어오르는 문제가 발생할 수 있습니다. 예를 들어, 다음 다이어그램에서는 구체가 t0 부터 오른쪽으로 수평 이동하며, 통합 후 예상되는 포지션은 t1 입니다. 팽창된 AABB가 b0b1 상자와 겹치고 CCD는 c0c1 에 2개의 추측성 컨택트를 도출합니다. 추측성 CCD는 근접점 알고리즘을 사용하여 컨택트를 도출하므로 c0 은 솔버로 향하는 램프처럼 보이는 매우 경사진 노멀을 포함합니다.

근접점 알고리즘이 부정확한 컨택트 노멀을 생성하여 솔버가 c0 의 컨택트 포인트가 램프라고 추측
근접점 알고리즘이 부정확한 컨택트 노멀을 생성하여 솔버가 c0 의 컨택트 포인트가 램프라고 추측

이처럼 매우 경사진 노멀로 인해 t1 은 통합 후 직선으로 이동하지 않고 위로 튀어오르게 됩니다.

c0에서 발생한 고스트 충돌로 인해 구체가 직선으로 이동하지 않고 위로 잘못 튀어오름
c0에서 발생한 고스트 충돌로 인해 구체가 직선으로 이동하지 않고 위로 잘못 튀어오름

또한 추측성 CCD는 추측성 컨택트가 충돌 검사 단계 동안만 계산되므로 터널링이 발생할 수 있습니다. 컨택트 솔빙 중 오브젝트가 솔버에서 과도한 에너지를 받으면 통합 후 팽창된 초기 AABB를 벗어날 수 있습니다. AABB 외부에서 충돌이 발생하면 오브젝트가 그냥 통과하게 됩니다.

예를 들어, 다음 다이어그램은 막대가 시계 방향으로 회전하는 동안 구체가 t0 에서 왼쪽으로 움직이는 모습을 나타냅니다. 구체가 충돌에서 과도한 에너지를 받으면 t1 의 팽창된 AABB(빨간색 점선으로 표시된 사각형)를 이탈하게 됩니다. 아래의 파란색 상자에 나타난 것처럼 AABB 외부에서 충돌이 발생하면 구체가 AABB를 그냥 통과할 수 있습니다. 이는 솔버가 팽창된 AABB 내의 컨택트만 계산하며 솔빙 및 통합 단계 중 충돌 검사가 수행되지 않기 때문입니다.

추측성 CCD를 사용하는 팽창된 AABB를 포함하는 구체. 추측성 CCD는 충돌 검사 단계 중에만 컨택트를 계산하므로 터널링이 발생할 수 있음
추측성 CCD를 사용하는 팽창된 AABB를 포함하는 구체. 추측성 CCD는 충돌 검사 단계 중에만 컨택트를 계산하므로 터널링이 발생할 수 있음

  • 2018–10–12 <편집 리뷰를 거쳐 페이지 게시됨

  • [2018.3]에서 추측성 충돌 검사 추가됨(https://docs.unity3d.com/2018.3/Documentation/Manual/30_search.html?q=newin20183) NewIn20183

캐릭터 컨트롤러
물리 디버그 시각화