충돌하는 두 몸체의 침투를 해결하는 방법


9

간단한 3D 게임 물리 엔진을 구현했습니다. 이미 적절한 충돌 감지가 이루어 졌으므로 이제 충돌 응답 부분을 찾으려고합니다. 충돌 후 속도를 계산하기 위해 임펄스 기반 방법을 사용하고 있습니다. 이것은 꽤 잘 작동하지만 신체가 계속 침투하는 것을 완전히 막지는 못합니다. 그래서 침투를 해결하기 위해 추가 코드가 있습니다. 현재는 접촉 깊이의 절반으로 접촉 법선을 따라 몸체를 이동합니다. 첫 번째 몸체는 접촉 법선 방향으로, 두 번째 몸체는 반대 방향으로 이동합니다.

대부분의 경우 괜찮지 만 몇 가지 바람직하지 않은 영향이 있습니다. 예를 들어 좁은 복도와 그 안에서 움직이는 물체를 상상해보십시오. 물체가 복도의 벽 중 하나에 닿으면 관통 해상도가 반대쪽 벽으로 이동 한 후 다음 프레임에서 다시 첫 번째 벽으로 이동합니다. 그 효과는 물체가 벽 사이에서 정말 빠르게 진동하는 것입니다.

내 질문은 침투를 해결하는 더 좋은 방법이 있는지 여부입니다. 아마도 몸을 움직이지 말고, 임펄스 계산에 더하여 속도를 조정하여 서로를 향한 움직임을 멈추고 다음 프레임에서 침투가 해결됩니다. 나는 단지 여기에서 추측하고있다. 어떤 아이디어?

답변:


3

충돌을 감지하면 바디가 충돌을 시작한 시간 / 지점을 결정하고이 시점에서 충돌을 처리합니다. 이 시점에서 여전히 해결하기 위해 약간의 침투가있을 수 있지만 훨씬 작아지고 일반적으로 발생하는 진동 문제를 일으키지 않습니다.

100ms의 시뮬레이션 단계가 있고 어떤 프레임에서는 프레임에 절반 (50ms) 충돌하는 두 개의 공이 있다고 가정합니다. 먼저, 프레임의 어느 시점에서나 충돌 한 것을 감지합니다 (이미 효과적으로 수행하고 있다고 신뢰합니다). 프레임 중 충돌 한 지점을 결정합니다. 충돌하지 않은 프레임의 처음 50ms를 포함하여 충돌을 처리하십시오. 이제 공의 새로운 속도를 얻게되며, 이제는 침투하지 않도록 조치를 취할 수 있습니다 (이것은 "그냥 일어난"이후 매우 작아야합니다). 마지막으로 다음 50 년대를 시뮬레이션합니다. 프레임. 이 기간 동안이 볼들 중 하나 또는 둘 모두와 다른 충돌이있을 수 있습니다.


1
따라서 기본적으로 연속 충돌 감지를 구현 한 다음 침투가 여전히 똑같은 방식으로 처리되도록 제안합니다. 이것은 내가 생각할 수 있습니다. 이제 충돌 감지를 연속적으로 수행하는 방법 만 알아 내야합니다. :
adam

지속적인 의미가 무엇인지 확실하지 않습니다. 엄밀히 말하면, 물리 시뮬레이션에는 모든 것이 항상 어떤 크기의 개별 단계로 나뉘어 있기 때문에 연속적인 물리 시뮬레이션은 없습니다. 본질적으로 내가 제안하는 작은 단계를 수행하면 훨씬 더 작고 수정하기 쉬운 오류가 발생합니다. 이것을 생각하는 또 다른 방법은 단계 크기와 오류 (예 : 침투) 사이에 직접적인 관계가 있다는 것입니다. 따라서 이러한 오류를 감지하면 오류를 쉽게 해결할 수있을 때까지 더 작은 단계로 나눕니다.
notlesh

연속 충돌 감지는 두 정적 객체 (3d 문제) 사이의 교차점을 확인하는 대신 두 움직이는 객체 (기본적으로 4d 문제)의 접촉을 확인한다는 의미입니다. 일반적으로 일정한 속도 만 고려하면 충분합니다. 구간 별 선형 곡선으로 궤적을 근사 할 수 있기 때문입니다. 이점은 침투 거리가 항상 0 (또는 플로트 라운딩 오류로 인해 근접)이라는 것입니다. 나는 당신이 이것에 대해 이야기하고 있었지만 아마도 당신의 대답을 잘못 해석했을 것입니까?
adam

@adam 예, 그것이 제가 말하는 것입니다.
notlesh

2

여기에 여러 번 게시 된이 기사를 확인하십시오. 충돌 감지 태그 Q & A를 통해 검색하면 stephelton이 말한 "연속적인"충돌 해결 방법을 보여줍니다.

http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php?page=3

기본적으로 두 경계 상자가 교차하기 시작한 정확한 시점에 대한 몇 가지 기본 운동학 방정식을 해결합니다. 정확한 순간에 충돌을 해결 한 다음 프레임에서 남은 시간을 진행합니다. 물체의 속도 / 가속도가 변경되므로 충돌 순간 이후에 발생하는 상황을 다시 시뮬레이션해야 할 수도 있습니다. 어쨌든 당신의 출발점이 있습니다 ... 건배!


고마워, 기사를 확인했다. 물건을 다른 표현으로 사용하고 있습니다. 볼록 다면체를 사용하고 분리 축 정리를 사용하여 충돌을 테스트하고 있습니다. 이것은 일정한 선형 속도 (내가 어떻게 해야할지 알고 있음)로 움직이는 몸체를 처리하도록 확장 될 수 있지만 각도 속도도 처리하는 방법을 모릅니다. 그러나 이런 식으로 가기로 결정하면 별도의 질문을 할 것입니다.
adam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.