스프라이트 간의 충돌을 감지하는 가장 좋은 방법은 무엇입니까?
-
01-07-2019 - |
문제
2D 게임 스프라이트에서 충돌을 감지하는 가장 좋은 방법은 무엇입니까?저는 현재 allegro와 G++로 작업하고 있습니다.
해결책
충돌 감지를 감지하는 방법에는 여러 가지가 있습니다.2D 환경을 사용하는지 3D 환경을 사용하는지에 따라 사용하는 방법이 약간 변경됩니다.또한 충돌 감지 시스템을 구축할 때 현실감을 향상시키기 위해 게임에서 구현하려는 물리학(대부분의 하강 3D 게임에 필요함)을 고려해야 한다는 점을 기억하십시오.
짧은 버전은 경계 상자를 사용하는 것입니다.즉, 월드의 각 엔터티를 상자로 만든 다음 상자의 각 축이 다른 엔터티와 충돌하는지 확인합니다.
충돌을 테스트할 엔터티가 많으면 옥트리를 확인하는 것이 좋습니다.간단하게 월드를 섹터로 나눈 다음 동일한 섹터에 있는 개체 간의 충돌만 확인합니다.
더 많은 리소스를 보려면 sourceforge로 이동하여 오픈 소스 충돌 감지 및 물리 엔진인 Bullet 역학 엔진을 검색하거나 확인해 보세요. http://www.gamedev.net 여기에는 다양한 게임 개발 주제에 대한 많은 리소스가 있습니다.
다른 팁
괜찮은 2D 그래픽 라이브러리라면 정렬된 스프라이트부터 폴리곤, 픽셀까지 모든 것에 대한 자체 충돌 감지 기능을 제공하거나 이러한 기능을 수행하는 하나 이상의 좋은 타사 라이브러리가 있을 것입니다.엔진/라이브러리/프레임워크 선택에 따라 충돌 감지 선택이 결정되어야 합니다. 충돌 감지 선택은 단독으로 생성할 수 있는 것보다 훨씬 더 최적화될 가능성이 높기 때문입니다.
알레그로에게는 콜레그로.SDL의 경우 SDL_Collide.h 또는 SDL-충돌.당신이 사용할 수있는 나는_충돌한다 OpenGL로.DarkBASIC에는 충돌 시스템이 내장되어 있으며, 다크피직스 충돌을 포함한 매우 정확한 상호작용을 위해.
도서관을 이용하세요. 추천합니다 Box2D
이 질문은 매우 일반적입니다.2D 게임에서 충돌 감지를 수행하는 방법에는 여러 가지가 있습니다.당신이 무엇을 하려고 하는지 아는 것이 도움이 될 것입니다.
하지만 시작점으로 원, 직사각형 등 사이를 감지할 수 있는 매우 간단한 방법이 있습니다.나는 gamedev.net의 열렬한 팬은 아니지만 이러한 유형의 탐지에 대한 좋은 리소스가 있습니다.그러한 기사 중 하나는 여기.시작하는 데 도움이 될 수 있는 몇 가지 기본 자료를 다루고 있습니다.
기본 2D 게임에서는 직사각형이나 원을 사용하여 화면의 개체를 "감싸" 수 있습니다.직사각형이 겹칠 때나 원이 겹칠 때를 감지하는 것은 매우 간단한 수학입니다.더 복잡한 것(예: 볼록 관절 폴리)이 필요한 경우 솔루션은 더 복잡합니다.여기서도 gamedev.net이 도움이 될 수 있습니다.
하지만 실제로 귀하의 질문에 대답하려면 귀하가 무엇을 하려는지 알아야 합니다.어떤 종류의 게임인가요?어떤 유형의 물체를 충돌시키려고 합니까?화면 경계 등에 충돌하려고 하시나요?
충돌 감지 시스템을 구현하는 것은 복잡한 문제이지만 세 가지 사항을 고려하고 싶습니다.
사물의 세계.공간 분할.세계의 모든 2D 스프라이트에 대해 다른 모든 것에 대해 충돌 검사를 수행하면 프로그램이 느려질 것입니다!우선순위를 정해야 합니다.공간을 나누어야 합니다.직교 그리드 시스템을 사용하여 세계를 2D 그리드로 분할할 수 있습니다.또는 라인을 구분자 기능으로 사용하여 BSP 트리를 사용할 수도 있습니다.
광범위한 위상 충돌 감지 이것은 실린더 또는 엘립스와 같은 경계 볼륨을 사용하여 (스프라이트의 모양을 가장 근사하는 것) 객체가 더 자세히 비교할 가치가 있는지 여부를 결정합니다.이에 대한 수학은 쉽습니다.2D 행렬 변환을 알아보세요.그리고 2D 교차점의 경우 고성능 비디오 카드를 사용하여 많은 작업을 수행할 수도 있습니다!
좁은 위상 충돌 감지 이제 두 개 이상의 객체를 비교할 가치가 있다고 판단하므로 미세 조정 된 섹션으로 들어갑니다.이 단계의 목표는 충돌 결과를 결정하는 것입니다.침투 깊이, 포괄 부피 등...그리고 이 정보는 여러분이 계획한 모든 물리 엔진에 입력됩니다.3D에서 이것은 우리 모두가 그토록 좋아하는 GJK 거리 알고리즘 및 기타 니토 알고리즘의 영역입니다!
이 모든 것을 일반적으로 구현하고 광범위하고 좁은 해상도를 다형적으로 지정하거나 하위 수준 언어로 작업하는 경우 후크를 제공할 수 있습니다.
무엇 사이의 충돌?스프라이트, 오목 다각형, 볼록 다각형, 직사각형, 정사각형, 원, 점 등을 사용하는지 여부에 따라 다릅니다.
2D에서 두 공 사이의 충돌을 확인하는 것은 쉽습니다.Google에서 검색할 수 있지만 기본적으로 두 공의 반경을 합친 길이가 두 공의 중심 사이의 거리보다 크거나 같은지 확인합니다.
그런 다음 공 중심 사이의 단위 벡터를 가져와 공 반경 중 하나와 곱하여 충돌 지점을 찾을 수 있습니다.