Làm cách nào tôi có thể tạo lưới điều hướng 2d trong môi trường động khi chạy?


9

Vì vậy, tôi đã nắm được cách sử dụng A * để tìm đường và tôi có thể sử dụng nó trên lưới. Tuy nhiên, thế giới trò chơi của tôi rất lớn và tôi có nhiều kẻ thù di chuyển về phía người chơi, đó là một mục tiêu di chuyển, vì vậy một hệ thống lưới quá chậm để tìm đường. Tôi cần đơn giản hóa biểu đồ nút của mình bằng cách sử dụng lưới điều hướng.

Tôi nắm được khái niệm "cách" lưới hoạt động (tìm đường đi qua các nút trên các đỉnh và / hoặc tâm của các cạnh của đa giác).

Trò chơi của tôi sử dụng các chướng ngại vật động được tạo theo thủ tục vào thời gian chạy.

Tôi hoàn toàn không thể quấn đầu xung quanh cách đi máy bay có nhiều chướng ngại vật trong đó và lập trình phân chia khu vực có thể đi bộ thành đa giác cho lưới điều hướng, như hình ảnh sau đây.

lưới điều hướng

Tôi bắt đầu từ đâu? Làm cách nào để biết khi nào một phân đoạn của khu vực có thể đi bộ đã được xác định hoặc tệ hơn, khi tôi nhận ra mình cần chia nhỏ một khu vực có thể đi bộ được xác định trước đó khi thuật toán "đi bộ" qua bản đồ?

Tôi đang sử dụng javascript trong nodejs, nếu nó quan trọng.


1
Phân vùng động mà bạn đang cố thực hiện sẽ phụ thuộc vào chi tiết cụ thể của các yếu tố bản đồ của bạn. Các phần tử chướng ngại vật của bạn hoàn toàn bao gồm các hình chữ nhật được căn chỉnh lưới như trong ví dụ của bạn? Hình chữ nhật xoay? Đa giác không đều? Hoặc hình dạng không đa giác với nhiều đường cong? Bạn có dữ liệu điểm / poly cho hình dạng của chướng ngại vật không? Nếu đó là dữ liệu hình dạng theo hình tam giác, hình chữ nhật, đa giác lồi độc quyền hoặc hỗn hợp đa giác lồi và đa giác lõm?
Matthew R

@Matthew Thế giới của tôi bao gồm các chướng ngại vật đa giác lồi, không có đường cong và không có đa giác lõm. Mỗi chướng ngại vật được lưu trữ dưới dạng một đối tượng đa giác với các đỉnh được biểu thị bằng các đối tượng vector.
Stephen

1
Để biết giá trị của nó, tôi đang nghiên cứu một giải pháp dựa trên bài báo này: gradworks.umi.com/3493710.pdf Nếu tôi thành công, tôi sẽ đăng giải pháp của mình.
Stephen

1
lưới điều hướng không có 100% cho bạn biết bạn có thể đi đâu đó hay không, đó chỉ là một phác thảo cơ bản về các khu vực có thể đi bộ, bạn vẫn phải kiểm tra va chạm với các vật thể động, chỉnh sửa: khá nhiều những gì Ray nói
dreta

@Stephen - Xem Dài Bình luận câu trả lời.
Matthew R

Câu trả lời:


3

@Stephen - Nhận xét dài - Bài báo đó có vẻ đáng để đọc khi tôi có thời gian. Về cơ bản những gì tôi có thể đề xuất là một cái gì đó dọc theo dòng của Thuật toán Hertel-Mehlhorn được đề cập trong bài báo (một tài liệu tham khảo cho thuật toán cụ thể này có thể được tìm thấy ở đây http://www.bringyou.to/compgeom/ ) với phần bổ sung chia nhỏ các mặt bản đồ (ranh giới bên ngoài của khu vực chơi) một số thời gian để giảm sự xuất hiện của nhiều hình tam giác nhỏ được hình thành ở các góc. Những hình tam giác nhỏ đó có thể có vấn đề vì cuối cùng chúng có thể nhỏ hơn vật mà bạn đang tìm kiếm trước. Hertel-Mehlhorn là để giảm các đa giác được tạo ra bởi một phân vùng hình tam giác nếu bạn quan tâm ở đây nhiều hơn về tam giác:http://www.personal.kent.edu/~rmuhamma/Compgeometry/MyCG/PolyPart/polyPartition.htmlm .

Ngoài ra, nếu bạn không muốn phát minh lại bánh xe, tôi nghĩ rằng thư viện này thực sự sẽ làm mọi thứ bạn cần: http://code.google.com.vn/p/polypartition/ . Nó tạo ra các hình tam giác và giảm với một trong số các tùy chọn khác nhau bao gồm Hertel-Mehlhorn. Đó là Giấy phép MIT, có nghĩa là nó có thể được sử dụng cho các dự án thương mại và nguồn đóng nếu đó là một vấn đề.

Nếu bạn quyết định tiếp tục thực hiện theo cách riêng của mình, tôi rất muốn xem những gì bạn nghĩ ra.


1
Câu trả lời tuyệt vời, @Mathew. Và bạn chắc chắn nên đọc bài báo đó! Thật dễ dàng để làm theo và giải thích một kỹ thuật tuyệt vời (đặc biệt là Phụ lục A nói về phát hiện / tạo lưới dựa trên tác nhân). Tôi đang mã hóa một phiên bản của thuật toán này cho javascript và nó cũng xuất hiện rất tốt. Tôi sẽ đăng nó như một câu trả lời khi nó được thực hiện.
Stephen

@Stephen rất thích xem tác phẩm này
kevzettler

@Stephen Tôi cũng đang tìm phiên bản javascript
Apolo

6

Thay vì một lưới, bạn có thể chỉ cần xem xét một cách tiếp cận A * phân cấp. Ưu điểm lớn nhất của lưới là đối phó với các thế giới trò chơi không liên kết lưới, thay vì giảm độ phức tạp từ lưới.

Với cách tiếp cận phân cấp, bạn chia nhỏ thế giới của mình nhiều lần (giống như cây tứ giác) và tạo thông tin kết nối giữa các nút. Sau đó, bạn có thể nhanh chóng tạo một đường dẫn giữa các khối lớn của thế giới và chỉ sử dụng lưới có độ phân giải cao để tìm đường trong một khối lớn hơn.

Cách tiếp cận phân cấp sẽ cho các đơn đặt hàng có hiệu suất tốt hơn, trong khi một lưới tốt nhất sẽ chỉ mang lại cho bạn một cải tiến tuyến tính nhỏ.

Cách tiếp cận ngây thơ là chỉ chia thế giới của bạn thành X theo X các khối được căn chỉnh lưới lớn hơn, tạo thông tin kết nối giữa chúng (ví dụ: có một đường dẫn giữa chunk 2x1 từ 3x1 đến 2x2 và khoảng cách của đường trung bình là bao nhiêu) .

Lưu ý rằng không phải lúc nào bạn cũng có được đường dẫn lý tưởng với phương pháp này trong một số trường hợp cụ thể. Tạo ra các lớp khối có kích thước thay đổi làm giảm bớt vấn đề, nhưng thành thật mà nói, việc tránh các đường dẫn vấn đề trở nên dễ dàng hơn và dựa vào thực tế là người chơi rất khó nhận thấy bất kỳ kẻ thù nào đi theo con đường tối ưu ngoại trừ trong thoái hóa nhất của các trường hợp.


1
Tôi nên giải thích thêm: Trò chơi của tôi không được căn chỉnh lưới. Tôi đang xây dựng một lưới trong một khu vực 800 x 600 pixel, mỗi pixel là một khoảng trống trên lưới (tôi vẫn đang tìm ra A *, vì vậy tôi chưa nghĩ về hiệu suất của việc này). Tôi có những trở ngại không đơn giản như những gì trong hình ảnh ví dụ trên, tôi chỉ cố gắng minh họa vấn đề. Rõ ràng một sân chơi như vậy cần phải được sửa đổi, và sau một số nghiên cứu tôi nghĩ rằng một lưới điều hướng sẽ là con đường đúng đắn.
Stephen

3

Tôi nghĩ rằng bạn có thể đang quá phức tạp này. Bạn có thể không cần phải tạo lưới điều hướng khi đang di chuyển. Thay vào đó có một lưới điều hướng tĩnh cho thế giới cơ sở của bạn.

Đi vòng quanh chướng ngại vật có thể được giải quyết bằng cách sử dụng các hành vi lái (sử dụng tránh chướng ngại vật). Nếu trên cơ hội, chướng ngại vật của bạn quá lớn, nó sẽ lấp đầy hoặc chặn hoàn toàn việc di chuyển từ một nav-poly sang kế tiếp, thì có một số cách để kiểm tra trường hợp cạnh này và tính toán lại đường đi giữa poly mà bạn hiện đang ở và một bạn bị chặn khỏi.

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.