최대로 대상에 대한 총알 경로를 계산하기위한 알고리즘 리코 2 개


21

불쌍한 제목으로 인해 죄송하지만 문구를 더 잘 표현할 수있는 방법이 없었습니다 ...

그래서 거기에 닌텐도에 WiiPlay라고합니다 (예!) 닌텐도에 의해이 놀라운 게임 . 여기에는 9 개의 미니 게임이 있으며 내가 가장 좋아하는 게임은 탱크입니다! . 자신을 파괴하지 않고 COM 적 탱크를 파괴하는 것입니다. 레벨의 스크린 샷은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

탱크를 파괴하는 한 가지 방법은 총알을 발사하는 것입니다. 이 라임 그린 적 탱크가 있으며 벽과 블록에 두 번 튀어 나오는 고속 총알을 발사합니다. 중앙의 석회 탱크가 이미지에 그려진 녹색 경로를 따라 총알을 발사 할 수 있으므로 플레이어 탱크가 현재 위치에 있으면 플레이어 탱크가 즉시 파괴되는 방법을 알 수 있습니다.

아마추어 프로그래머로서 저는 라임 탱크가 플레이어 탱크를 때리는 방향을 어떻게 결정할 수 있는지 궁금합니다.

나는 그것에 대해 스스로 생각했지만 가능한 알고리즘을 찾지 못했습니다. 그들이 누군가에게 영감을 주었을 때의 결론을 설명하겠습니다. 설명하는 동안 간단하게하기 위해 은 총알이 튀어 나올있는 표면 이라고 가정합니다 . 따라서 블록의 분리 된 사각형은 4 개의 벽을 형성합니다.

총알 리 코팅이 항상 평행 사변형의 한면에 놓여 있거나 평행 사변형의 반대 정점이된다는 결론을 내 렸습니다. 발사하는 적 탱크와 그것이 목표로하는 플레이어 탱크는 반드시 다른 2 개의 정점 일 필요는 없지만, 평행 사변형의 4면 중 어느 하나에 대해 동일 선상에 놓여 있습니다. 다음은 평행 사변형을 형성 할 수있는 4 가지 방법을 보여줍니다.

여기에 이미지 설명을 입력하십시오

HOR-VER 은 총알이 먼저 수평 벽에 닿은 다음 수직 벽에 닿는 것을 의미합니다.

그리고 나는 붙어있다. 적 탱크와 플레이어 탱크를 연결하는 선을 움직여 벽에 두 번의 히트로 평행 사변형을 형성하는지 확인했지만 적 탱크와 플레이어 탱크가 그렇지 않기 때문에 항상 작동하지는 않습니다. 평행 사변형의 꼭짓점과 일치해야합니다.

또한 알고리즘의 일반적인 흐름을 잘 모르겠습니다. 알고리즘은 다음 두 가지 구조 중 하나를 사용합니까, 아니면 두 가지 모두 잘못되었을 수 있습니까?

  • 가능한 경로를 파악하고 항상 최선의 경로로 표시하고 (여러 기준에 따라 가장 짧거나 가장 모호하며, 피할 수없는, 또는 종합적이고 가중 된 평가 일 수 있음) 나머지는 잊어 버리십시오. 모든 계산 후 남은 것이 가장 좋습니다.
  • 먼저 총알로 도달 할 수있는 모든 벽을 확인한 다음 (각 벽에 도달하기 위해 총알이 다른 벽에 튀어 나올 필요는 없음) 각 벽에 도달 할 수있는 모든 범위를 결정합니다 (때로는 원거리에 도달 할 수 없음) 다른 벽이 근처에 있으면 리코 치가없는 벽), 다시 리코 치가있는 모든 도달 가능한 벽과이 벽에서 도달 할 수있는 모든 범위를 결정합니다. 이 4 가지 프로세스는 광선 추적과 유사한 방식으로 수행 할 수 있습니다. 각 과정에서 플레이어 탱크에 광선이 닿으면 광선에 따라 총알 경로를 알아냅니다.

제 생각에는이 알고리즘은 다음과 같은 이유로 알아 내기가 어렵습니다.

  • 총알은 어떤 방향으로도 발사 될 수 있습니다. 과
  • 수학에서와 같이 벽에 무한히 많은 점이 있으며, 선에는 무한히 많은 점이 있습니다.

그러나 닌텐도 사람들은 어쨌든 그것을 만들었습니다.


확인하기 위해, 닌텐도가 실제로 어떻게했는지가 아니라 어떻게 할 수 있는지 묻고 있습니다.
Ixrec

@lxrec 당신이 옳 습니다 . 그들이하는 방식이 아니라 가능한 방법에 관심 이 있습니다 .
안녕하세요 모든

게임은 해결책을 찾을 필요가 없습니다. 당신이 발사 버튼을 누르면, 게임은 이미 당신이 직면하고있는 당신의 위치와 방향을 알고 그 정보를 사용합니다. 그것은 궤도를 추적하고 경로에서 적의 탱크를 발견하면 그렇지 않으면 안됩니다.
Mandrill

2
"무한"많은 각도가 있지만 몇 개의 등가 클래스로 쉽게 줄일 수 있습니다. Nicky Case의 Sight and Light 는 다각형간에 그림자를 렌더링하는 멋진 데모입니다. 이는 광선이 아닌 총알 경로를 사용하고 광선이 두 번 반사 될 수 있다는 점을 제외하고는 정확히 문제입니다. 반사는 AI에 중요하지 않습니다. 반사는 단순히 가시선을 확장하지만 동일한 물체가 여러 각도에서 보일 수 있음을 의미합니다.
amon

@Mandrill 나는 당신이 내 질문을 얻지 못해서 두렵습니다. 적 탱크가 플레이어 탱크를 치는 총알 경로를 어떻게 만들 수 있는지 묻고있었습니다.
안녕하세요 모든

답변:


9

직접적인 시선이 주어지면 문제는 분명 사소합니다. 그러나 우리는 반성을 다루고 있습니다. 광선 추적 프로그램의 일부로 반사를 구현할 때 장면의 어느 부분을 볼 수 있는지 올바르게 찾아내는 것은 어려운 일입니다. 두 가지 유망한 각도 사이의 "이진 검색"도 실행 가능하지 않습니다. 반사로 인해 실제로 보이는 공간이 연속적이지 않으므로 휴리스틱 "A의 오른쪽과 B의 왼쪽에 있으면 대상이 있어야합니다. A와 B 사이의 솔루션은 허용되지 않으며 "크리에이티브"솔루션을 놓치게됩니다. 대신 가상 위치에서 추적기를 다시 실행하여 반사를 구현하는 것이 좋습니다 . 미러에서 볼 때 발사 탱크가 보이는 위치입니다 .

target |obstacle
   X   |
    \  |  X real position
     \   /
      \ /
   ----------- mirror surface
        \
         \
          X virtual position

미러 된 광선은 이제 가상 위치에서 시작되는 직선이라는 이점이 있습니다. 다음 스케치에서 기술을 설명하려고했습니다.

모퉁이에서 촬영

X는 발사 위치, (X) 목표를 표시합니다. 컬러 영역이 보입니다.

  1. 직접 시선 : 대상이 보이지 않습니다. 그러나 표면 (1)과 (2)를 칠 수 있습니다.

  2. 한 번의 반사. 장애물 안에는 두 개의 가상 발사 위치가 있습니다. 아래쪽 위치는 LOS를 직접 향하게하므로 첫 번째 발사 솔루션이 있습니다. 총알 경로는 대상과 하부 미러 표면 사이, 광선-미러 충돌 지점과 실제 발사 위치 사이의 광선의 일부입니다.

  3. 두 번의 반사 : 첫 번째 반사에서 위쪽 가상 위치는 거울 표면을 통해 아래쪽 장애물의 일부를 볼 수 있습니다. 두 번의 반사가 허용되므로이 위치를 더 낮은 장애물로 미러링 할 수 있습니다. 위치는 (I) 실제 위치, (II) 첫 번째 반사의 가상 위치 및 (III) 두 번째 반사의 가상 위치로 표시됩니다.

    (III)부터 LOS를 목표 (X)로 향하게해서 또 다른 발사 솔루션을 찾았습니다. 불릿 경로는 X-III 선을 따라 두 번째 미러 충돌 지점까지, 그 다음 미러 충돌 지점 사이의 III-II 라인을 따라, 마지막으로 II-I 라인을 따라 첫 번째 미러 충돌 지점에서 실제 위치 I까지입니다.

    실제로, 첫 번째 반사에서 낮은 가상 위치도 상부 장애물에 반영 될 수 있지만 이는 직접적인 해결책으로 이어지지는 않습니다.

장애물의 어느 부분이 보이는지 알아 내고 (따라서 총알을 반영하는 데 사용할 수 있음) 깊이 우선 검색을 통해 미러링을 구현하는 것이 간단 해 보입니다. 적합한 거울 표면을 찾기 위해 Nicky Case의 Sight & Light에 요약 된 기술을 사용할 수 있습니다. 개구부를 놓칠 수 있고 낭비 인 360 개의 벡터를 시험하는 대신 장애물 가장자리까지만 광선을 발사합니다.


나는 "장애물 가장자리에만 광선을 발사하는"작동 방식을 이해하지 못합니다. 벽 끝쪽으로 광선을 발사하고 해결책을 찾을 때까지 점차 안쪽으로 광선을 발사한다는 의미입니까? 그렇다면이 규칙을 통해 솔루션을 더 빨리 찾을 수 있음을 이해합니다.
안녕하세요 모든

몇 가지 고려를 한 후에, 나는 이것이 가장 좋은 것으로 표시된 수학적 답변과 함께 한 번의 반송 및 반송없는 솔루션을 직접 처리 할 수 ​​없기 때문에 이것이 최선의 대답이라고 생각합니다.
안녕하세요 모든

훌륭합니다! 게임을 너무 요구하지 않고 레벨의 미러 표현을 만드는 방법에 대한 조언이 있습니까?
retrovius

7

Karl Bielefeldt 아이디어를 2 개의 벽 반사로 확장하기 만하면됩니다.여기에 이미지 설명을 입력하십시오

A와 B가 제공됩니다 (탱크). 먼저 A가 볼 수있는 모든 벽과 B가 볼 수있는 모든 벽을 나열해야합니다. 그런 다음 첫 번째 벽이 주먹리스트에 있고 두 번째 벽이 첫 번째 벽과 다르고 두 번째 목록에있는 쌍을 만듭니다. 가능한 모든 벽 쌍에 대해이 테스트를 수행해야합니다 (후보자를 제거 할 방법을 찾지 않는 한). 주어진 벽 쌍에 대해 R과 S를 찾으면 확인하십시오.

1) A에 R의 직접적인 비전이있는 경우

2) R이 벽 1에 속하는 경우 (벽은 단지 선분이며 전체 선은 아님)

3) R이 S에 직접 액세스 할 수있는 경우

4) S가 wall2에 속하는 경우 (벽은 단지 선분이며 전체 선이 아님)

5) S가 B에 직접 액세스 할 수있는 경우

R과 S를 찾으려면 wall1을 알고 있기 때문에 wall1에 접하는 선 방정식을 결정할 수 있습니다. R은 wall 1에 접하는 선에 속하므로 R의 두 좌표 사이에 관계가 있습니다 (1의 자유 도로 끝남). R) S와 유사합니다 (이 점은 벽 2의 선 탠 제트에 속하므로 S 좌표간에 관계가 있습니다). 이제 자유도가 2이고 해를 구하려면 2 개의 추가 독립 방정식이 있어야합니다. 한 가지 방정식은 다음과 같습니다.

(AA')/(RA')=(SS')/(RS')

다른 방정식은 다음과 같습니다.

(BB')/(SB')=(RR')/(SR')

위의 방정식 A, A ', B, B'는 알고 있거나 직접 계산할 수 있습니다. R '및 S'는 R 및 S의 좌표 및 벽 방정식의 함수입니다. 나는 수학을 끝내지 않았으므로 방정식이 어떻게 보일지 모르겠습니다.


이것은 훌륭한 수학적 접근입니다. 그러나 알고리즘은 동시 방정식을 푸는 데 많은 계산 시간이 필요합니다. 거리와 관련된 제곱근과 지수가 많이 있습니다.
안녕하세요 모든

3

리 코팅을 떠나는 각도가 들어가는 각도와 같아야한다는 사실을 이용할 수 있습니다. y 좌표가있는 주어진 수평 벽과 좌표 c가있는 두 개의 고정 탱크 (a,b)(d,e)의 경우 아래 식을 만족하는 각도는 하나뿐입니다.

방정식의 다이어그램

그냥 해결 x당신이 목표로해야하는 벽을 따라 거리를 얻을 수 있습니다. 두 벽이 동일하게 작동합니다. 두 개의 방정식과 두 개의 미지수 만 있습니다.


1

광선을 지시하는 방법을 보여주는 깔끔한 다이어그램이 있으므로 한 쌍의 반사 표면을 결정하는 방법에 대해 자세히 설명하겠습니다.

하자 먼저 표면 명중해야 표면 전화 , 두 번째, B를 .

A 에서 촬영하여 B 의 (가시적) 가장자리를 치십시오 . 다시 말해, 거울 완성 A를 보면 B 끝이 반사되는 지점을 결정하십시오 . 이 작업은 쉬워야하며 처리 할 반사 지점이 하나뿐입니다.

이제 B 의 (가시적) 가장자리에 닿는 두 개의 광선을 알았습니다 . 하자 그들을 호출 가장자리 광선이 떨어져 자신의 반사를 계산 B; 그들은 당신의 목표를 넘어서 어딘가에 가야합니다. 대상이 대상 사이에 있는지 , 즉 한 광선의 왼쪽에 있지만 다른 광선의 오른쪽에 있는지 또는 그 반대 인지를 결정할 수 있습니다 . 이것은 직선일반 방정식을 사용하는 것이 쉽지 않습니다 .

대상이 가장자리 광선 사이에 있지 않으면 분명히 중간 광선으로 칠 수 없습니다. 다른 표면 쌍을 선택하십시오.

대상 광선 사이에 있으면 이진 검색을 사용하여 중간 타격 광선을 찾으십시오. 모서리 광선에 해당하는 두 개의 발사 각도가 있으며 타격 각도는 그 사이에 있습니다. 발사 지점에서 볼 때 목표의 각도 직경이 지나치게 작지 않은 경우, 타격 광선의 방향을 찾을 때까지 반복이 거의 필요하지 않습니다.

사진은 다음과 같습니다.

광선

여기에 두 개의 가장자리 광선이 빨간색과 파란색으로 표시됩니다. 분명히 당신은 광선이 녹색 목표물에 부딪 칠 수 있도록 적색 광선보다 작은 각도에서 방출되지만 적색 광선보다 큰 광선을 찾을 수 있습니다.


반드시 그런 것은 아닙니다! 빨간색과 파란색 총알 경로 사이에 추가 장애물이 있으면 다이어그램을 생각해보십시오. 빨간색과 파란색 각도 사이에서 직각으로 총알을 발사하면 플레이어 탱크에 더 가까이 다가 갈 수 있지만 일부 총알이 그 사이에있는 임의의 장애물을 뛰어 넘을 수 있으므로 완전히 놓칠 수 있습니다. 이 가능성에 대해 논의하는 @amon의 답변을 참조하십시오.
안녕하세요 모든

@amon의 답변을 올렸습니다. 나는 직선 미러링의 아이디어를 좋아한다. 또한 알고리즘 이이 간단한 방법으로 경로를 찾은 후 실제로 타격 경로가 통과 가능한지 확인해야한다고 가정합니다. 더 흥미로운 것은 대상이 부분적으로 막혀있을 가능성입니다 (두 개의 가시 영역으로 분리 될 수도 있음). Amon의 방법은 처리하기가 더 쉽습니다.
9000

-3

우선, 빛의 굴절에 대해 이야기 할 때 물리 수업에서 기억하십니까? 이러한 원칙을 사용하여 문제를 해결할 수 있습니다. 입사각은 반사각과 동일하다. 적 탱크는 첫 번째 바운스에서 가능한 모든 각도를 통과해야 두 번째 바운스가 플레이어를 때릴 수 있습니다. 광선 추적 아이디어도 계속 사용하십시오. 이제 플레이어가 움직일 때 복잡해 지지만 알고리즘을 시작하는 데 충분한 아이디어가되어야합니다.


1
나는 성찰의 원리를 이해한다. @amon의 의견에 대한 답장을 볼 수 있습니다. 플레이어의 움직임을 고려해야한다는 것이 맞습니다. 그러나 평가를 기반으로 여러 가능한 경로 중 하나를 선택하기위한 하나의 기준으로 남겨 둘 수 있다고 생각합니다. 그러나 이것은 총알 경로의 거리와 관련이 있기 때문에 무시할 수 있습니다. , 경로가 길수록 총알이 목적지에 도달하기 전에 플레이어가 더 많이 이동할 수 있습니다.
안녕하세요 모든
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.