Tìm đường trên bề mặt hành tinh không bằng phẳng


16

Câu hỏi của tôi là cách tiếp cận tốt nhất để tìm đường trên bề mặt hành tinh không bằng phẳng là gì?


Thông tin lai lịch

Tôi đã tạo ra một hành tinh từ bản đồ chuyển vị 6 mặt phẳng chiếu. Các mặt phẳng ban đầu tạo thành một khối lập phương trước khi được chiếu thành hình cầu.

nhập mô tả hình ảnh ở đây

Tôi tự hỏi liệu có thể sử dụng từng "mặt khối lập phương hình cầu" làm lưới và sử dụng thuật toán A * đơn giản để tìm tuyến đường tốt nhất có thể không, tôi cũng muốn tính đến chiều cao dịch chuyển để đường đi tránh leo núi v.v. (Tôi đoán đây chỉ là một heuristic trong thuật toán A *) Một điều đáng cân nhắc nữa là tôi đã đạt được chuyển động hành tinh bằng cách tận dụng động cơ vật lý của Unity3d, áp dụng lực hấp dẫn vào trung tâm hành tinh. Giải pháp đề xuất của tôi sẽ yêu cầu chuyển động của các tác nhân được kiểm soát độc lập với vật lý hấp dẫn.

Để giúp nói rõ hơn câu hỏi của tôi, đây là cơ thể hành tinh hiện tại của tôi:

nhập mô tả hình ảnh ở đây


2
Bạn có thể quan tâm đến video này từ Sự hủy diệt hành tinh. Chúng dường như đang làm giống như bạn bao bọc thế giới từ một khối lập phương và tìm đường xung quanh nó. Đây thực sự không phải là một câu trả lời, nhưng bạn có thể thấy rằng họ đang sử dụng A * cùng với một số chiến lược khác để tối ưu hóa việc tìm đường trên một quả cầu. Đường dẫn tìm bit bắt đầu lúc 24:30 .
MichaelHouse

@ Byte56 Cảm ơn vì liên kết này thực sự thú vị về chi phí, không thể chờ đợi để xem trò chơi đó khi nó kết thúc!
Caius Eugene

Câu trả lời:


12

Có vẻ như bạn đã trả lời câu hỏi của riêng bạn. A * có khả năng là cách tiếp cận tốt nhất. Có tất nhiên nó có thể được sử dụng theo cách bạn mô tả, bao gồm cả việc sử dụng thông tin chiều cao để tránh núi. Miễn là bạn có thể truy cập thông tin về bất kỳ lưới nào trên bề mặt thế giới của bạn, không có lý do gì bạn không thể sử dụng nó trong A * heuristic.

Cuối cùng, bạn đang nhầm lẫn tìm đường dẫn với đường dẫn ở cuối câu hỏi của bạn. Phát hiện đường dẫn không quan tâm đến trọng lực, trừ khi bạn thêm nó dưới dạng heuristic và vì bạn đang ở trên bề mặt của một hành tinh, trọng lực về cơ bản sẽ giống nhau trên toàn bộ bề mặt. Nhiều trò chơi có lực hấp dẫn cùng với chuyển động, tôi thấy không có lý do gì bạn không thể.

Về cơ bản, chúng tôi muốn ánh xạ chuyển từ màu đỏ sang màu xanh, giống nhau trên một hình cầu giống như trên một khối lập phương.

nhập mô tả hình ảnh ở đây

Vì A * thường xuyên nhận được hàng xóm vào nút hiện tại của nó, bạn có thể dễ dàng tạo một tập hợp các hàm để nhận các nút liền kề. Ví dụ, getXPlus(), getXMinus(), getZPlus()và vân vân. Các hàm này sẽ lấy nút hiện tại và trả về nút theo hướng được chỉ định bởi tên hàm.

Hầu hết thời gian các chức năng này chỉ có thể tăng một giá trị và được thực hiện, tuy nhiên, trên các cạnh, điều đó sẽ thay đổi.

Bạn sẽ muốn ánh xạ bề mặt của khối lập phương của mình sang hệ tọa độ 2D. Tuy nhiên, bạn làm điều này tùy thuộc vào bạn, họ không phải xếp hàng, chỉ cần cung cấp cho mỗi không gian lưới một tọa độ X, Y duy nhất.

Bây giờ khi ở trên một cạnh và có được không gian lưới liền kề, không nhất thiết chỉ là tăng tọa độ. Chúng ta phải tìm ra khuôn mặt nào chúng ta đang di chuyển và chuyển sang tọa độ của khuôn mặt đó.

Ví dụ: lấy tọa độ XPlus ở đây sẽ thay đổi cả tọa độ X và Y vì chúng ta đang chuyển sang một không gian lưới mới trên một mặt mới. Đường màu xanh biểu thị một cạnh giữa hai mặt.

nhập mô tả hình ảnh ở đây

Bây giờ đây chỉ là tọa độ toàn cầu, có thể dễ dàng hơn khi sử dụng hệ thống tọa độ cục bộ bên trong, với chiều thứ 3 đại diện cho mặt khối mà bạn hiện đang sử dụng.

Dù bằng cách nào, bạn cần có một tọa độ duy nhất cho mỗi không gian lưới trên mặt của khối lập phương. Chuyển đổi giữa chúng sẽ phụ thuộc vào cách bạn triển khai hệ tọa độ. Bạn cần biết nơi phối hợp các bản đồ với bề mặt của hình cầu.

Tất cả điều này cuối cùng nên được trừu tượng hóa để bạn thậm chí không biết về nó.


Chúc mừng cho các phản ứng. Tôi nghĩ những gì tôi đang vật lộn với mỗi mặt phẳng là một lưới bị cô lập. Bạn có gợi ý nào (hoặc đọc thêm) về cách xử lý các đường nối không, tôi đoán tôi sẽ mở ra toán học cho "khối lập phương" của mình, kết hợp tất cả các lưới và tính toán đường đi bằng cách sử dụng bộ dữ liệu đó?
Caius Eugene

Thực sự đó chỉ là các cạnh bạn cần phải lo lắng. Điều đó dễ dàng được giải quyết bằng chức năng bao bọc (bọc khối của bạn trong chức năng bao bọc, bao bọc thế giới của bạn ...). Bạn có thể trừu tượng khối lập phương thành một bề mặt phẳng mà kết thúc tốt đẹp. Tạo các hàm để có được không gian lưới liền kề, getXPlus () sẽ lấy lưới theo hướng XPlus, không quan trọng nếu nó nằm trên ranh giới giữa các mặt, hàm sẽ chỉ chuyển mặt và trả về thông tin lưới thích hợp.
MichaelHouse

Sự không chính xác duy nhất với tìm đường đi trên khối gấp là các đỉnh bị lệch và do đó các cạnh có độ dài khác nhau. Có thể nó sẽ không tạo ra sự khác biệt đáng chú ý trong các đường dẫn kết quả và nếu không, bạn chỉ cần tính đến độ dài.
danijar

1
Điều quan trọng cần hiểu ở đây là A * không nhất thiết phải hoạt động trên máy bay; nó hoạt động trên một biểu đồ. Mặc dù trong mỗi mặt khối, các nút được sắp xếp và kết nối trong một lưới, nhưng cũng có các kết nối nút trên các cạnh của khối.
jmegaffin

1
@ Byte56 Cảm ơn câu trả lời tuyệt vời, tôi đã bắt đầu thực hiện một giải pháp tuy nhiên tôi đã gặp một chút trở ngại. Có lẽ tôi đã hiểu lầm. Tôi đã đăng một câu hỏi tại stackoverflow vì tôi cảm thấy nhiều hơn về vấn đề toán học / lập trình stackoverflow.com/questions/16089074/
trộm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.