Unity의 OnCollisionEnter가 표면 법선을 제공하지 않는 이유는 무엇이며 가장 확실한 방법은 무엇입니까?


11

Unity의 충돌시 이벤트는 충돌이 발생한 충돌에 대한 정보를 제공 하는 충돌 객체를 제공합니다 ( 적중 법선 이있는 ContactPoint 목록 포함 ).

그러나 당신이 얻지 못하는 것은 충돌하는 충돌체의 표면 법선입니다. 설명 할 스크린 샷이 있습니다. 빨간색 선은에서 ContactPoint.normal오고 파란색 선은에서옵니다 RaycastHit.normal.

여기에 이미지 설명을 입력하십시오

이것이 단순화 된 API를 제공하기 위해 정보를 숨기는 Unity 인스턴스입니까? 아니면 표준 3D 실시간 충돌 탐지 기술이이 정보를 수집하지 않습니까?

그리고 질문의 두 번째 부분에서 충돌의 표면 법선을 얻는 확실한 방법은 무엇입니까?

레이 캐스팅은 표면 노멀을 제공한다는 것을 알고 있지만 모든 시나리오 에서이 작업을 수행하려면 여러 레이 캐스트를 수행해야합니다 (접촉점 / 일반 조합이 첫 번째 캐스팅에서 충돌자를 놓칠 수도 있습니다. 최상의 결과를 얻으려면 접점의 법선).

내 현재 방법 :

  1. Collision.contacts[0].point적중률을 따라 백업

  2. 부정 된 히트 다운 레이 캐스트 정상에 float.MaxValue에,Collision.collider

  3. 실패하면 음이 아닌 법선으로 1 단계와 2 단계를 반복하십시오.

  4. 실패하면 1 ~ 3 단계를 시도하십시오. Collision.contacts[1]

  5. 성공할 때까지 또는 모든 접점이 소진 될 때까지 4를 반복하십시오.

  6. 포기하고 돌아가십시오 Vector3.zero.

이것은 모든 것을 잡는 것처럼 보이지만 모든 광선 방송은 나를 편하게 만듭니다. 그리고 이것이 충분한 경우에 효과가 있는지 테스트하는 방법을 모르겠습니다. 더 좋은 방법이 있습니까?

편집 이것이 실제로 3D 충돌과 똑같은 방식이라면, 일반적인 경우 왜 Unity에 특정한 것만큼이나 환영받는 이유에 대한 개요입니다.


이것은 단지 호기심을위한 것일까 요, 아니면 무언가를하려고 애 쓰고 있습니까? 즉, 왜 표면 법선이 필요하다고 생각합니까? 지정되지 않은 문제에 대한 해결책을 "고정"하는 방법보다는 달성하고자하는 효과에 대해 질문하십시오. 누군가가이를 해결하도록 도울 수 있습니다. :)
Sean Middleditch 2013 년

@SeanMiddleditch 동의하지 않습니다. 그 질문은 잘 짜여져 있었고 내가 찾던 그대로였습니다. 이 질문과 답변은 내가 잘못하고있는 것들을 수정하는 데 도움이되었습니다.
SteakOverflow

답변:


12

이것은 실제로 상황이 충돌하는 방식입니다. 3D뿐만 아니라 2D도 있습니다. 다음 예를 보자.

겹치는 AABB

녹색 및 빨간색 AABB가 충돌하고 접점 매니 폴드가 파란색 영역입니다. 접점은 파란색 영역에있을 것입니다 (정확히 알고리즘에 따라 달라질 수 있지만 파란색 / 빨간색 / 녹색이 만나는 모서리는 이상적입니다).

어떤 표면 법선이 반환되어야합니까? 빨간색 AABB의 상단 모서리 또는 왼쪽 모서리? 초록색 상자가 떨어지면 상단 가장자리를 합리적으로 추측 할 수 있습니다. 오른쪽으로 움직이면 왼쪽 가장자리를 합리적으로 추측 할 수 있습니다. 오른쪽 아래로 움직이면 어떻게 되나요? 최소 침투 축을 취합니까? 가장 큰 속도의 속도 축? 둘 다 휴리스틱? 상자가 모서리에 정확히 충돌하면 어떻게됩니까?

이를 100 개의 트라이 스 /면으로 구성된 복잡한 3D 표면으로 확장하십시오. 여전히 이상적인 이상적인 접점 수가 적을 것입니다. 어떤 표면 법선이 반환되어야합니까? 트라이-메쉬 전체에 대한 평균 표면이 정상입니까 (대부분의 물체에는 적합하지 않습니다)? 충돌 상자의 모서리 바로 아래에있는 점들 (대부분의 다른 모양에는 잘 정의되지 않음)? 생성 된 접점에 가장 가까운면을 찾으려고합니까 (접점은 메쉬면에서 직접 계산되지 않으므로 두 번째 패스가 필요함)? 가장 가까운면을 찾으면,면의 법선을 취하거나 접촉점에서면의 정점을 보간하여 "부드러운"물체에 대한 올바른 법선을 얻습니까?

실제로 주요 문제는 접점이 모든 접점 이 아니라는 입니다. 많은 경우에, 그것은 결국 무한한 점 집합이 될 것입니다. 그것들은 잘 분포되어있는 몇 개의 점에 불과합니다. 충돌 지점을 부적절하게 주변으로 밀기 위해 상기 지점에 힘을 가하여 물리적 반응을 추정하는 것이 합리적으로 가능합니다. 실제 물체 접촉의 특정 지점 / 위치는 단순화 된 수학적 모델 뒤에 추상화되어 있습니다. 따라서 특정 표면 접촉 표준 개념은 일반적인 경우에 의미가 없습니다.

물론 객체, 월드 및 모션에 대한보다 구체적인 제약과 제한으로 표면 법선에 대해 알려주는 대체 충돌 알고리즘을 만들 수 있습니다. 위의 2D 사례에서 상자가 회전하지 않고 각각의 상대 속도와 마지막 위치를 알고 있다고 가정하면 연속 충돌 감지를 사용하여 충돌 시점과 충돌 한 지형지 ​​물을 정확하게 파악할 수 있습니다. 충돌이 발생한 정확한 기능을 접점 / 충돌 / 표면 법선으로 사용할 수 있습니다. 플랫 포머 게임은 전적으로 그러한 가정과 특수한 트릭을 기반으로합니다 (Box2D 또는 Havok과 같은 일반적인 물리 라이브러리를 사용하거나 조명을 사용하여 마리오 나 소닉과 같은 클래식 플랫 포머에서 찾을 수있는 엄격하고 정밀한 컨트롤을 생성하지 않는 이유는 무엇입니까? 말하고 싶어

Unity3D에서 사용되는 것과 같은 일반적인 뉴턴 물리학 라이브러리는 이러한 종류의 단순화 및 가정을 할 수 없습니다. 따라서 충돌 표면 법선을 얻지 못하고 접점 매니 폴드를 얻습니다. 일반적으로 접점까지 단순화하면됩니다.


이것은 환상적인 답변이며, 내가 찾던 것은 정확히 감사합니다. 구체적인 문제는 충돌시 운동 학적 강체에 설득력있는 반사 벡터를 얻는 것이 었습니다. 이러한 종류의 정보를 사용하여 3 개의 접점 (사용 가능한 경우)을 레이 캐스트하거나 잡을지 선택하고 교차 제품을 가져 오려는 경우 일반적인 접근 방식입니까?
michael.bartnett
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.