Lập kế hoạch đường dẫn cho khối lượng trong trò chơi


7

Làm thế nào bạn có thể lên kế hoạch một khối lượng cho một trò chơi?

Ví dụ một khối lập phương 1 km với các đường hầm và hang động. Ngoài ra địa hình là phá hủy.

Bạn có chế độ đi bộ và bay.

Tôi sẽ tách nó thành các giai đoạn. Tạo một khối lượng của không gian mở. Tìm một con đường có tính đến sự phá hủy động.

Hiệu suất là một mối quan tâm lớn và khả năng tìm thấy các đường dẫn được sử dụng trong một thời gian ngắn.

Ví dụ cụ thể: Khai thác một cái gì đó sâu trong lòng đất một cách hiệu quả.

Mặt đất là có thể phá hủy. "Hang động" là khu vực dễ đào. Khai thác giống như bay. Cần xem với cảm biến. Bộ dữ liệu rất lớn. Cần xây dựng một tuyến đường vận chuyển đến mục tiêu. Có thể là đa tác nhân.


1
Có sương mù chiến tranh và nó có ảnh hưởng đến việc tìm đường không?
Sẽ

Có tầm nhìn mặc dù bạn có thể liên kết các cảm biến.
Cháy

Bạn đang làm việc về thiết kế cấp độ - thiết kế một cấp độ, thiết lập các đường hầm (ban đầu, bị hư hỏng trước) và hang động vài tuần trước khi trò chơi được chơi? Hay bạn đang làm việc trên đường dẫn - lập trình các tác nhân điều khiển máy tính để trong quá trình chơi trò chơi, chúng di chuyển "hợp lý", thay vì làm những việc ngu ngốc như đi vào tường, rơi xuống vách đá, v.v.?
David Cary

Không ai sẽ dành hàng tuần để thiết kế địa chất của khối lập phương 1 km. Câu hỏi không phải là về thủ tục tạo địa chất. Đó là về quy hoạch đường dẫn cho các đại lý trong một hang động trong nhà và hệ thống đường hầm. Điều này có nghĩa là không bị mất hoặc lật giữa các đường dẫn.
Cháy

Câu trả lời:


3

Tìm đường động, để được thực hiện hợp lý, đòi hỏi một thuật toán đặc biệt phù hợp với điều này, như D * (Dynamic A *).

Ngoài ra, bạn có thể tìm cách thực hiện tìm đường phân cấp. Bằng cách này, bạn có một đường dẫn đơn giản hơn ở độ phân giải thấp hơn và các đường dẫn con phức tạp hơn ở độ phân giải cao hơn. Bằng cách thay thế bất kỳ biểu đồ đường dẫn có độ phân giải cao hơn vào biểu đồ chính có độ phân giải thấp hơn, bạn có thể xây dựng đường dẫn của mình tới bất kỳ độ phân giải nào bạn muốn.

Tìm đường dẫn độ phân giải thấp hơn rõ ràng là rất tốt, vì bạn có thể thực hiện tìm đường dẫn tối thiểu cho đến khi bạn vào một tiểu vùng khác, và sau đó thực hiện tìm đường dẫn sâu hơn ở cấp độ phụ của khu vực đó.

Đối với thuật toán thực tế được sử dụng để thực hiện đường hầm xuyên qua không gian 3D của bạn, vấn đề tiềm năng lớn nhất mà bạn gặp phải là vấn đề này là vào các khu vực "ngõ cụt" 3D mà bạn không thể thoát ra mà không đi qua một đoạn khác (đoạn đồ thị). Xem độc thoại gần đây của tôi về nhúng đồ thị phẳng ở đây .


HPA * có phần hiệu quả hơn.
Cháy

Tôi đã điều tra các bản đồ đường xác suất khi chúng sử dụng trong các vấn đề điều hướng robot.
Cháy

2
Bạn cũng có thể sử dụng 'Lũ lụt' dựa trên Cellular Automaton để hạn chế hang động và đường hầm của bạn xuống một tập hợp không gian nhỏ hơn nhiều. Điều này có thể được chạy lại khi biến dạng của cảnh quan, trong nền nếu bản đồ của bạn đủ lớn để có độ trễ về điều này hoặc nếu biến dạng của bản đồ là một hằng số. (không giống như một cái gì đó như minecraft hoặc pháo đài lùn) Một khi bạn có con đường được thiết lập phụ này, bạn chỉ cần đường dẫn đến nó, sau đó dọc theo nó, sau đó từ nó. Lý tưởng là nếu tất cả các không gian mở có đường ngắm đến đường dẫn tập hợp con.
DampeS8N

1

Nếu theo địa hình có thể phá hủy, bạn có nghĩa là những thay đổi lớn đối với môi trường đa cấp khổng lồ, điều này sẽ khó khăn như địa ngục, đặc biệt là đối với các đơn vị đi bộ. Sẽ là khôn ngoan khi phân chia các đơn vị bay và đi bộ ngay từ đầu, vì vậy chúng sẽ có các biểu đồ riêng biệt.

Tôi không thể nói rằng tôi biết một giải pháp dứt khoát cho các đơn vị đi bộ. Tùy thuộc vào số lượng tác nhân, thay đổi địa hình tiềm năng và độ phân giải nút khối, bạn có thể hoặc không muốn sử dụng D *. Về bản chất, D * là một lực lượng vũ phu A *. Giống như Nick gợi ý, vũ phu buộc chỉ đi trước một bước có thể dẫn đến rất nhiều "ngõ cụt", vì nếu không có toàn bộ đường dẫn, bạn sẽ không thể biết ngay nút tiếp theo có đúng hay không. Ngoài ra, bạn sẽ phải suy nghĩ về bộ đệm đường dẫn và vô hiệu hóa một phần của nó, vì vậy bạn không cần phải vũ trang liên tục trên cơ sở mỗi tác nhân. Nhìn chung, nó sẽ không dễ dàng và có thể trở nên quá nặng CPU.

Thay vào đó, sử dụng A *, trường hợp đơn giản nhất là hạn chế phá hủy địa hình của bạn ở mức tối thiểu và tránh xa việc tìm đường phân cấp, như "A" thô "và một số hình thức tránh cục bộ. Tôi đoán đó không phải là một lựa chọn, vì vậy bạn có thể cố gắng chuyển đổi mặt đất và tường của khối lập phương thành lưới điều hướng và sau đó thay đổi từng phần. Tất nhiên, tính toán Navmesh không nhanh, nhưng có một căn phòng để tối ưu hóa khác nhau để tránh tính toán lại hoàn toàn lưới đã nói khi thay đổi địa hình. Ý tưởng chung là thực hiện cập nhật lưới cục bộ, do đó, chỉ các khu vực bị ảnh hưởng của lưới điều hướng sẽ được thay đổi khi phá hủy địa hình. Nó có thể được thực hiện bằng cách sử dụng sự thích ứng của việc xây dựng sơ đồ Voronoi, nhưng nó không phải là "khu vực được giải quyết". Sẽ không dễ dàng gì, vì bạn sẽ phải tăng tốc tính toán lại hải quân,

Đồ thị cho các đơn vị không khí là đơn giản hơn nhiều. Về cơ bản, bạn sẽ phải tìm tất cả "không gian trên không" và chuyển đổi nó thành biểu đồ. Vì hang động của bạn rất năng động, sự lựa chọn rõ ràng nhất là dựa vào biểu đồ này trên octree của khối lập phương. Sử dụng centroid lá octree (điểm ở giữa khối lá) làm cơ sở để tính toán các nút và lọc ra tất cả các centroid ở các vị trí rõ ràng không hợp lệ. Kiểm tra trọng tâm kết quả để loại bỏ tất cả những gì không thể tiếp cận từ hàng xóm của họ. Điều này sẽ rất nhanh, vì vậy mối quan tâm chính của bạn vẫn nằm trong khả năng tìm đường.


Cả hai chế độ bay và đi bộ đều có thể lấy mẫu từ hải quân. Sau đó, họ có thể tạo ra các đại diện của riêng họ. Tôi không biết làm thế nào để chuyển đổi giữa các chế độ.
Cháy

Trong bản đồ đường xác suất, một phương pháp là xây dựng sơ đồ voroni. Nhưng nó dựa vào mẫu của bạn bao gồm các không gian.
Cháy

1

Tôi có một triển khai mã nguồn mở của tìm đường trên lưới 3D như là một phần của SDK trò chơi voxel của tôi. Đây là một triển khai của thuật toán A * dành chính xác cho môi trường kiểu minecraft và địa hình voxel.

Đây không phải là một thuật toán động như những người khác đã đề xuất, vì vậy tôi không thể giúp bạn ở đó. Tôi đoán nó phụ thuộc vào thế giới năng động của bạn. Nó cũng có thể sử dụng một số cải tiến hiệu suất vì hiện tại có thể mất vài giây để tìm đường dẫn có thể dài 100 voxels, nhưng bạn có thể chạy nó trên một phiên bản lấy mẫu của âm lượng của bạn (thông qua việc cẩn thận trong quá trình lấy mẫu xuống là hợp lệ đường dẫn có thể được tạo / mất).

Bạn có thể thấy nó hoạt động tại đây http://www.youtube.com/watch?v=C8y0OzL0zpM (mặc dù đó không phải là trò chơi của tôi) và lấy nguồn từ http://www.thermite3d.org .


Tôi đặc biệt chỉ định 1 km được lập phương để loại trừ 100 thuật toán tìm đường voxel.
Cháy

... đại diện voxel thưa thớt mặc dù có thể làm việc ở quy mô đó? ;)
Sẽ

Voxels thưa thớt có nghĩa là chỉ kiểm tra thân tàu. Nhưng chúng tôi chỉ quan tâm đến con đường rộng mở.
Cháy

phụ thuộc nếu bạn đang lặp lại các voxels hoặc các khoảng trống. Tôi chỉ cảm thấy mệt mỏi vì sự thiếu kiên nhẫn của bạn trong từng câu trả lời. Diễn đàn này không thực hiện những câu hỏi tiến bộ sâu sắc như bạn muốn.
Sẽ

Tôi khá hài lòng với mọi câu trả lời. Stackexchange có thể tồi tệ hơn nhiều.
Cháy

1

Nếu thế giới của bạn đã được xây dựng từ các khối riêng biệt, thì sẽ hợp lý khi sử dụng chúng làm cơ sở cho điều hướng của bạn.

Tìm đường dễ dàng, tìm đường nhanh khó hơn một chút. Con đường theo sau và đáp ứng với những thay đổi trên thế giới là sự khó chịu thực sự.

Có một vài câu hỏi có thể giúp bạn thu hẹp giải pháp tiềm năng: - loại NPC nào bạn đang cố gắng mô phỏng? - bạn đang tìm kiếm những con đường dài bao nhiêu? - bạn cần con đường chính xác như thế nào?

Nếu bạn có những con đường ngắn và bạn vẫn ổn với chất lượng "tốt hơn chỉ đạo", lưới địa phương [1] là lựa chọn tốt. Chúng siêu nhanh, bạn có thể làm cho nó hoạt động cả 2D và 3D. Bạn có thể nhận dữ liệu lưới cục bộ trực tiếp từ dữ liệu âm lượng của mình, vì vậy biểu đồ điều hướng phải đồng bộ với các thay đổi động một cách dễ dàng.

Vấn đề với lưới địa phương là nếu bạn có cực tiểu cục bộ trong thế giới của bạn lớn hơn lưới địa phương của bạn, thì tác nhân có thể bị kẹt. Có thể thực hiện các thủ thuật như thêm vụn bánh mì vào các vị trí mà bạn phát hiện cực tiểu địa phương và cố gắng tránh các vị trí đó khi tìm kiếm.

Nếu bạn cần đường dẫn dài, tôi đề xuất một số loại sơ đồ phân cấp. HPA * sẽ cung cấp cho bạn những ý tưởng hay về cách tạo các nút thưa thớt trong một thế giới. Các lưới cục bộ có thể giải quyết việc tìm đường giữa các nút cấp cao. Khi bạn thay đổi thế giới, bạn cũng sẽ cần thay đổi cục bộ các nút thô. Bạn cũng có thể sử dụng các nút để phát hiện các thay đổi động trong thế giới trò chơi và thay thế đường dẫn.

Nếu bạn có thế giới năng động, tìm đường trở thành thống kê. Không có bất kỳ đảm bảo nếu các đại lý sẽ tìm thấy con đường của mình. Theo dõi những thay đổi trên thế giới thực sự khó khăn và thay thế khi có sự cố xảy ra là chậm chạp.

Eskil thực hiện ý tưởng này trong Love MMO và công cụ tìm đường dẫn của anh ta chỉ là lấy mẫu ngẫu nhiên với chức năng tiện ích (lựa chọn hành động của anh ta cũng vậy :)). Tôi sẽ khuyên bạn nên làm điều đó trước nếu nó phù hợp với phong cách chơi của bạn.

[1] http://digestingduck.blogspot.com/2010/03/local-navlation-grids.html


0

Bạn muốn áp dụng lưới điều hướng, hoặc, nếu thế giới đặc biệt ồn ào theo chiều dọc thay vì chỉ là nền tảng hoặc nếu chế độ bay không chỉ là nhảy hoặc di chuột thì bạn có thể sử dụng âm lượng điều hướng.

Detour là một lib cho tìm đường dẫn cho phép bạn cập nhật lưới điều hướng trực tiếp. Tôi chưa bao giờ sử dụng nó, tôi không biết làm thế nào nó hoạt động ở quy mô của bạn. Một hệ thống phân cấp có vẻ như là một ý tưởng tốt.

Đọc tốt khi bạn suy nghĩ viết của riêng bạn là nghiên cứu gần đây về phá vỡ đối xứng . Rất đáng để đọc!

Cần phải xem xét liệu sương mù có ảnh hưởng đến các quyết định tìm đường hay không. Có thể là nếu được yêu cầu di chuyển đến một khu vực mới, một đơn vị sẽ di chuyển theo một đường thẳng cho đến khi gặp chướng ngại vật, hoặc có thể là đơn vị đó nên thực hiện một lộ trình với kiến ​​thức bản đồ đầy đủ. Đó là một sự lựa chọn trò chơi.

Đọc thú vị: Sửa lỗi tìm đường một lần và mãi mãi


Recast / Detour làm biến đổi địa hình thành một navmesh nhưng nó chỉ tạo ra các đa giác phẳng. Do đó, nó chỉ hữu ích cho các chế độ mặt đất. Bạn có thể lạm dụng kế hoạch năng động để làm bổ sung.
Cháy

Mikko đã điểm chuẩn hpa * và thấy nó nhanh hơn 4-5 lần so với A * của Detour và sử dụng bộ nhớ ít hơn 10-20 lần (các nút biểu đồ).
Cháy

ai đó ở đâu đó có khả năng đã thực hiện lib khối lượng điều hướng được cấp phép BSD với tìm đường dẫn G-HPA * -JPS. @Fire bạn rất đọc về điều này, có một liên kết cho nó?
Sẽ

Trên thực tế, phiên bản tổng quát của HPA * ở trên sửa đổi recast / Detour và được phát hành theo giấy phép không virus. Nhưng nó chỉ xử lý đa giác phẳng. Tôi sẽ bắt đầu từ đó.
Cháy
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.