Làm cách nào tôi có thể tạo lưới điều hướng cho lưới ô vuông?


18

Tôi chưa thực sự bắt đầu lập trình cho cái này bao giờ, nhưng tôi muốn xem làm thế nào tôi sẽ tiếp tục làm việc này.

Nói rằng tôi có một lưới gạch, tất cả có cùng kích thước, một số di chuyển ngang và một số không. Làm thế nào tôi có thể tạo ra một lưới điều hướng của đa giác từ lưới này?

Ý tưởng của tôi là lấy những viên gạch không thể di chuyển ra ngoài và mở rộng các đường từ các cạnh để tạo ra các đa giác ... đó là tất cả những gì tôi có cho đến nay. Có lời khuyên nào không?


2
Về mặt kỹ thuật, lưới tương đối giống với lưới điều hướng. Tôi nghi ngờ bạn thực sự đang yêu cầu một cách để tối ưu hóa lưới và kết hợp các ô vuông liền kề.
Kylotan

@Kylotan Vâng, đó chính xác là những gì tôi muốn nói, chỉ là một cách để kết hợp các đa giác liền kề.
Ross chào

Câu trả lời:


28

Đây là một trong những phương pháp tôi đã nghĩ ra khi thực hiện navmesh cho một trò chơi RTS. Lưu ý rằng đó là homebrew, không có công cụ của bên thứ ba nào được sử dụng, tôi mất khoảng 3 tuần để thực hiện và sửa lỗi:

  1. Sử dụng thuật toán Marching Squares để chuyển đổi các chướng ngại vật thành các đường viền . Lưu ý rằng các cạnh bản đồ cũng là một phác thảo và cũng cần được đưa vào.
  2. Giảm số lượng điểm trong phác thảo bằng thuật toán Douglas-Peucker (đường màu tím ở hình dưới)
  3. Đưa tất cả các điểm vào tam giác Delaunay (để có được các tam giác đồng đều nhất)
  4. Thêm các điểm bổ sung trong các khu vực trống và dọc theo các cạnh của bản đồ (để có thêm hải quân)
  5. Kiểm tra các phác thảo chướng ngại vật và đa giác lật do Delaunay sản xuất để khớp với các phác thảo. - Thường thì Delaunay có thể đặt các hình tam giác (màu xám) không khớp với đường viền của bạn (màu đỏ), sau đó bạn cần phát hiện và lật chúng. Liền chúng trở lại thành một đa giác, chia nó dọc theo (các) phác thảo và sắp xếp nó theo cách thủ công nhập mô tả hình ảnh ở đây
  6. Clip các chướng ngại vật bên trong - loại bỏ các đa giác nằm trong chướng ngại vật (màu hồng trên hình trên)
  7. Điền dữ liệu kết nối giữa các tam giác và đỉnh còn lại khi bạn cần - đó là điều hướng của bạn.

Kết quả:

tilemap navmesh


1

Lưới thường được thực hiện dưới dạng biểu đồ. Nếu bạn muốn triển khai tìm đường trong bản đồ dựa trên lưới, hãy làm như sau:

Tạo một biểu đồ trong đó mỗi hình vuông có thể đi qua được biểu diễn dưới dạng một đỉnh. Mỗi cặp hình vuông di chuyển liền kề được biểu diễn dưới dạng các đỉnh, sẽ có một cạnh giữa chúng. Và bạn đã hoàn thành.


1
Đây không phải là cách điều hướng thường được thực hiện. Mục đích của một navmesh (và, tôi tưởng tượng, lý do người hỏi thậm chí hỏi câu hỏi của họ ở đây) là để tối ưu hóa biểu đồ xuống số lượng đa giác cần thiết tối thiểu (thường là hình tam giác) trải rộng các không gian hữu ích nhất để giảm cả số lượng các bước cần thiết để tìm đường dẫn tốt và dấu chân bộ nhớ cần thiết để xác định lưới. Một triển khai thô sẽ vừa ăn nhiều bộ nhớ, vừa lãng phí thời gian xử lý AI có giá trị.
Gurgadurgen

Bạn nói đúng. Tất nhiên decimation (giảm đa giác) là một tối ưu hóa hợp lý và mong muốn. Chỉ là khi bạn đọc câu hỏi của op, bạn sẽ có cảm giác anh ấy chỉ muốn biến một lưới thành một biểu đồ.
só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.