추측성 충돌 검사는 Continuous Speculative 모드의 CCD 알고리즘입니다.
추측성 충돌 검사는 스위핑 기반 충돌 검사보다 더 적은 계산을 요구합니다. 또한 리니어 움직임(예: 직선으로 움직이는 공)과 회전 움직임(예: 핀볼 기계의 플리퍼가 피벗을 기준으로 회전할 때 공과 충돌하는 경우)의 결과로 발생하는 충돌에도 작동합니다.
그러나 Continuous Speculative는 정확도가 떨어질 수 있으며, 충돌 누락뿐만 아니라 알고리즘이 충돌을 잘못 예측하여 콜라이더가 코스를 벗어나는 ’허위 충돌’이 발생할 수도 있습니다.
추측성 CCD는 오브젝트의 리니어 및 각도 모션을 기반으로 오브젝트의 넓은 페이즈 축에 정렬된 최소 경계 상자(AABB)를 늘리는 방식으로 작동합니다. 이 알고리즘이 추측성인 이유는 다음 물리 단계에서 접촉 가능한 모든 컨택트를 선택하여 솔버에 제공하기 때문이며, 이를 통해 모든 컨택트 제약 조건이 충족되어 리지드바디가 충돌을 통과하지 않도록 할 수 있습니다.
현재 속도에 기반하여 팽창된 AABB는 이동 궤도의 가능한 모든 컨택트를 감지할 수 있도록 지원하여 솔버가 누락된 충돌(‘터널링’)을 방지할 수 있게 합니다.
추측성 CCD의 경우 솔빙 및 통합 단계가 아닌 충돌 검사 단계 동안에만 컨택트를 계산하기 때문에 일반적으로 스위핑 기반 메서드보다 더 적은 리소스를 소모합니다. 또한 추측성 CCD는 오브젝트의 리니어 및 각도 모션에 기반하여 넓은 페이즈 AABB를 확대하므로 스위핑 기반 CCD에서 누락될 수 있는 컨택트도 찾을 수 있습니다.
그러나 추측성 CCD는 오브젝트의 모션이 부적절하게 추측성 컨택트 포인트의 영향을 받는 허위 충돌(‘고스트 충돌’)을 초래할 수 있습니다. 이는 추측성 CCD가 근접점 알고리즘에 기반하여 모든 잠재 컨택트를 수집하여 컨택트 노멀의 정확도가 감소하기 때문입니다. 이러한 이유로 속도가 빠른 오브젝트가 테셀레이션된 충돌 부분을 따라 미끄러져 튀어오르는 문제가 발생할 수 있습니다. 예를 들어, 다음 다이어그램에서는 구체가 t0부터 오른쪽으로 수평 이동하며, 통합 후 예상되는 포지션은 t1입니다. 팽창된 AABB가 b0 및 b1 상자와 겹치고 CCD는 c0와 c1에 2개의 추측성 컨택트를 도출합니다. 추측성 CCD는 근접점 알고리즘을 사용하여 컨택트를 생성하므로 c0는 솔버가 램프라고 추측하는 매우 경사진 노멀을 포함합니다.
이처럼 경사진 노멀로 인해 t1은 통합 후 직선으로 이동하지 않고 위로 튀어오르게 됩니다.
또한 추측성 CCD에서는 추측성 컨택트가 충돌 검사 단계 동안만 계산되므로 충돌 누락이 발생할 수 있습니다. 컨택트 솔빙 중 오브젝트가 솔버에서 과도한 에너지를 받으면 통합 후 팽창된 초기 AABB를 벗어날 수 있습니다. AABB 외부에서 충돌이 발생하면 오브젝트가 그냥 통과하게 됩니다.
예를 들어, 다음 다이어그램은 막대가 시계 방향으로 회전하는 동안 구체가 t0에서 왼쪽으로 움직이는 모습을 나타냅니다. 구체가 충돌에서 과도한 에너지를 받으면 t1의 팽창된 AABB(빨간색 점선으로 표시된 사각형)를 이탈하게 됩니다. 아래의 파란색 상자에 나타난 것처럼 AABB 외부에서 충돌이 발생하면 구체가 충돌을 누락하고 AABB를 그냥 통과할 수 있습니다. 이는 솔버가 팽창된 AABB 내의 컨택트만 계산하며, 솔빙 및 통합 단계 중 충돌 검사가 수행되지 않기 때문입니다.
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.