미사일과 비트 맵 지형의 교차점을 찾는 가장 효율적인 방법은 무엇입니까?


10

2D 비트 맵 지형의 기울기를 찾는 것에 대한 이전 질문에 이어 이제 미사일이 맞은 2D 지형의 지점을 찾는 가장 좋은 방법을 알아야합니다. 분명히, 미사일 아래의 픽셀이 지형과 교차하는지 알 수 있지만, 지형으로 상당히 깊숙이 이동했다고 말합니다.

처음 충돌 한 위치를 찾기 위해 뒤로 물러 설 수있는 가장 좋은 방법은 무엇입니까? 한 번에 X 픽셀을 미사일의 이전 위치로 되돌릴 수 있지만 X의 좋은 가치는 무엇입니까? 더 똑똑한 방법이 있습니까? 어쩌면 반 거리를 이동 한 다음 1/4 등을 움직일 수 있습니까?


설명하는 현상을 일반적으로 "터널링"이라고하며이를 처리하는 가장 좋은 방법은 TetraD와 JasonD가 아래 언급 한 것처럼 스윕 테스트를 도입하는 것입니다.
jpaver

"스윕 테스트"라고 말하는 것이 실제로 도움이되지는 않습니다. 비트 맵 터 레인으로 어떻게합니까?
Iain

Jason의 제안은 나에게 가장 좋은 것 같습니다 : 한 번에 한 픽셀.
jpaver

답변:


3

충돌 테스트의 경우 틱별로 정적 테스트를 수행하지 말고 추적 / 스윕 테스트를 수행해야합니다.

여기에는 다양한 종류의 프리미티브에 대한 다양한 공식 목록이 있습니다. http://www.realtimerendering.com/intersections.html

물론, 터 레인을 테스트 할 수있는 일종의 프리미티브 (예 : 선 세그먼트)로 지형을 분류 할 수 있다고 가정합니다. 여러 가지 방법이 있습니다.

이 질문도 참조하십시오 (약간 관련되어 있음) : 움직이는 구 사이의 충돌을 감지하는 좋은 알고리즘은 무엇입니까?


나는 Worms처럼 파괴 가능한 비트 맵 지형에 대해 생각하고있었습니다. 비트 맵에서 기본 요소를 동적으로 생성 할 수 있습니까?
Iain

1
나는 당신이 할 수 있다고 확신하지만 임의의 비트 맵을 픽셀 단위로 테스트하는 것이 더 쉽고 빠를 수 있습니다.
Tetrad

QUADTREE와 함께!! (그래서 영원히하지 않음)
bobobobo

3

이진 검색은 약간의 풍경과 빠르게 움직이는 발사체가 있으면 도움이되지 않습니다.

최선의 선택은 한 번에 픽셀 단위로 경로를 따라 발사체의 앞면을 가로 지르는 선을 청소하는 것입니다. 모든 단계에서 수행하지 않도록 전체 볼륨에 대해 경계 점검을 먼저 수행 할 수 있습니다.


이진 검색이란 무엇입니까?
Iain

1
죄송합니다-이진 검색은 질문에서 이야기 한 내용과 거의 같습니다. 중간에서 시작하여 답에 수렴 할 때까지 검색 공간을 2로 나눕니다. 많은 경우에 최적이지만 귀하의 경우 작동하지 않습니다 (정답을 완전히 건너 뛸 수 있음).
JasonD

3

미사일은 매 프레임마다 많은 양의 픽셀을 움직일 것 같지 않기 때문에 (화면에서 매끄럽지 않을 것입니다) 경로의 모든 픽셀을 확인하지 않는 이유는 없습니다. Bressenham 라인 알고리즘은 친구이며 일반적으로 모든 픽셀의 비디오 메모리에 액세스하지 않으려는 경우 비트 맵의 ​​로컬 사본을 얻었는지 확인하십시오. 비트 맵 터 레인이 완전히 랜덤하다고 가정합니다 (파괴 가능한 웜 터 레인에 따라). 당신의 세계가 타일 기반이라면 당신이 알고있는 모든 타일을 건너 뛸 수 있지만, 앞서 언급했듯이, 확인해야 할 미사일이 너무 많지 않으면 너무 느린 플랫폼을 생각할 수 없었습니다. 픽셀 단위로 테스트하기 만하면 프리미티브에 월드를 정의 할 필요가 없습니다 (웜 클론이 까다로울 수 있습니다)


그래, 나는 벌레 같은 지형을 생각하고 있었다. 타일을 동적으로 타일로 나눈 다음 빈 타일을 확인 표시하지 않도록 표시 할 수 있습니까? 한 번에 많은 미사일이 있다면 아마도 속도가 약간 빨라질까요?
Iain

그래서 뒤로 건너 뛰기보다는 교차로를 확인하면서 픽셀 단위로 앞으로 이동해야한다고 생각합니까?
Iain

세 가지 답변 모두 정방향 검색을 제안한 것 같습니다. 앞으로 단계를 수행하여 일부 풍경을 건너 뛰면 뒤로 확인이 작동하지 않습니다.
JasonD

예, 확실히 전달합니다.
Kaj

1

다른 답변 외에도 "알려진 유사한 상태"블록으로 많은 픽셀을 "수집"하는 것과 관련하여 약간의 부기를 유지하려는 경우 속도를 높이기 위해 수행 할 수있는 작업이 있습니다. 예를 들어 가장 높은 지형 조각의 높이를 저장할 수 있으므로 미사일이 그 이상인 한 아무 것도 치지 않을 것입니다. 또한 가장 낮은 "공기"공간의 높이를 저장할 수 있으므로 미사일이 그 고도에 도달하면 무언가를 쳐야 만한다는 것을 알 수 있습니다. 이것보다 더 나아가서, 모든 지형 인 영역을 나타내는 사각형과 모든 공기 인 사각형을 저장할 수 있지만 값보다 더 효과적 일 수 있습니다.

궁극적으로 가장 좋은 방법은 아마도 "각 지형 기둥의 높이에서 저장"하고 경로의 각 단계에서 미사일 높이를 계산하는 것입니다. 나는 더 현대적인 게임에 대해 말할 수는 없지만, 당신이 Scorched Earth에서 "동굴"을 만들 때 동굴 위의 지형이 똑바로 떨어져서 돌출부를 남기지 않는다고 생각합니다. 돌출부를 원하면 작업이 약간 커지지 만이 기본 아이디어의 확장이 될 것입니다. (힌트 : 기본 아이디어가 먼저 작동하도록하십시오!)

지형은 완전히 임의적 일 수 있으므로 지름길이 없습니다. 지형을 스플라인 또는 무언가로 강요하더라도 지형을 파괴하기 시작하면 화를 내고 라인 스플라인 교차 테스트는 반복적이고 완벽하지 않거나 철저하고 철저하게 문제의 유형에 대해 속도가 느립니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.