Minggu, 05 Mei 2019


Bab 3

Gerakan
salah satu persyaratan yang paling mendasar AI adalah untuk memindahkan karakter di dalam permainan bijaksana. Bahkan yang paling awal AI dikontrol karakter (hantu di Pac-Man, misalnya, atau kelelawar lawan di beberapa varian Pong) telah gerakan algoritma yang tidak jauh dari permainan di rak hari ini. Gerakan membentuk tingkat terendah teknik AI dalam model kita, ditunjukkan pada gambar 3.1.




Gambar 3.1

3.1 Dasar dari algoritma gerakan
Semua algoritma gerakan memiliki bentuk dasar yang sama. Mereka mengambil data geometris tentang negara mereka sendiri dan negara dunia, dan mereka datang dengan output geometris yang mewakili movementtheywouldliketomake. Gambar 3.2 showsthisschematis. Inthefigure, thevelocity karakter ditampilkan sebagai opsional karena hanya diperlukan untuk kelas tertentu gerakan algoritma.
Gambar 3.2
Beberapa algoritma gerakan memerlukan sedikit masukan: posisi karakter dan posisi musuh untuk mengejar, misalnya. Lain memerlukan banyak interaksi dengan permainan negara dan tingkat geometri. Algoritma Amoprestasi yang menghindari bumpingin ke dinding, misalnya, perlu memiliki akses ke geometri dinding untuk memeriksa potensi tabrakan.
Dynamics menambahkan lapisan tambahan kompleksitas. Katakanlah karakter Anda perlu berpindah dari satu tempat ke lokasi lain. Sebuah algoritma kinematik hanya memberikan arah ke target; Anda bergerak ke arah itu sampai Anda tiba, dimana algoritma tidak mengembalikan arah: Anda telah tiba. Algoritma gerakan dinamis perlu bekerja lebih keras. Ini pertama perlu untuk mempercepat ke arah yang benar, dan kemudian karena mendapat dekat target yang dibutuhkan untuk mempercepat dalam arah yang berlawanan, sehingga kecepatan menurun pada tepat tingkat yang benar untuk memperlambat untuk berhenti di tempat yang tepat. Karena karya Craig begitu terkenal, di bagian lain dari bab ini kita biasanya akan mengikuti terminologi yang paling umum dan merujuk kepada semua algoritma gerakan dinamis sebagai perilaku kemudi.

3.1.1 Gerakan Dua Dimensi
Banyak permainan memiliki AI yang bekerja dalam dua dimensi. Meskipun permainan jarang ditarik dalam dua dimensi lagi, karakter mereka biasanya di bawah pengaruh gravitasi, menempel mereka ke lantai dan membatasi gerakan mereka untuk dua dimensi.
Banyak gerakan AI dapat dicapai hanya dalam dua dimensi, dan sebagian besar algoritma klasik hanya didefinisikan untuk kasus ini. Sebelum melihat algoritma itu sendiri, kita perlu dengan cepat menutupi data yang dibutuhkan untuk menangani matematika dan gerakan dua dimensi (2D).
Karakter Sebagai Poin
Meskipun karakter biasanya terdiri dari tiga dimensi (3D) model yang menempati beberapa ruang di dunia permainan, banyak gerakan algoritma mengasumsikan bahwa karakter dapat diperlakukan sebagai satu titik. Deteksi tabrakan, penghindaran rintangan, dan beberapa algoritma lainnya menggunakan ukuran karakter untuk mempengaruhi hasilnya, tetapi gerakan itu sendiri mengasumsikan karakter berada pada titik tunggal.




3.1.2 Statika
Karakter dalam dua dimensi mencukur dua koordinat linier yang mewakili posisi objek. Koordinat ini relatif terhadap dua sumbu dunia yang terletak tegak lurus terhadap arah gravitasi dan tegak lurus satu sama lain. Kumpulan sumbu referensi ini disebut sebagai basis orthonormal dari ruang 2D.
Dalam kebanyakan permainan geometri biasanya disimpan dan diberikan dalam tiga dimensi. Geometri model ini memiliki dasar orthonormal 3D yang mengandung tiga sumbu: biasanya disebut x, y, dan z. hal ini paling umum untuk sumbu y berada di arah yang berlawanan gravitasi (yaitu, "up") dan untuk sumbu x dan z untuk berbaring di bidang tanah. Gerakan karakter dalam thegame terjadi di sepanjang sumbu x dan z yang digunakan untuk rendering, seperti yang ditunjukkan pada gambar 3.3. Untuk alasan ini bab ini akan menggunakan sumbu x dan z saat mewakili gerakan dalam dua dimensi, meskipun buku yang didedikasikan untuk geometri 2D cenderung menggunakan x dan y untuk nama sumbu.
Gambar 3.3
Selain dua koordinat linier, objek arah facinginany memiliki satu nilai orientasi. Nilai orientasi mewakili sudut dari sumbu referensi. Dalam kasus kami, kami menggunakan sudut berlawanan jarum jam, di radian, dari sumbu z positif. Ini cukup standar dalam mesin permainan; secara default (yaitu, dengan orientasi nol) karakter melihat ke bawah sumbu z.
Dengan tiga nilai ini, keadaan statis karakter dapat diberikan dalam level, seperti yang ditunjukkan pada gambar 3.4.
Gambar 3.4

Algoritme atau persamaan yang memanipulasi data ini disebut statis karena data tidak berisi informasi apa pun tentang pergerakan karakter. Kita dapat menggunakan struktur data dari form:
Kita akan menggunakan istilah orientasi melalui bab ini untuk berarti arah di mana karakter menghadap. Ketika menyangkut rendering karakter, kita akan membuat mereka tampak berhadapan satu arah dengan memutarnya (menggunakan matriks rotasi). Karena itu, beberapa pengembang merujuk pada orientasi sebagai rotasi. Kita akan menggunakan rotasi dalam bab ini hanya berarti proses perubahan orientasi; itu adalah proses aktif.
Tentu saja, jika Anda sedang menulis simulator penerbangan atau penembak ruang, maka semua orientasi sangat penting untuk AI, jadi Anda harus pergi untuk menyelesaikan tiga dimensi. Di ujung skala yang lain, jika dunia permainan Anda benar rata dan karakter tidak dapat melompat atau bergerak secara vertikal dengan cara lain, maka diperlukan model 2D yang ketat. Dalam sebagian besar kasus, 21/2 2D adalah solusi optimal. Kita akan membahas gerak 3D penuh pada akhir bab, tapi selain itu, Semua algoritma yang dijelaskan dalam bab ini dirancang untuk bekerja di 21/2 2D.

3.1.3 Kinematika
Sejauh ini masing-masing karakter telah memiliki dua sebagai potongan disosiasi informasi: positionnya dan orientasinya. Kita dapat membuat algoritma gerakan untuk menghitung kecepatan target berdasarkan posisi dan orientasi saja, memungkinkan kecepatan output untuk berubah seketika.
Sementara ini baik untuk banyak permainan, itu bisa terlihat tidak realistis. Konsekuensi dari hukum gerak Newton adalah bahwa kecepatan tidak dapat berubah seketika di dunia nyata. Jika karakter bergerak dalam satu arah dan kemudian langsung mengubah arah atau kecepatan, itu akan terlihat aneh. Untuk membuat gerakan halus atau untuk mengatasi karakter yang tidak dapat mempercepat sangat cepat, kita perlu baik untuk menggunakan beberapa jenis smoothing algoritma atau untuk memperhitungkan kecepatan saat ini dan menggunakan percepatan untuk mengubahnya.
Untuk mendukung hal ini, karakter tetap Strack kecepatan arus posisi swellas. Algoritme kemudian dapat beroperasi untuk mengubah kecepatan sedikit pada setiap kerangka waktu, memberikan gerakan yang mulus.

Menghadapi independen
Perhatikan bahwa tidak ada yang menghubungkan arah bahwa karakter bergerak dan arah yang dihadapi. Sebuah karakter dapat berorientasi sepanjang sumbu x tetapi harus melakukan perjalanan langsung di sepanjang sumbu z. Kebanyakan karakter permainan tidak boleh berperilaku dengan cara ini; mereka harus mengarahkan diri sehingga mereka bergerak ke arah yang mereka hadapi.
Solusi yang lebih baik adalah dengan memindahkannya proporsi cara untuk menangkal arah yang diinginkan: untuk kelancaran gerak atas banyak frame. Pada gambar 3.5, karakter berubah orientasi menjadi setengah jalan menuju arah gerak saat ini di setiap frame. Segitiga menunjukkan orientasinya, dan bayangan kelabu menunjukkan di mana karakter berada pada frame sebelumnya, untuk menunjukkan gerakannya.
Gambar 3.5

Variabel Frame Rates
Perhatikan bahwa kita telah diasumsikan bahwa kecepatan yang diberikan dalam unit per detik daripada per frame. Permainan yang lebih tua sering digunakan per-frame kecepatan, tetapi praktek itu sebagian besar telah mati. Hampir semua game (bahkan yang ada di konsol) sekarang ditulis untuk mendukung frame rate variabel, sehingga waktu update yang eksplisit digunakan.
Jika karakter diketahui bergerak pada 1 meter per detik dan frame terakhir adalah 20 milliseconds'duration, maka mereka akan perlu untuk bergerak 20 milimeter.
Kekuatan dan Aktuasi
Dalam dunia nyata kita tidak bisa hanya menerapkan percepatan untuk sebuah objek dan memilikinya bergerak. Kami menerapkan kekuatan, dan kekuatan menyebabkan perubahan dalam energi kinetik objek. Mereka akan mempercepat, tentu saja, tetapi percepatan akan tergantung pada inersia objek. Inersia bertindak untuk melawan percepatan; dengan inertia yang lebih tinggi, ada sedikit percepatan untuk gaya yang sama.
Karena paling mapan algoritma kemudi didefinisikan dengan percepatan output, tidak umum untuk menggunakan algoritma yang bekerja secara langsung dengan kekuatan. Biasanya, pengendali gerakan mempertimbangkan dinamika karakter dalam tahap pasca-pemrosesan yang disebut aktuasi.
Aktuasi mengambil sebagai input perubahan yang diinginkan dalam kecepatan, jenis yang akan langsung diterapkan dalam sistem kinematik. Aktuator kemudian menghitung kombinasi kekuatan yang dapat diterapkan untuk mendapatkan sedekat mungkin ke perubahan kecepatan yang diinginkan.

3.2 Algoritma gerakan kinematic
Algoritma gerakan kinematik menggunakan data statis (posisi dan orientasi, tanpa kecepatan) dan output kecepatan yang diinginkan. Output sering hanya sebuah on atau off dan arah sasaran, bergerak dengan kecepatan penuh atau menjadi stasioner. Algoritma Kinematic tidak menggunakan percepatan, meskipun perubahan mendadak dalam kecepatan mungkin merapikan lebih dari beberapa frame.
Banyak permainan menyederhanakan hal lebih jauh dan memaksa orientasi karakter untuk berada di arah itu adalah bepergian. Jika karakter stasioner, ia menghadap ke arah pra-set atau arah terakhir itu bergerak masuk Jika algoritma gerakannya mengembalikan kecepatan target, maka yang digunakan untuk mengatur orientasinya.

3.2.1 Mencari
Kinematik mencari perilaku mengambil sebagai masukan karakter dan target data statis. Ini menghitung arah dari karakter ke target dan meminta kecepatan sepanjang baris ini. Nilai orientasi biasanya diabaikan, meskipun kita dapat menggunakan fungsi Get New Orientation di atas untuk menghadapi ke arah yang kita Pindahkan.
Struktur data dan antarmuka
Kami menggunakan struktur data statis seperti yang didefinisikan pada awal bab dan struktur Kinematic steering output untuk output. Dalam rotasi algoritma ini tidak pernah digunakan; orientasi karakter hanya diatur berdasarkan gerakan mereka. Anda bisa menghapus panggilan untuk mendapatkan orientasi baru jika Anda ingin mengontrol orientasi secara independen entah bagaimana (untuk memiliki tujuan karakter pada target saat bergerak, seperti dalam Tomb Raider [Core Design Ltd., 1996], misalnya).
Kinerja
Algoritma adalah O (1) dalam waktu dan memori.


Flee
Jika kita ingin karakter untuk melarikan diri dari target, kita dapat membalik baris kedua dari metode getSteering untuk memberikan:
Karakter kemudian akan bergerak pada kecepatan maksimum dalam arah yang berlawanan.
Arriving
Algoritma di atas ditujukan untuk digunakan oleh karakter mengejar; itu tidak akan pernah mencapai tujuannya, tetapi terus mencari. Jika karakter bergerak ke titik tertentu di dunia permainan, maka algoritma ini dapat menyebabkan masalah. Karena selalu bergerak dengan kecepatan penuh, kemungkinan untuk overshoot tempat yang tepat dan menggoyangkan ke belakang dan ke depan pada frame berturut-turut mencoba untuk sampai ke sana. Sifat menggoyangkan ini terlihat tidak dapat diterima. Kita perlu mengakhiri stasioner di tempat target.
Kita dapat memodifikasi algoritma mencari untuk memeriksa apakah karakter dengan dalam radius. Jika demikian, itu tidak khawatir tentang Keluaran apa pun. Jika tidak, maka ia mencoba untuk mencapai target dalam jangka waktu yang tetap. (Kami telah menggunakan seperempat detik, yang merupakan sosok yang masuk akal. Anda dapat mengubah nilainya jika perlu.) Jika ini berarti bergerak lebih cepat daripada kecepatan maksimum, maka bergerak pada kecepatan maksimum. Waktu yang ditetapkan untuk menargetkan adalah trik sederhana yang membuat karakter melambat saat mencapai targetnya. Pada 1 unit jarak jauh itu ingin melakukan perjalanan di 4 unit per detik. Pada seperempat dari unit jarak jauh itu ingin melakukan perjalanan di 1 unit per detik, dan seterusnya. Lamanya waktu yang tetap dapat disesuaikan untuk mendapatkan efek yang tepat. Nilai yang lebih tinggi memberikan perlambatan yang lebih lembut, dan nilai yang lebih rendah membuat pengereman lebih mendadak.

3.2.2 Wandering
Perilaku kinematik mengembara selalu bergerak ke arah orientasi karakter saat ini dengan kecepatan maksimum. Perilaku kemudi memodifikasi orientasi karakter, yang memungkinkan karakter untuk berliku-liku saat bergerak maju. Gambar 3,6 mengilustrasikan ini. Karakter ditampilkan pada frame berturut-turut. Perhatikan bahwa bergerak hanya maju pada setiap frame (yaitu, ke arah yang menghadap ke frame sebelumnya).

Gambar 3.6

Struktur data
Nilai orientasi telah diberikan fungsi asVector yang mengubah orientasi menjadi vektor arah dengan menggunakan formula yang diberikan pada awal bab.
Catatan implementasi
Kami telah menggunakan randomBinomial untuk menghasilkan rotasi output. Ini adalah fungsi nomor acak berguna yang tidak umum di Perpustakaan standar bahasa pemrograman. Ini mengembalikan angka acak antara − 1 dan 1, di mana nilai sekitar nol lebih mungkin.
Untuk perilaku mengembara kami, ini berarti bahwa karakter yang paling mungkin untuk terus bergerak dalam arah saat ini. Perubahan arah yang cepat kurang mungkin, tapi masih mungkin.

3.2.3 Di situs web
Program gerakan kinematik yang merupakan bagian dari kode sumber di situs web memberi Anda akses ke berbagai algoritma gerakan yang berbeda, termasuk kinematik mengembara, tiba, mencari, dan melarikan diri. Anda cukup memilih perilaku yang ingin Anda lihat untuk masing-masing dari dua karakter. Dunia permainan toroidal: jika karakter padam salah satu ujungnya, maka karakter tersebut akan muncul kembali di sisi yang berlawanan.




3.3 Perilaku kemudi
Perilaku kemudi memperpanjang algoritma gerakan di bagian sebelumnya dengan menambahkan kecepatan dan rotasi. Mereka mendapatkan penerimaan yang lebih besar di PC dan pengembangan konsol game. Dalam beberapa genre (seperti mengemudi game) mereka dominan; dalam genre lain mereka hanya baru mulai melihat penggunaan yang serius.
Ada berbagai macam perilaku kemudi yang berbeda, sering kali dengan nama yang membingungkan dan bertentangan. Sebagai bidang telah berkembang, tidak ada skema penamaan yang jelas telah muncul untuk membedakan antara satu perilaku kemudi atom dan perilaku senyawa menggabungkan beberapa dari mereka bersama-sama.
Dalam buku ini kita akan memisahkan dua: perilaku fundamental dan perilaku yang dapat dibangun dari kombinasi ini.
Ada sejumlah besar bernama perilaku kemudi di berbagai makalah dan contoh kode. Banyak dari ini adalah variasi dari satu atau dua tema. Daripada Katalog kebun binatang dari perilaku yang disarankan, kita akan melihat struktur dasar yang umum bagi banyak dari mereka sebelum melihat beberapa pengecualian dengan fitur yang tidak biasa.

3.3.1 Kemudi dasar
Pada umumnya, perilaku yang paling kemudi memiliki struktur yang sama. Mereka mengambil sebagai masukan kinematik dari karakter yang bergerak dan jumlah terbatas informasi target. Informasi target tergantung pada aplikasi. Untuk mengejar atau menghindari perilaku, target sering karakter bergerak lain. Perilaku penghindaran rintangan mengambil representasi dari geometri tabrakan dunia. Hal ini juga memungkinkan untuk menentukan jalur sebagai target untuk jalur perilaku berikut.
Set input ke perilaku kemudi tidak selalu tersedia dalam format yang ramah AI. Tabrakan menghindari perilaku, khususnya, perlu memiliki akses ke informasi tabrakan di tingkat. Ini bisa menjadi proses yang mahal: memeriksa gerakan diantisipasi karakter menggunakan Ray atau gerakan Trial melalui tingkat.
Perhatikan bahwa perilaku kemudi tidak berusaha melakukan semuanya. Tidak ada perilaku untuk menghindari rintangan saat mengejar karakter dan membuat jalan memutar melalui Power-up di dekatnya. Setiap doesasinglethingandonlytakestheinputneededtodothat algoritma. Togetmorekomplikasi perilaku, kita akan menggunakan algoritma untuk menggabungkan perilaku kemudi dan membuat mereka bekerja sama.

3.3.2 Variabel pencocokan
Keluarga sederhana perilaku kemudi beroperasi dengan pencocokan variabel: mereka mencoba untuk mencocokkan satu atau lebih elemen dari kinematik karakter ke satu target kinematik.
Kita mungkin mencoba untuk mencocokkan posisi target, misalnya, tidak peduli dengan elemen lainnya. Hal ini akan dalam volve percepatan menuju posisi target dan perlambatan setelah kita dekat. Atau, kita bisa mencoba untuk mencocokkan orientasi target, berputar sehingga kita selaras dengan itu. Kita bahkan bisa mencoba untuk mencocokkan kecepatan target, mengikuti itu pada jalur paralel dan menyalin gerakannya tetapi tetap berada jauh.
Perilaku pencocokan variabel mengambil dua kinematika sebagai masukan: karakter kinematik dan target kinematik. Perilaku kemudi yang berbeda bernama mencoba mencocokkan kombinasi elemen yang berbeda, serta menambahkan properti tambahan yang mengontrol cara pencocokan dilakukan. Itis mungkin, tetapi tidak terlalu membantu, untuk menciptakan variabel umum pencocokan kemudi yang cocok dan hanya mengatakan bahwa kombinasi elemen yang cocok. Kami telah melihat jenis implementasi pada beberapa kesempatan.
Teknik yang lebih baik adalah memiliki algoritma pencocokan individu untuk setiap elemen dan kemudian menggabungkannya dalam kombinasi yang tepat nanti. Hal ini memungkinkan kita untuk menggunakan teknik kombinasi perilaku kemudi dalam bab ini, daripada memiliki satu keras-kode. Algoritma untuk menyisir perilaku kemudi dirancang untuk menyelesaikan konflik dan begitu sempurna untuk tugas ini.
Untuk setiap perilaku kemudi yang cocok, ada perilaku yang berlawanan yang mencoba untuk mendapatkan sejauh jauh dari pencocokan mungkin. Sebuah perilaku yang mencoba untuk menangkap targetnya memiliki kebalikan yang mencoba untuk menghindari target, dan sebagainya. Seperti yang kita lihat dalam kinematik mencari perilaku, bentuk yang berlawanan biasanya tweak sederhana untuk perilaku dasar. Kita akan melihat beberapa perilaku kemudi sebagai pasangan bersama dengan berlawanan mereka, daripada memisahkan mereka ke dalam bagian terpisah.

3.3.3 Mencari dan melarikan diri
Seek mencoba untuk mencocokkan posisi karakter dengan posisi target. Tepat seperti untuk mencari algoritma kinematik, ia menemukan arah ke target dan kepala ke arah itu secepat mungkin. Karena output kemudi sekarang menjadi akselerasi, itu akan mempercepat sebanyak mungkin.

Jelas, jika terus dipercepat, kecepatan akan tumbuh lebih besar dan lebih besar. Sebagian besar karakter memiliki kecepatan maksimum yang bisa mereka tempuh; mereka tidak dapat mempercepat tanpa batas. Maksimum dapat eksplisit, diadakan di variabel atau konstan. Kecepatan saat ini karakter (panjang vektor kecepatan) kemudian diperiksa secara teratur, dan dipangkas kembali jika melebihi kecepatan maksimum. Hal ini biasanya dilakukan sebagai langkah pasca-pemrosesan fungsi pembaruan. Hal ini tidak dilakukan dalam perilaku kemudi.
Drag juga membantu masalah lain dengan algoritma ini. Karena percepatan selalu diarahkan target, jika target bergerak, perilaku mencari akan berakhir mengoring daripada bergerak langsung ke arah itu. Jika ada hambatan dalam sistem, maka orbit akan menjadi spiral lingkungan. Jika drag cukup besar, pemain tidak akan melihat spiral dan akan melihat karakter hanya bergerak langsung ke target.
Gambar 3.7 mengilustrasikan jalan yang merupakan hasil dari perilaku pencarian dan kebalikannya, jalan yang melarikan diri, yang diuraikan di bawah ini.
Gambar 3.7

3.3.4 Arrive
Seek akan selalu bergerak menuju tujuannya dengan percepatan terbesar yang mungkin. Ini baik jika target terus bergerak dan karakter harus memberikan pengejaran dengan kecepatan penuh. Jika karakter tiba pada target, itu akan overshoot, terbalik, dan berosilasi melalui target, atau akan lebih mungkin mengorbit di sekitar target tanpa semakin dekat.
Jika karakter yang seharusnya tiba di target, perlu memperlambat sehingga tiba tepat di lokasi yang tepat, seperti yang kita lihat di algoritma tiba kinematik. Gambar 3.8 menunjukkan perilaku masing-masing untuk target tetap. Jejak menunjukkan jalan yang diambil dengan mencari dan tiba. Tiba pergi langsung ke target, sementara mencari orbit sedikit dan berakhir berosilasi. Osilasi tidak seburuk untuk pencarian dinamis seperti dalam mencari kinematik: karakter tidak dapat mengubah arah segera, sehingga muncul untuk bergetar daripada mengguncang sekitar target.

Gambar 3.8
Perilaku yang dinamis tiba sedikit lebih kompleks daripada versi kinematik. Menggunakan dua radii. Radius kedatangan, seperti sebelumnya, memungkinkan karakter mendapatkan cukup dekat dengan target tanpa membiarkan kesalahan kecil tetap bergerak. Radius kedua juga diberikan, tetapi jauh lebih besar. Karakter yang masuk akan mulai melambat saat melewati radius ini. Algoritma menghitung kecepatan ideal untuk karakter. Pada radius perlambatan-down, ini sama dengan kecepatan maksimumnya. Pada titik target, itu adalah nol (kita ingin memiliki kecepatan nol ketika kita tiba). Di antara, kecepatan yang diinginkan adalah nilai menengah interpolasi, dikendalikan oleh jarak dari target.
Arah menuju target dihitung seperti sebelumnya. Hal ini kemudian dikombinasikan dengan kecepatan yang diinginkan untuk memberikan kecepatan target. Algoritma terlihat pada kecepatan saat karakter dan bekerja di luar percepatan yang diperlukan untuk mengubahnya menjadi kecepatan target. Namun, kami tidak dapat segera mengubah kecepatan, sehingga akselerasi dihitung berdasarkan pencapaian kecepatan target dalam skala waktu yang tetap.

3.3.5 Menyelaraskan (Align)
Align mencoba untuk mencocokkan orientasi karakter dengan target. Ini tidak memberikan perhatian pada posisi atau kecepatan karakter atau target. Ingatlah bahwa orientasi tidak secara langsung berhubungan dengan arah gerakan untuk kinematik umum. Perilaku kemudi ini tidak menghasilkan percepatan linier apa pun; hanya merespon dengan memutar.
Menyelaraskan berperilaku dengan cara yang sama untuk tiba. Mencoba untuk mencapai target orientasi dan mencoba untuk memiliki nol rotasi ketika sampai di sana. Sebagian besar kode dari tiba kita bisa menyalin, tetapi orientasi memiliki kompleksitas tambahan yang perlu kita pertimbangkan.
Karena orientasi membungkus setiap radian 2 π, kita tidak bisa hanya mengurangi orientasi target dari orientasi karakter dan menentukan rotasi apa yang kita butuhkan dari hasil. Gambar 3,9 menunjukkan dua situasi sejajar yang sangat mirip, di mana karakter adalah sudut yang sama jauh dari targetnya. Jika kita hanya dikurangi dua sudut, yang pertama akan benar memutar sejumlah kecil searah jarum jam, tapi yang kedua akan melakukan perjalanan di sekitar untuk sampai ke tempat yang sama.
Gambar 3.9
Kita kemudian dapat menggunakan nilai yang dikonversi untuk mengontrol rotasi, dan algoritma terlihat sangat mirip dengan tiba. Seperti tiba, kita menggunakan dua radii: satu untuk memperlambat dan satu untuk membuat orientasi dekat target yang dapat diterima. Karena kita berhadapan dengan nilai skalar tunggal, daripada vektor 2D atau 3D, radius bertindak sebagai interval.
Kita tidak memiliki masalah seperti itu ketika kita datang untuk mengurangi nilai rotasi. Rotasi, tidak seperti orientations, don'twraparound. Youcanhavehugerotationvalues, welloutof (− π, π) kisaran. Nilai besar hanya mewakili rotasi sangat cepat.

3.3.6 Kecepatan pencocokan
Sejauh ini kita telah melihat perilaku yang mencoba untuk mencocokkan posisi dengan target. Kita bisa melakukan hal yang sama dengan kecepatan, tetapi pada sendiri perilaku ini jarang berguna. Ini bisa digunakan untuk membuat karakter meniru gerakan target, tapi ini tidak sangat berguna. Dimana hal ini menjadi kritis adalah ketika dikombinasikan dengan perilaku lain. Ini adalah salah satu konstituen dari perilaku kemudi berbondong-bondong, misalnya.
Kami telah menerapkan algoritma yang mencoba untuk mencocokkan kecepatan. Tiba menghitung kecepatan target berdasarkan jarak ke targetnya. Kemudian mencoba untuk mencapai kecepatan target. Kita dapat strip perilaku tiba ke bawah untuk menyediakan kecepatan yang cocok implementasi.



3.3.7 Delegated Behaviors
Kami telah membahas perilaku blok bangunan dasar yang membantu menciptakan banyak orang lain. Mencari dan melarikan diri, tiba, dan sejajar melakukan perhitungan kemudi untuk banyak perilaku lain.
Semua perilaku yang mengikuti memiliki struktur dasar yang sama: mereka menghitung target, baik posisi atau orientasi (mereka bisa menggunakan kecepatan tetapi tidak satupun dari mereka yang akan kita bahas) dan kemudian mereka mendelegasikan ke salah satu perilaku lain untuk menghitung kemudi. Perhitungan target dapat didasarkan pada banyak masukan. Kejar, misalnya, menghitung target untuk mencari berdasarkan gerakan target lain. Penghindaran tabrakan menciptakan target untuk melarikan diri berdasarkan kedekatan rintangan. Dan mengembara menciptakan target sendiri yang berkelok-kelok sekitar saat bergerak.
Bahkan, ia mengubah sout yang mencari, menyelaraskan, dan kecepatan yang cocok adalah satu-satunya perilaku mendasar (ada perilaku pencocokan rotasi, dengan analogi, tapi kami belum pernah melihat aplikasi untuk itu). Seperti yang kita lihat dalam algoritma sebelumnya, tiba dapat dibagi ke dalam penciptaan (kecepatan) target dan penerapan algoritma pencocokan kecepatan. Hal ini biasa terjadi. Banyak dari perilaku yang didelegasikan di bawah ini dapat, pada gilirannya, dapat digunakan sebagai dasar perilaku delegasi lain. Tiba dapat digunakan sebagai dasar mengejar, mengejar dapat digunakan sebagai dasar algoritma lainnya, dan sebagainya.
Jika kita menggunakan pendekatan delegasi, kita perlu memastikan Tha mengajarkan perilaku delegasi memiliki data karakter yang benar, maxAcceleration, dan parameter lainnya. Hal ini membutuhkan banyak duplikasi dan menyalin data yang menggunakan sub-kelas menghapus.

3.3.8 Pursue and Evade
Sejauh ini kita telah bergerak berdasarkan posisi semata. Jika kita mengejar target yang bergerak, maka terus bergerak ke arah posisinya saat ini tidak akan cukup. Pada saat kita mencapai di mana sekarang, itu akan pindah. Ini bukan terlalu banyak masalah ketika target dekat dan kami emengingat lokasinya setiap frame. Kami akan sampai di sana akhirnya. Tetapi jika karakternya jarak jauh dari targetnya, itu akan berangkat dalam arah yang salah, seperti yang ditunjukkan pada gambar 3.10.
Gambar 3.10
Algoritma bekerja sout jarak antara karakter dan target dan bekerja sout berapa lama waktu yang dibutuhkan untuk sampai ke sana, pada kecepatan maksimum. Menggunakan interval waktu ini sebagai prediksi terlihat kepala. Ini menghitung posisi target jika terus bergerak dengan kecepatan saat ini. Posisi baru ini kemudian digunakan sebagai target perilaku standar mencari.
Jika karakter bergerak lambat, atau target adalah jauh, waktu prediksi bisa sangat besar. Target kurang cenderung mengikuti jalan yang sama selamanya, jadi kami ingin menetapkan batas pada seberapa jauh ke depan tujuan kami. Algoritma memiliki parameter waktu maksimum untuk alasan ini. Jika waktu prediksi di luar ini, maka waktu maksimum yang digunakan.
Gambar 3,12 menunjukkan perilaku pencarian dan perilaku mengejar mengejar target yang sama. Perilaku mengejar lebih efektif dalam pengejaran.
Gambar 3.11

3.3.9 Face
Perilaku wajah membuat karakter melihat targetnya. Ini delegasi ke perilaku align untuk melakukan rotasi tetapi menghitung orientasi target terlebih dahulu.
Orientasi target dihasilkan dari posisi relatif target untuk karakter. Ini adalah proses yang sama yang kita gunakan dalam fungsi getOrientation untuk gerakan kinematik.

3.3.10 Looking Where You’re Going
Kami telah mengasumsikan bahwa arah karakter menghadap tidak harus menjadi arah gerak. Dalam banyak kasus, bagaimanapun, kami ingin karakter untuk menghadapi ke arah itu bergerak. Dalam gerakan kinematik algoritma kita mengaturnya secara langsung. Dengan menggunakan perilaku align, kita dapat memberikan karakter percepatan sudut untuk membuatnya menghadap ke arah yang benar. Dengan cara ini perubahan karakter yang dihadapi secara bertahap, yang dapat terlihat lebih alami, terutama untuk kendaraan udara seperti helikopter atau Hovercraft atau karakter manusia yang dapat bergerak ke samping (menyediakan animasi menghindari tersedia, tentu saja).
Ini adalah proses yang mirip dengan perilaku wajah, di atas. Orientasi target dihitung dengan menggunakan kecepatan saat ini dari karakter. Jika tidak ada kecepatan, maka orientasi target diatur ke orientasi saat ini.

3.3.11 Wander
Perilaku mengembara(wander) mengontrol karakter yang bergerak tanpa tujuan.Ketika kita melihat perilaku kinematik berkeliaran, kita terganggu arah mengembara dengan jumlah acak setiap kali itu dijalankan. Hal ini membuat karakter bergerak maju dengan lancar, namun rotasi karakter tidak menentu, muncul kedutan dari sisi ke sisi saat bergerak (Jalankan Kinematic steering program dalam kode sumber di situs web untuk melihatnya dalam tindakan).
Ide awal ini untuk perilaku mengembara (bergerak dalam arah acak) memberikan jerkiness linear. Versi kinematik menambahkan lapisan tipuan dan menghasilkan jerkiness rotasional. Kita dapat menghaluskan berkedut ini dengan menambahkan lapisan tambahan, membuat orientasi karakter tidak langsung bergantung pada nomor acak generator.
Karakter mencoba untuk menghadapi target dalam setiap frame, menggunakan perilaku wajah untuk menyelaraskan target. Kemudian menambahkan langkah ekstra: menerapkan akselerasi penuh ke arah orientasi saat ini.
Kami juga dapat menerapkan perilaku tersebut dengan membuatnya mencari target dan melakukan tampilan di mana Anda akan melakukan perilaku untuk mengoreksi orientasinya.
Dalam kedua kasus, orientasi karakter dipertahankan antara panggilan (sehingga menghaluskan perubahan dalam orientasi). Engles bahwa tepi lingkaran dibatasi untuk karakter menentukan seberapa cepat itu akan berubah. Jika target pada salah satu poin ekstrim, itu akan berubah dengan cepat. Target akan kedutan dan jitter di sekitar tepi lingkaran, tetapi orientasi karakter akan berubah dengan lancar.
3.3.12 Path Following
Jalur berikut(Path Following), seperti biasanya dilaksanakan, adalah perilaku delegasi. Ini menghitung posisi target berdasarkan lokasi karakter saat ini dan bentuk jalur. Kemudian tangan targetnya untuk mencari. Tidak perlu menggunakan tiba, karena target harus selalu bergerak sepanjang jalan. Kita tidak perlu khawatir tentang karakter penangkapan dengan itu.
Posisi target dihitung dalam dua tahap. Pertama, posisi karakter saat ini dipetakan ke titik terdekat di sepanjang jalur. Ini mungkin proses yang kompleks, terutama jika jalan melengkung atau terdiri dari banyak segmen garis. Kedua, target dipilih yang lebih jauh di sepanjang jalur daripada titik yang dipetakan oleh jarak tetap. Untuk mengubah arah gerakan di sepanjang jalur, kita dapat mengubah tanda jarak ini. Gambar 3.12 menunjukkan tindakan ini. Lokasi jalur saat ini ditampilkan, bersama dengan titik target sedikit jauh di sepanjang jalan. Pendekatan ini
Gambar 3.12
terkadang disebut "mengejar kelinci," setelah jalan grayhounds mengejar kelinci kain di trek anjing.
Beberapa implementasi menghasilkan target sedikit berbeda. Mereka pertama memprediksi di mana karakter akan berada dalam waktu singkat dan kemudian memetakan ini ke titik terdekat di jalan. Ini adalah target kandidat. Jika target kandidat baru belum ditempatkan lebih jauh di sepanjang jalur daripada pada frame terakhir, maka itu berubah sehingga. Kita akan memanggil jalur prediktif berikut. Hal ini ditunjukkan pada gambar 3,16. Implementasi yang terakhir ini dapat tampak lebih mulus untuk jalur yang kompleks dengan perubahan arah yang mendadak, namun memiliki sisi negatifnya dari sudut pemotongan ketika dua jalur mendekat bersama-sama.
Gambar 3.13
3.3.13 Separation
Perilaku pemisahan(Separation) adalah umum dalam simulasi kerumunan, di mana sejumlah karakter semua menuju dalam arah yang sama. Ini bertindak untuk menjaga karakter dari mendapatkan terlalu dekat dan menjadi ramai.
Ini tidak bekerja dengan baik ketika karakter bergerak di jalur masing-masing. Tabrakan menghindari perilaku, di bawah ini, harus digunakan dalam kasus ini.
Sebagian besar waktu, perilaku pemisahan memiliki output nol; itu tidak merekomendasikan gerakan sama sekali. Jika perilaku mendeteksi karakter lain lebih dekat dari beberapa ambang batas, itu bertindak dengan cara yang mirip dengan perilaku menghindari untuk menjauh dari karakter. Tidak seperti perilaku dasar menghindari, bagaimanapun, kekuatan gerakan terkait dengan jarak dari target. Kekuatan pemisahan dapat menurunkan sesuai dengan formula apapun, tetapi garis yang linier atau invers peluruhan hukum adalah umum.
Pemisahan ini kadang disebut dengan "repulsi kemudi" perilaku, karena bertindak dengan cara yang sama sebagai gaya repulsif fisik (sebuah gaya hukum persegi terbalik seperti repulsi magnetik).
Dimana ada beberapa karakter dalam ambang penghindaran, kemudi dihitung untuk masing-masing pada gilirannya dan disimpulkan. Nilai akhir mungkin lebih besar dari maxAcceleration, dalam hal ini dapat dijepit ke nilai itu.

3.3.14 Collision Avoidance
Di daerah perkotaan, adalah umum untuk memiliki sejumlah besar karakter bergerak di sekitar ruang yang sama. Karakter ini memiliki lintasan yang saling silang, dan mereka perlu menghindari tabrakan konstan dengan karakter bergerak lainnya.
Pendekatan sederhana adalah dengan menggunakan variasi dari menghindari atau pemisahan perilaku, yang hanya terlibat jika target adalah dalam kerucut di depan karakter.
Jika ada beberapa karakter dalam kerucut, maka perilaku perlu menghindari mal. Hal ini sering cukup untuk menemukan posisi rata dan kecepatan dari semua karakter dalam kerucut dan menghindari target. Atau, karakter terdekat dalam kerucut dapat ditemukan dan sisanya diabaikan.
Perhatikan bahwa pendekatan terdekat tidak akan biasanya sama dengan titik di mana lintasan masa depan silang. Karakter mungkin bergerak pada kecepatan yang sangat berbeda, dan kemungkinan besar akan mencapai titik yang sama pada waktu yang berbeda. Kita tidak bisa melihat apakah jalan mereka akan menyeberang untuk memeriksa apakah karakter akan bertabrakan. Sebaliknya, kita harus menemukan saat bahwa mereka berada di terdekat mereka, menggunakan ini untuk memperoleh pemisahan mereka, dan memeriksa apakah mereka bertabrakan.

3.3.15 Obstacle and Wall Avoidance
Tabrakan penghindaran mengasumsikan bahwa target adalah bulat. Hal ini tertarik untuk menghindari terlalu dekat dengan titik pusat target. Hal ini juga dapat diterapkan untuk setiap rintangan dalam permainan yang mudah diwakili oleh lingkup pembatas. Peti, barel, dan benda kecil dapat dihindari dengan cara ini.
Hambatan yang lebih kompleks tidak dapat dengan mudah diwakili dengan cara ini. Ruang lingkup benda besar, seperti tangga, dapat mengisi Ruangan. Kami tentu tidak ingin karakter menempel di luar ruangan hanya untuk menghindari tangga di sudut. Sejauh ini hambatan yang paling umum dalam permainan, dinding, tidak dapat hanya diwakili oleh lingkaran pembatas sama sekali.
Kendala dan perilaku penghindaran dinding menggunakan pendekatan yang berbeda untuk menghindari tabrakan. Karakter bergerak melemparkan satu atau lebih sinar di arah gerak. Jika sinar ini bertabrakan dengan rintangan, maka target dibuat yang akan menghindari tabrakan, dan karakter melakukan pencarian dasar pada target ini. Biasanya, sinar tidak terbatas. Mereka memperpanjang jarak pendek di depan karakter (biasanya jarak yang sesuai dengan beberapa detik gerakan).










3.3.16 Summary
Gambar 3.14
Gambar 3.14 menunjukkan pohon keluarga dari perilaku kemudi kita telah melihat di bagian ini. Kami telah menandai perilaku kemudi sebagai anak dari orang lain jika dapat dilihat sebagai memperluas perilaku induknya.