정렬되지 않은 충돌 방지 (스티어링)를 사용할 때 충돌하는 객체 이동 하나가 약간 아래로 움직 이도록 설정했습니다. 정렬되지 않은

드문 경우라고 생각되는 것에 대해 정렬되지 않은 충돌 방지에 문제가 있습니다. 두 객체가 서로를 향해 움직이지만 약간의 오프셋을 설정하여 객체 중 하나가 약간 위로 움직이고 객체 중 하나가 약간 아래로 움직 이도록 설정했습니다.

정렬되지 않은 충돌 회피 조향 알고리즘에서 객체의 전방 라인 과이 두 라인이 가장 가까운 다른 객체의 전방 라인에서 포인트를 찾고 있습니다. 이 가장 가까운 점이 충돌 회피 거리 내에 있고, 그 사이의 거리가 두 물체의 경계 구의 두 반지름보다 작 으면, 물체는 적절한 방향으로 움직여야합니다.

문제는 내 경우에는 선에서 가장 가까운 점이 실제 충돌 지점에서 실제로 멀어 지도록 계산된다는 것입니다. 이는 객체가 지나갈 때 각 객체에 대한 두 개의 전방 선이 서로 멀어지기 때문입니다. 문제는 이것 때문에 조향이 일어나지 않고 두 물체가 부분적으로 충돌한다는 것입니다.

객체 전달 라인의 스크린 샷.

충돌 지점을 올바르게 계산하는 방법에 대한 제안이 있습니까? 아마도 두 물체의 크기를 어떻게 생각합니까?



답변

이것은 내가 만난 최고의 공 대 공 충돌 감지 기사입니다.

풀 홀 레슨 : 원 또는 구 간 빠르고 정확한 충돌 감지


답변

가장 가까운 지점을 찾고 싶지 않습니다.

거리가 두 구의 결합 반지름과 동일한 선에서 점을 찾으려고합니다.


답변

귀하의 질문을 올바르게 이해하고 있다면 AttackingHobo가 제안한 것처럼 Sphere vs Sphere 교차 테스트를 사용하면됩니다.

이러한 테스트를 수행하는 수학은 다음과 같습니다 (내가 틀렸다면 수정하십시오. 또한 이것은 구체에 중심과 반경 변수가 각각 있다고 생각합니다.

검사 공식은 다음과 같습니다.

distanceOfSpheres <= sumOfRadii^2

구 대 구 교차점이 있습니다. 이것은 매우 간단합니다. 코드에서 어떻게 보이는지 봅시다!

bool sphereIntersectTest(BoundingSphere* s1, BoundingSphere* s2)
{
   Vector3 distance;

   // Get the distance between each sphere, center is a Vector3 type
   distance = (s1->center - s2-> center);

   // Determine the sum of both radii
   float radii = (s1->radius + s2->radius);

   // Determine if we have an intersection
   if (distance.length <= (radii * radii))
      return true;
   else
      return false;
}

다시, 나는 이것이 당신이 찾고있는 정답이라고 생각합니다. 이것이 잘못되었다는 것을 아는 사람이 있다면이 수학을 한 지 오래되었습니다.


답변

좋아, 희망적으로 이것은 의미가 있습니다 … 공의 벡터를 얻고 그들의 충돌 지점을 계산하고, 이것을 p1이라고 부릅니다. 두 벡터 사이의 각도를 찾고 이것을 a1이라고 부릅니다. 1/2에서 선을 그리면 두 벡터 사이의 중간 정도가 정확하게됩니다. 이 선에서 sin (a1 / 2) = (radius1 + radius2) / 2 인 위치가 필요합니다. 이 사진이 내 머리 오른쪽에 표시되면 충돌이 발생한 곳입니다. 이것이 잘못되면 죄송합니다 … 늦었습니다.