고르지 않은 행성 표면에서의 길 찾기


16

내 질문은 고르지 않은 행성 표면에서 길을 찾는 가장 좋은 방법은 무엇입니까?


배경 정보

6 개의 구면 투영 된 변위 매핑에서 행성을 만들었습니다. 평면은 구형으로 투영되기 전에 큐브를 처음 형성했다.

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

각 "구면 투사 큐브면"을 그리드로 사용하고 간단한 A * 알고리즘을 사용하여 가능한 가장 좋은 경로를 찾을 수 있는지 궁금합니다. 변위 높이도 고려하여 경로가 오르지 않도록하십시오. 산 등 (A * 알고리즘 내에서 이것은 휴리스틱 일 것입니다.) 또 다른 고려 사항은 Unity3d의 물리 엔진을 활용하여 행성 중심을 향해 중력을 적용하여 행성 운동 을 달성했다는 것 입니다. 내가 제안한 솔루션에서 중력 물리에 독립적으로 에이전트 이동을 제어해야합니까?

내 질문을 더 잘 표현할 수 있도록 현재 행성계는 다음과 같습니다.

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


2
Planet Annihilation 의이 비디오에 관심 있을 것 입니다. 그것들은 당신이 세상을 큐브와 그 주변에서 발견하는 것과 똑같은 일을하는 것처럼 보입니다. 그것은 실제로 답은 아니지만, 구에서 주변의 경로 찾기를 최적화하기위한 다른 전략과 함께 A *를 사용하고 있음을 알 수 있습니다. 경로 찾기 비트는 24:30에 시작합니다 .
MichaelHouse

@ Byte56이 링크는 정말 흥미로운 원가 계산 접근법 덕분에 게임이 끝날 때까지 기다릴 수 없습니다!
Caius Eugene

답변:


12

이미 본인의 질문에 답변 한 것 같습니다. A *가 최선의 방법 일 것입니다. 물론 산을 피하기 위해 높이 정보 사용을 포함하여 설명하는 방식으로 사용할 수 있습니다. 세계 표면의 그리드에 대한 정보에 액세스 할 수있는 한 A * 휴리스틱에서 사용할 수없는 이유는 없습니다.

마지막으로, 질문 끝에 경로 찾기와 경로 찾기를 혼동합니다. 경로 발견은 휴리스틱으로 추가하지 않는 한 중력에 관심이 없으며 행성 표면에 있으므로 중력은 본질적으로 전체 표면에서 동일합니다. 많은 게임이 운동과 함께 중력을 가지고 있습니다.

기본적으로 우리는 빨강에서 파랑으로가는지도를 만들고, 구체와 동일하게 정육면체와 같습니다.

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

A *는 종종 현재 노드에 인접 노드를 가져 오므로 인접 노드를 가져 오기위한 함수 세트를 쉽게 작성할 수 있습니다. 예를 들어, getXPlus(), getXMinus(), getZPlus()과에 이렇게. 이 함수는 현재 노드를 가져와 함수 이름으로 지정된 방향으로 노드를 반환합니다.

대부분의 경우 이러한 기능은 값을 증가시키고 가장자리에서 변경 될 수 있습니다.

큐브 표면을 2D 좌표계에 매핑하려고합니다. 그러나 이것은 당신에게 달려 있습니다. 그들은 정렬 할 필요가 없으며 각 그리드 공간에 고유 한 X, Y 좌표를 부여하십시오.

이제 가장자리에있을 때 인접한 그리드 공간을 얻는 것이 반드시 좌표를 증가시키는 것은 아닙니다. 우리는 우리가 움직 인 얼굴을 찾아 그 얼굴의 좌표로 전환해야합니다.

예를 들어 XPlus 좌표를 여기에 가져 오면 새면의 새 그리드 공간으로 이동하기 때문에 X와 Y 좌표가 모두 변경됩니다. 녹색 선은 두면 사이의 모서리를 나타냅니다.

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

이제 이것들은 전역 좌표 일뿐입니다. 현재 사용중인 큐브면을 나타내는 3 차원의 내부 로컬 좌표계를 사용하는 것이 더 쉬울 수 있습니다.

어느 쪽이든, 큐브면의 각 그리드 공간에 대해 고유 한 좌표가 있어야합니다. 그들 사이를 순회하는 것은 좌표계를 구현하는 방법에 달려 있습니다. 좌표가 구의 표면에 매핑되는 위치를 알아야합니다.

이 모든 것을 결국 추상화하여 알지 못하도록해야합니다.


응답을 응원합니다. 나는 어려움을 겪고있는 것은 각 비행기가 고립 된 그리드라는 것입니다. 이음새를 처리하는 방법에 대한 제안 (또는 추가 독서)이 있으시면 수학적으로 내 "큐브"를 펼치고 모든 그리드를 결합하고 해당 데이터 세트를 사용하여 경로를 계산해야한다고 생각합니다.
Caius Eugene

실제로 그것은 당신이 걱정해야 할 가장자리 일뿐입니다. 그것은 래퍼 함수 (당신의 세계를 감싸는 래퍼 함수로 큐브를 감싸는 것)에 의해 쉽게 해결됩니다. 큐브를 평평한 표면으로 감싸서 포장 할 수 있습니다. 인접한 그리드 공간을 얻기위한 함수를 작성하십시오. getXPlus ()는 그리드를 XPlus 방향으로 가져옵니다.면 사이의 경계에 있는지 여부는 중요하지 않습니다. 함수는면을 전환하고 적절한 그리드 정보를 리턴합니다.
MichaelHouse

접힌 큐브에서 경로를 찾는 데있어 부정확 한 점은 꼭짓점이 비뚤어져 가장자리의 길이가 다르다는 것입니다. 결과 경로에서 눈에 띄는 차이를 만들지 않을 수 있으며 그렇지 않으면 단순히 길이를 고려할 수 있습니다.
danijar

1
여기서 이해해야 할 중요한 점은 A *가 평면에서 반드시 작동 할 필요는 없다는 것입니다. 그래프에서 작동합니다. 각 큐브면 내에서 노드가 그리드로 배열되고 연결되어 있지만 큐브 가장자리를 가로 지르는 노드 연결도 있습니다.
jmegaffin

1
@ Byte56 큰 답변에 감사드립니다. 솔루션을 암시하기 시작했지만 약간의 장애물에 부딪 쳤습니다. 어쩌면 내가 오해했을 수도 있습니다. 나는 그것의 수학 개 / 프로그래밍 문제 느꼈다 I에 유래에 걸쳐 질문을 게시 한 stackoverflow.com/questions/16089074/...
카이 우스 유진
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.