Chọn một chuỗi các hình ảnh động cho một NPC - sử dụng cây hành vi?


8

Tôi đang thực hiện một NPC để đi bộ xung quanh một không gian ảo, đặc biệt là một con mèo. Tôi có một loạt các đoạn phim hoạt hình ngắn (3-5 giây). Bản năng đầu tiên của tôi chỉ là chọn một hình ảnh động ngẫu nhiên khi cái cuối cùng kết thúc, nhưng tôi nhận ra rằng nó sẽ không thực tế vì nó sẽ thay đổi hành vi quá thường xuyên, ngay cả khi hoạt hình tiếp theo bị giới hạn ở khả năng dự phòng.

Giải pháp dự định của tôi là một cái gì đó giống như một cây hành vi ( http://www.gamasutra.com/bloss/ChrisSimpson/20140717/221339/Behavior_trees_for_AI_How_they_work.php ), trong đó mỗi hoạt hình có một danh sách trọng số của hoạt hình tiếp theo. Tức là nếu con mèo đang đi bộ, nó có 80% cơ hội tiếp tục đi bộ, 20% ngồi xuống, 0% ngủ. Về cơ bản sử dụng một mô hình markov để có được bước tiếp theo thích hợp.

Tuy nhiên tôi không biết đây có phải là một giải pháp tốt hay không, tôi cũng không biết làm thế nào tôi sẽ tạo ánh xạ từ hoạt hình hiện tại sang khả năng hoạt hình tiếp theo + xác suất. 30 hình động * 30 hình động tiếp theo = 900 trọng số. Đó là rất nhiều để tính toán bằng tay.

Con mèo đôi khi sẽ phản ứng nếu nó gặp một chướng ngại vật, nhưng vấn đề nan giải là chọn một chuỗi hoạt hình thực tế mà không chọn tất cả chúng trước. Trong cây cũng sẽ có một số đầu vào khác, như sự gần gũi với một người, vị trí trong phòng, thời gian kể từ lần ăn cuối cùng, v.v.


2
Tôi chưa bao giờ làm điều này, nhưng liệu một cách tiếp cận đơn giản hơn có đủ không? tức là nhóm các hoạt hình của bạn thành các "hành vi" như: săn bắn, chơi đùa, nghỉ ngơi, gây phiền nhiễu cho con người, v.v ... Sau đó, bạn có thể thoát khỏi mà không có mô hình markov đó và chỉ có các probs đơn giản. trong các nhóm và probs để chuyển đổi nhóm dựa trên thời gian / sự kiện bên ngoài.
Mat

Câu trả lời:


3

Nói chung, bạn cần phải phân tách logic mèo của bạn từ hoạt hình của nó.

Bây giờ đầu tiên bạn cần viết logic mèo. Một cách tiếp cận tốt mà tôi đã tìm thấy là chia logic thành các lớp.

Nhu cầu

Mèo có thể có một số trạng thái với một số động cơ / nhu cầu (ăn, ngủ, v.v.) tăng chậm theo thời gian và giảm dần khi thực hiện chúng (nghĩ Sims). Bạn có thể chọn tác vụ hiện tại đáp ứng nhu cầu lớn nhất bằng cách sử dụng logic mờ nếu bạn muốn.

Nhiệm vụ

Bây giờ tại mỗi thời điểm, mèo có một nhiệm vụ (Tìm thức ăn, tìm giường ngủ, không gian để chạy xung quanh, v.v., nhàn rỗi cũng là một nhiệm vụ). Những nhiệm vụ này cho mèo biết nơi nào muốn đi và phải làm gì.

Hành động

Bây giờ có lớp thứ 3 - hành động. Mỗi mục tiêu có một hàng loạt các hành động phải làm (đứng lên, đi bộ đến, cúi xuống, ăn, v.v.). Mỗi hành động chịu trách nhiệm cho việc thực hiện của nó. Ví dụ: hành động đi bộ nên kiểm tra chướng ngại vật và đưa mèo từ điểm A đến điểm B, có thể chứa và thực hiện các hành động phụ (nhảy qua chướng ngại vật, cúi mình dưới đồ đạc, v.v.).

Ảnh động

Bây giờ khi con mèo có nhu cầu, một nhiệm vụ và một hành động, bạn có thể chọn hoạt hình phù hợp cho hành động đó. Biết hoạt hình hiện tại và tiếp theo, bạn sẽ có thể chuyển đổi từ cái này sang cái khác. Ví dụ: nếu nhiệm vụ nói rằng mèo nên nằm sau khi đi đến gối của nó, hình ảnh động được xếp hàng - walk-stop-sit-lay.

Việc xếp hàng các hình ảnh động có thể được thực hiện một cách hiệu quả nếu bạn ánh xạ chúng vào biểu đồ dưới dạng các nút và kết nối các nút giữa các hình ảnh động có thể chuyển đổi (ví dụ: đi bộ để ngồi là có thể, nhưng nhảy để nhai - không phải). Sau đó, bạn có thể xếp hàng các hình động từ từng cái này đến bất kỳ cái nào khác bằng cách sử dụng A * trên biểu đồ này.

Ví dụ: Mèo có nhu cầu nghỉ ngơi và ăn uống. Hãy để nhiệm vụ "Nghỉ ngơi" tìm một nơi để nghỉ ngơi, dắt mèo đến đó, đặt nó xuống và nghỉ ngơi. Hãy để nhiệm vụ "Nghỉ ngơi" kiểm tra các điều kiện mọi lúc và sau đó, nếu môi trường xung quanh trở nên không thoải mái - hãy để nhiệm vụ kết thúc. Kiểm tra xem con mèo muốn gì hơn bây giờ, nếu nó vẫn muốn nghỉ ngơi - lặp lại phần trước. Khi mèo được nghỉ ngơi - chọn nhiệm vụ mới.


2

Tôi nghĩ những gì bạn đang tìm kiếm là máy trạng thái hữu hạn hoặc FSM. Nói tóm lại, đó là cách thay đổi hành vi của NPC: s theo trạng thái hiện tại của họ.

BIÊN TẬP:

Nó giống như một cây hành vi nhưng cô đọng xuống một số nhóm "trạng thái" mà NPC quay trở lại. Cây hành vi cho phép hành vi linh hoạt hơn nhiều nhưng cũng cần nhiều dữ liệu hơn cho trọng số của xác suất (một cách thông minh để tự động hóa nó bằng các thẻ, như scriptin gợi ý trong câu trả lời của anh ấy). Khi bạn sử dụng trạng thái, bạn quyết định một tập hợp hành động và xác suất nhất định cho những hành động đó trong trạng thái. Để thay đổi hành động, hành động hiện tại có thể bị sai lệch với khoảng 80% để giữ nguyên hành động đó, nếu hành động đó phải được thay đổi, các xác suất khác nhau được sử dụng để chọn hành động mới.

Trong trường hợp của bạn, các trạng thái có thể là (đơn giản hóa một chút):

  • Buồn ngủ: Ngủ 80%, Ngồi 15%, Đi bộ 5%
  • Tức giận: Tiếng gầm (mèo có gầm không?) 40%, Hiss 40%, Chạy 20%
  • Đói: Ăn 40%, Săn 40%, Chạy 10%
  • Playfull: Chơi 60%, Chạy 20%, Nhảy 10%
  • Sẹo: Ẩn 50%, Chạy 50%

Mỗi tiểu bang có thể có xác suất khác nhau để thay đổi trạng thái, ví dụ như trạng thái tức giận hoặc sẹo có thể không tồn tại lâu. Các tiểu bang khác nhau cũng có thể có các quy tắc khác nhau cho những gì hợp pháp (thay đổi từ "buồn ngủ" sang "vui tươi" có thể là bất hợp pháp, nhưng mèo dường như không quan tâm đến điều đó). Các sự kiện khác nhau có thể kích hoạt nhà nước để thay đổi.

Có một cái nhìn xung quanh bằng cách tìm kiếm trên web cho FSM và AI và bạn có thể thấy nó hoạt động như thế nào. Nó có vẻ phức tạp khi giải thích nó, nhưng nó thực sự đơn giản.


Bạn vừa mô tả một giải pháp được đề xuất trong câu hỏi, với một tên khác.
scriptin

Cây hành vi phức tạp hơn nhiều so với máy trạng thái, việc thực hiện và cần thiết lập trọng lượng dễ dàng hơn nhiều
Fredrik Lundvall

Tôi hiểu điều đó. Nhưng thuật toán được mô tả trong câu hỏi chính xác là những gì bạn đã mô tả. (Tôi đoán rằng OP đang mô tả một FSM thay vì cây hành vi.) Ngoài ra, bạn không giải quyết vấn đề về quá nhiều hoán vị của các trạng thái, dường như là mối quan tâm chính của câu hỏi.
scriptin

Bạn nói đúng về câu trả lời của tôi không thực sự nhấn mạnh vấn đề. Tôi muốn chỉ cho anh ta đi đúng hướng mặc dù. Bởi vì các hoán vị không thực sự là một vấn đề với các máy nhà nước
Fredrik Lundvall

Đó là thông tin bổ sung có thể rất hữu ích. Có lẽ bạn có thể chỉnh sửa câu trả lời của mình để giải thích về những khác biệt này b / w FSM và BT?
scriptin

1

Bạn có thể sử dụng gắn thẻ:

  • Có thể có các thẻ chuyển động như "nằm", "ngồi", "đứng", "đi bộ" và "chạy". Sau đó, bạn có thể loại bỏ các kết hợp thẻ không thực tế, ví dụ: "đặt" -> "đang chạy" (phải có "đứng lên" ở giữa).

  • Các thẻ khác có thể mô tả các hoạt động: "ngủ", "ăn", "săn bắn", v.v ... Một lần nữa, "ngủ" -> "săn bắn" là không thể nếu không có trạng thái trung gian.

  • Vì các hình động như "đứng lên" là chuyển tiếp, nên có thể có các thẻ riêng cho phần đầu và phần cuối của mỗi hình động. Ví dụ: "đứng lên" có thể là một sự chuyển đổi từ "ngồi" sang "ở lại", v.v.

Vì vậy, đối với mỗi hình ảnh động, bạn có thể có một vài thẻ:

  • Những người mô tả vị trí / chuyển động ban đầu và cuối cùng
  • Ít nhất một mô tả một hoạt động. Ngoài ra, vì các hoạt động cũng có chuyển tiếp, bạn cũng có thể có các thẻ ban đầu và cuối cùng ở đây

Với những điều đó, bạn chỉ có thể lọc các kết hợp có thể bằng cách đặt các hạn chế, chẳng hạn như " A->Bchỉ có thể nếu final_movement_tag(A) == initial_movement_tag(B)", điều này sẽ dẫn đến số lượng nhỏ hơn nhiều. Với những kết hợp có thể, bạn có thể làm những gì bạn đã mô tả - thêm xác suất. Việc thêm xác suất có thể dựa trên các thẻ hoạt động, vì việc ở trong cùng một hoạt động có nhiều khả năng hơn là thay đổi các hoạt động.

Vì vậy, với các thẻ, bạn có thể tự động hóa việc tạo tất cả các chuyển đổi trong cây hành vi / FSM của mình và điều chỉnh chúng sau này nếu bạn không hài lòng với một số kết hợp.


1

Nếu bạn muốn giữ các khả năng phong phú của cây hành vi, bạn có thể thêm một loại nút chọn tổng hợp mới: nút chọn Markov.

Bạn sẽ phải tự thực hiện nút chọn Markov. Nó sẽ chọn một trong các nút con của nó một cách ngẫu nhiên, tùy thuộc vào nút (con) mà trước đó đã thành công (hoặc thất bạ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.