Làm thế nào để bạn thực hiện con đường AI theo sau trong một công cụ vật lý 2d như farseer / box2d?


12

Tôi đang trong quá trình chuyển một trò chơi 2d từ trên xuống mà tôi đang làm việc thành một công cụ vật lý cơ thể cứng nhắc thích hợp như Farseer. Cho đến bây giờ, tôi mới hack được mã vật lý của riêng mình khi cần.

Tôi đang cố gắng học cách làm việc đúng đắn ở đây.

Cách thích hợp để làm cho AI của bạn đi theo một con đường đã định sẵn khi bạn đã biến chúng thành những cơ thể cứng nhắc bên trong động cơ vật lý?

Nếu tôi có đường dẫn các nút điều hướng trên bản đồ mà tôi cần AI theo dõi, trước đây tôi sẽ chỉ di chuyển chúng dọc theo đường dẫn bằng cách tính toán vị trí tiếp theo mà chúng nên ở bước tiếp theo và tự đặt chúng vào vị trí đó .

Nhưng bây giờ chúng là những cơ thể cứng nhắc và chịu sự va chạm và bất kỳ lực lượng nào có thể đánh chúng và đánh bật chúng khỏi đường đi.

Vì vậy, để làm cho AI di chuyển, tôi tin rằng bây giờ tôi nên áp dụng các xung lực / lực lượng cho chúng? Tôi không còn được thiết lập thủ công vị trí của họ từng khung.

Vì vậy, tôi nghĩ rằng tôi cần phải đi từ một thế giới xác định, nơi tôi buộc AI phải tuân thủ nghiêm ngặt một con đường đến một thế giới không xác định, nơi chúng có thể bị đánh bật theo bất kỳ hướng nào nếu bị tấn công và tôi chỉ cần đẩy chúng về phía nút tiếp theo trên đường đi để làm cho họ di chuyển.

Có đúng không? Có phải đó là cách người khác làm điều đó?

Điều này đặt ra một số câu hỏi về cách tránh AI của bạn bị mắc kẹt trên các góc của cảnh vật khi chúng không đi trên một con đường chính xác, làm thế nào để các bạn xử lý loại điều đó?

Hoặc tốt hơn là bằng cách nào đó kết hợp cả hai và vẫn để AI của bạn đi theo một con đường cố định bằng cách đặt vị trí của chúng theo cách thủ công và chỉ phản ứng với các lực khác trong những trường hợp nhất định mà bạn có thể dễ dàng kiểm soát?

Cảm ơn mọi người đã tư vấn.


1
+1 Tôi cũng khá thích tìm hiểu về điều này.
David Gouveia

Câu trả lời:


7

Hành vi chỉ đạo hoạt động rất tốt kết hợp với động cơ vật lý, vì chúng thường được thực hiện theo cách chúng trả lại "lực lái" sau đó có thể được áp dụng cho cơ thể vật lý của bạn.

Để tạo một đơn vị theo một đường dẫn, bạn có thể sử dụng Seek để đi từ nút đường dẫn đến nút đường dẫn (đảm bảo tránh tình trạng quá tải) và sau đó sử dụng Đến tại nút cuối cùng trong đường dẫn của bạn.

Đối với mối quan tâm của bạn về việc bị mắc kẹt: Mô hình hóa các cách sử dụng lực theo đường dẫn thực sự nên khá chính xác. Bạn có quyền rằng một đối tượng có thể bị ném khỏi đường dẫn nếu nó va chạm với một đối tượng khác, nhưng vì bạn sẽ tính toán lực điều khiển trong mỗi bản cập nhật, nên đối tượng sẽ được theo dõi lại ngay lập tức. Nếu độ lệch khỏi đường dẫn sau va chạm có thể rất lớn, thì tôi khuyên bạn nên nhớ vị trí cuối cùng của mình mỗi khi xảy ra va chạm và sau đó điều khiển đối tượng trở lại vị trí cuối cùng trước khi tiếp tục lộ trình bình thường.


Bài viết tuyệt vời, cảm ơn đã chia sẻ. Cứu ngày của tôi.
Ricardo Sanchez-Saez

0

Tôi muốn nói rằng bạn đang đi đúng hướng, bạn có thể muốn xem bài viết này:

http://www.policyalmanac.org/games/aStarTutorial.htmlm

Nó giải thích một số cách tránh va chạm cơ bản và tìm đường đi bằng thuật toán A *.

Biên tập:

Nếu bạn thực sự chỉ cần cách tốt nhất để đẩy các vật thể của mình đi đúng hướng, thì bạn nên sử dụng một lực (giả sử là MovementForce hoặc thứ gì đó) chỉ theo hướng của con đường tốt nhất bạn tìm thấy bằng thuật toán tìm đường của bạn sự lựa chọn


Tôi không nghĩ rằng bài viết đó có liên quan đến câu hỏi này. OP không hỏi làm thế nào để tìm ra con đường tối ưu giữa hai địa điểm, mà là làm thế nào để khiến một diễn viên đi theo một con đường anh ta đã tính toán, trong bối cảnh mô phỏng vật lý.
David Gouveia

tốt khi tôi đọc nó một lần nữa tôi thấy quan điểm của bạn, Ill chỉnh sửa câu trả lời của tôi
annonymously

:) Tôi cũng thay đổi tiêu đề để làm sáng tỏ mọi thứ. Chắc chắn quan tâm đến con đường theo sau hơn là tìm ra con đường.
TerryB

0

Đánh giá theo những gì @davidluzgouveia nhận xét về bài đăng đồng nghĩa, tôi sẽ đưa ra dự án của mình. Con đường theo sau và tìm đường là rất khác nhau mặc dù. Tìm đường dẫn nhiều hơn những gì đồng nghĩa với việc đăng tải và đối với tìm đường dẫn tôi sẽ xem xét thuật toán của Dijkstra. Đối với con đường tiếp theo tôi sử dụng công cụ vật lý lựa chọn của tôi hoàn toàn. Cách tôi thiết lập là mỗi vị trí mà một lớp đơn vị bước tới, được thiết lập trong lớp con đường dẫn của nó thông qua các 2D, vâng, chúng là 2D và không phải 3D, đó là do cách tôi thiết lập vật lý trong trò chơi của mình .

Giải thích 3D: Mỗi đơn vị chỉ có một máy va chạm chính được thiết lập riêng để va chạm với các vật thể địa hình và thế giới. Đó là một hình dạng viên nang và có bán kính, và chiều cao nói theo lập trình. Nó được xây dựng ở trung tâm của mô hình và nên kéo dài qua mặt trước và đỉnh của mô hình. Nhưng tôi cũng có một phần bù bề mặt cho mọi lúc mọi nơi cách mặt đất và một khoảng thời gian cho phép nó trượt xuống bao nhiêu trước khi bật lên một chút. Nghe có vẻ như tôi đang áp dụng một số cách khắc phục sự cố cho sự cố va chạm địa hình, nhưng tôi có lý do của mình.

Dù sao, bạn nên tác dụng lực lên vật thể con nhộng này và nó vẫn luôn lơ lửng trên mặt đất mọi lúc. Điều đó không có nghĩa là nó không thể tăng cao hơn, chỉ là nó không thể đi thấp hơn nữa. Lý do tại sao nó cần phải di chuột (trong trường hợp của tôi) là bởi vì trong một cơ thể cứng nhắc và động cơ vật lý ragdoll, chân của các đơn vị của tôi đang hoạt động theo thủ tục. Vì vậy, bằng cách áp dụng một lực đơn giản vào viên nang, chân của thực thể tôi sẽ tự định vị lại. Họ cũng sẽ có các ứng dụng trọng lực riêng biệt của họ! Điều này không cho phép nếu nhân vật của tôi nằm nghiêng, một chân có thể ở độ cao thấp hơn chân kia.

Đây chính xác là cách bạn nên làm điều đó. Đánh giá theo những gì bạn đang hỏi đó là. Nếu bạn muốn loại bỏ một số tính năng, điều đó rõ ràng là tốt, đặc biệt nếu đó là RTS hoặc FPS và không ai sẽ nhìn thấy các đơn vị chân hoặc dù sao cũng quan tâm. Nhưng nói chung, đơn vị nên có một đối tượng va chạm CHÍNH hoạt động với chuyển động của nhân vật gần như độc quyền.

Cụ thể 2D: Bạn vẫn nên có một điểm chính, hoặc chỉ một số loại tham chiếu, để động cơ đẩy xung quanh đó là cho chuyển động của một đơn vị. Bạn có thể cung cấp cho mỗi đơn vị một lớp con đường dẫn có một vài vị trí cần đi, bạn có thể chỉ định nó trong mã cấp độ, (ví dụ: location1 (x, y) location2 (x, y), v.v.) cách tốt nhất (tôi không Bạn không biết loại trò chơi nào bạn đang làm việc) có thể sẽ chỉ định các vị trí trong cấp độ và mỗi đơn vị sẽ xử lý chúng theo thứ tự được chỉ định theo cấp độ và sau khi đến từng vị trí, hãy thay thế vị trí mong muốn bằng cái tiếp theo nó cần để có được.

Có rất nhiều cách bạn có thể sửa đổi điều đó, như có một danh sách các vị trí ở vị trí đầu tiên cho mỗi đơn vị, vì điều này có nghĩa là không phải tất cả các đơn vị phải đi đến cùng một vị trí. Tuy nhiên, cũng giống như vậy, bạn cũng có thể làm điều này trong mã cấp độ (unit1.location1 (x, y) unit1.location2 (x, y) grunt.l1 (x, y) Knight.loc3 (x, y) bất cứ điều gì)

Chỉ cần một vài ý tưởng! Tôi khuyên bạn nên đọc phiên bản 3D mặc dù nó ít liên quan hơn.

EDIT: Tôi quyết định chỉ cung cấp cả cho bất kỳ ai có thể đọc được điều này (Đúng vậy) .... (Ban đầu tôi chỉ đọc lướt qua câu hỏi của bạn và không nhận ra nó khá cụ thể 2D cho đến khi tôi đọc lạ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.