2010-01-29 8 views
15

여기 내 문제가 있습니다. 나는 게임을 만들고있어 충돌을 어떻게하는지 궁금해. 나는 여러 가지 경우로 분석하고 가장 좋은 해결책을 찾는다.실제 응용 프로그램의 충돌

사전에 말씀 드리지만 제 3 자 물리 라이브러리를 사용하고 있지 않지만 집에서 할 것입니다. (즉

1) 정적 메쉬 :

(이것은 교육 프로젝트로, 나는 일정이 없어 내가 배우고 싶은) 난의 충돌을해야하는 메시의 두 유형이 (

2) 피부/알맹이 고래 수염 메쉬 (애니메이션)

이 사실 나는이 솔루션을) 매우 해키 화면을 이동하지만, 어떤 애니메이션이 없습니다 : |) 모든

우선 내가 가지고 전체 m을 묶는 일부 경계 볼륨에 대해 테스트 esh (내 경우 캡슐) :

1) 정적 메쉬의 경우 모델러의 블록으로 수동으로 분할하고 각 블록에 대해 구/AABB 테스트를 사용합니다. (괜찮 았지 만 모든 메쉬를 자르기에는 약간 지저분합니다 : P) (평면을 통해 메쉬를 분할하는 자동 시스템을 사용했지만 나쁜 결과를 낳습니다.)

2) 애니메이션 메쉬 ATM의 경우 ' m 런타임에서 메쉬를 x 블록 (x는 뼈의 수)으로 나눕니다. 각 블록에는 해당 뼈가 주요 영향 요인 인 정점이 있습니다. (때로는 때로는 정말 나쁜 결과를 제공, 작동 : |.) :

그리고

메쉬의 격차가 때마다 로딩 시간에 수행되지 않고 있습니다 (D 그렇지 않으면 슬라이드 쇼처럼 실행됩니다) 여기에 질문이 있습니다 :

그 2 가지 경우에 사용할 가장 좋은 생각은 무엇입니까? 이 방법을 연구 할 자료가 있습니까? (일부 소스 코드와 설명이 더 좋을 것입니다. 언어는 중요하지 않습니다. 알고리즘을 이해하면 구현이 쉽습니다.) 그 솔루션이 다른 솔루션보다 나은 이유는 무엇입니까? kd-tree, octree 등등에 대해 많은 이야기를 들었습니다. 충돌 감지 시나리오에서 그 구조를 놓친 구조를 이해합니다.

답변 해 주셔서 감사합니다.

편집 : 그물에 대한 설명과 함께 K-Dop 예제를 찾으려고합니다. 아직도 아무것도 찾지 못했습니다. :(단서가 있습니까? K-Dop을 다른 유형의 경계 용적으로 효율적으로 테스트 할 수있는 방법에 관심이 있습니다.하지만 그물에 대한 문서는 매우 부족한 것처럼 보입니다. :

답변

4

많은 현재의 AAA 게임에서 사용되는 가장 일반적인 접근법은 StaticMesh에 대한 단순화 된 충돌과 SkeletalMeshes에 대한 간단한 신체 신체 표현입니다.

"kDOP 충돌"또는 "이산 오리엔트 폴리 토프"에 대해 Google에서 충분한 참조를 찾아야합니다. 이것은 기본적으로 삼각형 충돌이 발생할 때까지 바깥 쪽에서 메쉬쪽으로 이동 한 여러 평면으로 정의 된 바운딩 볼륨입니다. kDOP의 "k"는이 평면의 사용량을 정의하며, 기하학 및 "k"에 따라이 값과 근사치를 얻을 수 있습니다.

SkeletalMeshes의 경우 가장 보편적 인 기법은 특정 본에 첨부 된 간단한 형상을 정의하는 것이 아닙니다. 이 기하학은 상자 또는 구일 수 있습니다. 이 충돌 모델은 애니메이션 메쉬의 매우 정확한 충돌 감지에 사용할 수 있습니다.

삼각형 단위의 충돌이 필요한 경우 "분리 축 정리"는 원하는 Google 검색 용어입니다. 이것은 특정 경우에 유용하지만, 충돌 감지 요구의 75 %는 위에서 언급 한 방법으로 다루어야합니다.

경계 볼륨보다 조기 충돌 거부 수준이 높아야합니다. 전 세계에 많은 객체가있는 경우 가능한 한 빨리 객체 그룹을 추가 테스팅에서 제외시키기 위해 "공간 분할"을 사용해야합니다.

+0

좋은 답변입니다. 보아야 할 것들이 많이 있습니다. 내일 나는 좋은 검색과 그들을 구현 하고이 스레드에 대한 자세한보고 몇 가지 작업을 제공 할 것입니다. 잠시 동안 +1 !!! 감사합니다 – feal87

+0

나는 모든 그물을 검색하고 있지만 여전히 K-Dop에 대한 설명이있는 하나의 작업 예제를 찾지 못했습니다. 이론 논문 (보기 당 유료) 만 많습니다. : | 실마리가 있습니까? : – feal87

+0

D-Collide는 kDop을 구현하는 오픈 소스 충돌 라이브러리 인 것 같습니다. 따라서 구현 예제를 찾아 볼 가치가 있습니다. http://d-collide.ematia.de/ 이 gamedev.net 스레드는 많은 구현 세부 사항을 다루고 있습니다 : http://www.gamedev.net/community/forums/topic.asp?topic_id=430895&whichpage=1� – DarthCoder

5

복잡한 작업을하기 전에 충돌 감지는 기본 검색을 수행해야합니다.

이 충돌을 감지합니다. 그런 다음, 더 복잡한 방법에 가장 좋은 이동됩니다 경계 볼륨으로 구 또는 사각형을 사용.

내가에서 받고 있어요 것은 간단합니다 바운드 볼륨을 감싸고 메쉬를 분할하는 것은 비용이 많이 드는 일입니다. 복잡한 것도 말할 것도없고, 옳은 길에있는 것 같습니다.

게임 프로그래밍과 마찬가지로 여러 가지 충돌 감지 방법이 있습니다. 내 충고가 간단해질 것입니다.입방체를 가져 와서 루틴을 완성하면 이론상 다른 모델을 사용할 수 있어야합니다. 예를 들면 나는 그들이 좋은 기사를 가지고 있기 때문에 gamedev.net을 체크 할 것이다. 대다수 또는 집에서 만든 충돌 감지는 여러 가지 방법을 조합 한 것이므로 최종 리소스를 실제로 추천 할 수는 없습니다.

+2

분명히 나는 ​​(메시의 캡슐) 전체 볼륨에 대한 테스트를 먼저하고 난 후에이 질문의 주제와 주제를 이해해야한다. – feal87

2

대답 질문은 에 얼마나 정확한지 묻습니다.

분명히 구 경계 상자가 가장 중요합니다. 다른 쪽에서는 객체가 움직일 때마다이 발생해야하는 완전한 삼각형 메시 메쉬 충돌 감지 이 있습니다.

게임 개발 물리 엔진은 근사치 기술에 의존합니다 (저는 수년 전에 GameDev.net의 수학 및 물리학 포럼에 잠겼습니다).

제 생각에는 각 객체와 관련된 일종의 경계 타원체가 필요하다는 것입니다. 객체는 일반 multimesh 객체, 메쉬 또는 서브 메쉬 메쉬가 될 수 있습니다. 이것은 근사치의 '적절한'양을 제공해야합니다.

+0

단순한 개체는 괜찮습니다. (구체, 캡슐, OOBB, AABB, 타원체, 무엇이든간에) 복잡한 개체 (우주선 또는 사람)에 대해 충돌 트리를 만들고 싶다면 메시를 여러 조각으로 나누어야합니다. 기본 질문입니다. 메쉬를 분할하고 시스템에서 사용하는 가장 좋은 방법은 무엇입니까?나는 원하는대로 데이터를 이동할 수 있도록 내 시스템을 가지고 있지만 가장 일반적으로 받아 들여지는 방법을 알고 싶습니다. 따라서 쓸모없는 것들을 시도하는 것을 피할 수 없습니다. – feal87

+0

@ feal87 : 나는 일반적인/받아 들여지는 방법을 모른다. 그러나 각 '충분히 흥미로운'객체에 대한 객체 생성 시간에 메타 데이터에서 타원체를 생성 할 것이고 하위 객체이므로 재귀가 세부 사항을 구체화 할 수 있습니다. –

+0

근사의 예술에 +1! 사실이에요 ... – Nate

2

픽업 Christer Ericson's 도서 Real-Time Collision Detection. 그는이 문제들을 아주 자세하게 논의합니다.

기사를 읽을 때 실제 게임 응용 프로그램에서 메모리와 시간의 엄격한 한계에서 작업한다는 것을 기억하십시오. 프레임 당 16.6ms를 얻습니다. 알고리즘의 메모리와 CPU 풋 프린트를 심각하게 논의하지 않는 기사 나 논문은주의해야합니다.

+0

제안에 감사드립니다. 그물에 아무것도 찾을 수 없다면 나중에 조사 할 것입니다. – feal87

+0

+1 - 나는이 책을 직장에서 읽었으며 꽤 도움이된다. – xan

+0

+1 크리스 터의 책. 훌륭한 참고 자료이며 제목보다 많은 영역을 다룹니다. – zebrabox

관련 문제