Memilih urutan animasi untuk NPC - gunakan pohon perilaku?

8

Saya menerapkan NPC untuk berjalan di sekitar ruang virtual, khususnya kucing. Saya memiliki serangkaian klip animasi pendek (3-5 detik). Insting pertama saya adalah hanya memilih animasi acak ketika yang terakhir berakhir, tetapi saya menyadari bahwa itu tidak akan terlihat realistis karena akan mengubah perilaku terlalu sering, bahkan jika animasi berikutnya terbatas pada kemungkinan kontingen fisik.

Solusi yang saya maksudkan adalah sesuatu seperti pohon perilaku ( http://www.gamasutra.com/blogs/ChrisSimpson/20140717/221339/Behavior_trees_for_AI_How_they_work.php ), di mana setiap animasi memiliki daftar animasi berikutnya yang berbobot. Yaitu jika kucing berjalan, ia memiliki peluang 80% untuk terus berjalan, 20% duduk, 0% tidur. Pada dasarnya menggunakan model markov untuk mendapatkan langkah selanjutnya yang sesuai.

Namun saya tidak tahu apakah ini solusi yang baik, saya juga tidak tahu bagaimana saya akan menghasilkan pemetaan dari animasi saat ini ke kemungkinan animasi berikutnya + probabilitas. 30 animasi * 30 animasi berikutnya = 900 bobot. Itu banyak menghitung secara manual.

Kucing kadang-kadang akan bereaksi jika menabrak rintangan, tetapi beban masalahnya adalah memilih urutan animasi yang realistis tanpa memilih semuanya terlebih dahulu. Di pohon itu juga akan ada beberapa input lain, seperti kedekatan dengan seseorang, lokasi di ruangan, waktu sejak terakhir makan dll.

bintang laut
sumber
2
Saya belum pernah melakukan hal semacam ini, tetapi apakah pendekatan yang lebih sederhana sudah cukup? yaitu kelompok animasi Anda menjadi "perilaku" seperti: berburu, bermain, beristirahat, mengganggu manusia, dll. Maka Anda mungkin bisa pergi tanpa model markov itu dan hanya memiliki probs sederhana. dalam kelompok dan probs untuk beralih kelompok berdasarkan waktu / peristiwa eksternal.
Mat

Jawaban:

3

Secara umum, Anda perlu memisahkan logika kucing dari animasinya.

Sekarang pertama-tama Anda perlu menulis logika kucing. Satu pendekatan bagus yang saya temukan adalah dengan memecah logika menjadi beberapa lapisan.

Kebutuhan

Kucing dapat memiliki beberapa keadaan dengan beberapa motif / kebutuhan (makan, tidur, dll.) Yang perlahan-lahan tumbuh seiring waktu dan berkurang ketika melakukannya (pikirkan Sims). Anda dapat memilih tugas saat ini yang memenuhi kebutuhan terbesar menggunakan logika fuzzy jika Anda mau.

Tugas

Sekarang pada setiap saat kucing memiliki tugas (Temukan makanan, temukan tempat tidur untuk tidur, ruang untuk berlarian, dll. Menganggur juga merupakan tugas). Tugas-tugas ini memberi tahu kucing ke mana harus pergi dan apa yang ingin dilakukan.

Tindakan

Sekarang ada layer ke-3 - aksi. Setiap tujuan memiliki antrian tindakan yang harus dilakukan (berdiri, berjalan ke, berjongkok, makan, dll.). Setiap tindakan bertanggung jawab atas pelaksanaannya. Misalnya, tindakan jalan kaki harus memeriksa hambatan dan mengirimkan kucing dari titik A ke titik B, mungkin berisi dan menjalankan sub-aksi (melompati rintangan, berjongkok di bawah furnitur, dll.).

Animasi

Sekarang ketika kucing memiliki kebutuhan, tugas dan tindakan, Anda dapat memilih animasi yang tepat untuk tindakan itu. Mengetahui animasi saat ini dan selanjutnya Anda harus dapat beralih dari satu ke yang lain. Misalnya, jika tugas mengatakan kucing harus berbaring setelah berjalan ke bantal, animasi akan mengantri - berjalan-berhenti-duduk-berbaring.

Antrian animasi dapat dilakukan secara efektif jika Anda memetakannya dalam grafik sebagai simpul dan menghubungkan simpul antara animasi yang dapat ditransisikan (misalnya berjalan untuk duduk adalah mungkin, tetapi melompat untuk mengunyah - tidak). Kemudian Anda dapat mengantriasi animasi dari masing-masing ke yang lain menggunakan A * pada grafik ini.

Contoh: Kucing perlu istirahat dan makan. Biarkan "Istirahat" tugas menemukan tempat untuk beristirahat, berjalan kucing di sana, meletakkannya dan beristirahat. Biarkan tugas "Istirahat" memeriksa kondisi setiap saat, jika lingkungan menjadi tidak nyaman - biarkan tugas berakhir. Periksa apa yang diinginkan kucing sekarang, jika masih ingin beristirahat - ulangi bagian sebelumnya. Saat kucing diistirahatkan - pilih tugas baru.

Kromster
sumber
2

Saya pikir apa yang Anda cari adalah mesin negara terbatas atau FSM. Singkatnya, ini adalah cara mengubah perilaku NPC: sesuai dengan kondisi mereka saat ini.

EDIT:

Ini seperti pohon perilaku tetapi diringkas ke beberapa kelompok "menyatakan" bahwa NPC kembali. Pohon perilaku memungkinkan lebih banyak fleksibilitas perilaku tetapi juga membutuhkan lebih banyak data untuk menimbang probabilitas (cara cerdas untuk mengotomatiskannya adalah dengan tag, seperti yang disarankan scriptin dalam jawabannya). Ketika Anda menggunakan negara Anda memutuskan serangkaian tindakan dan probabilitas tertentu untuk tindakan tersebut di negara. Untuk secara aktif mengubah tindakan saat ini dapat menjadi bias dengan mungkin 80% untuk menjaga tindakan yang sama, jika tindakan harus diubah, berbagai probabilitas digunakan untuk memilih tindakan baru.

Dalam kasus Anda, status dapat (sedikit disederhanakan):

  • Mengantuk: Tidur 80%, Duduk 15%, Jalan 5%
  • Marah: Mengaum (apakah kucing mengaum?) 40%, Hiss 40%, Run 20%
  • Lapar: Makan 40%, Berburu 40%, Jalankan 10%
  • Playfull: Mainkan 60%, Jalankan 20%, Lompat 10%
  • Bekas Luka: Sembunyikan 50%, Jalankan 50%

Setiap negara dapat memiliki probabilitas berbeda untuk mengubah keadaan, misalnya keadaan marah atau terluka mungkin tidak berlangsung lama. Negara bagian yang berbeda juga dapat memiliki aturan yang berbeda untuk apa yang legal (mengubah dari "mengantuk" menjadi "playfull" bisa ilegal, tetapi kucing tampaknya tidak peduli tentang itu). Peristiwa yang berbeda dapat memicu negara untuk berubah.

Lihat- lihat dengan mencari di web untuk FSM dan AI dan Anda dapat melihat cara kerjanya. Mungkin terlihat rumit ketika menjelaskannya, tetapi sangat sederhana.

Fredrik Lundvall
sumber
Anda baru saja menggambarkan solusi yang diajukan dalam pertanyaan, dengan nama yang berbeda.
scriptin
Pohon perilaku jauh lebih kompleks daripada mesin negara, implementasi dan kebutuhan untuk pengaturan berat jauh lebih mudah
Fredrik Lundvall
Aku mengerti itu. Tetapi algoritma yang dijelaskan dalam pertanyaan adalah persis seperti yang Anda gambarkan. (Saya kira OP menggambarkan sebuah FSM dan bukan pohon perilaku.) Juga, Anda tidak mengatasi masalah terlalu banyak permutasi negara, yang tampaknya menjadi perhatian utama pertanyaan.
scriptin
Anda benar tentang jawaban saya yang tidak terlalu menekankan masalah ini. Saya ingin mengarahkannya ke arah yang benar. Karena permutasi tidak benar-benar menjadi masalah dengan mesin negara
Fredrik Lundvall
Informasi tambahan itu bisa sangat berguna. Mungkin Anda bisa mengedit jawaban Anda untuk menguraikan perbedaan ini dengan FSM dan BT?
scriptin
1

Anda dapat menggunakan pemberian tag:

  • Mungkin ada tag gerakan seperti "meletakkan", "duduk", "berdiri", "berjalan", dan "berlari". Kemudian, Anda dapat menghilangkan kombinasi tag yang tidak realistis, misalnya "meletakkan" -> "berlari" (harus ada "berdiri" di antaranya).

  • Tag lain mungkin menggambarkan aktivitas: "tidur", "makan", "berburu", dll. Lagi-lagi, "tidur" -> "berburu" tidak mungkin tanpa kondisi perantara.

  • Karena animasi seperti "berdiri" bersifat transisi, mungkin merupakan ide yang baik untuk memiliki tag terpisah untuk awal dan akhir setiap animasi. Misalnya, "berdiri" mungkin merupakan transisi dari "duduk" ke "tinggal", dll.

Jadi, untuk setiap animasi Anda dapat memiliki beberapa tag:

  • Yang menggambarkan posisi / gerakan awal dan akhir
  • Setidaknya satu menggambarkan aktivitas. Juga, karena aktivitas juga memiliki transisi, Anda mungkin juga memiliki tag awal dan akhir di sini

Dengan itu, Anda dapat memfilter hanya kombinasi yang mungkin dengan menetapkan batasan seperti " A->Bhanya mungkin jika final_movement_tag(A) == initial_movement_tag(B)", yang akan menghasilkan angka yang jauh lebih kecil. Dengan kemungkinan kombinasi itu, Anda dapat melakukan apa yang telah Anda jelaskan - tambahkan probabilitas. Menambahkan probabilitas mungkin didasarkan pada tag aktivitas, karena tetap dalam aktivitas yang sama lebih mungkin daripada mengubah aktivitas.

Jadi, dengan tag, Anda mungkin dapat mengotomatiskan pembuatan semua transisi di pohon perilaku / FSM Anda, dan menyetelnya nanti jika Anda tidak senang dengan beberapa kombinasi.

skrip
sumber
1

Jika Anda ingin menyimpan banyak kemungkinan pohon perilaku, Anda dapat menambahkan jenis baru simpul pemilih komposit: simpul pemilih Markov.

Anda harus mengimplementasikan sendiri simpul pemilih Markov. Ini akan memilih salah satu dari simpul anaknya secara acak, tergantung pada simpul (anak) yang sebelumnya berhasil (atau gagal).

Kasper van den Berg
sumber