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.
![](file:///C:/Users/marthin/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)
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.
![](file:///C:/Users/marthin/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg)
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.
![](file:///C:/Users/marthin/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg)
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.
![](file:///C:/Users/marthin/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg)
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:
![](file:///C:/Users/marthin/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg)
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.
![](file:///C:/Users/marthin/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg)
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:
![](file:///C:/Users/marthin/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg)
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).
![](file:///C:/Users/marthin/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg)
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.
![](file:///C:/Users/marthin/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg)
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.
![](file:///C:/Users/marthin/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg)
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.
![](file:///C:/Users/marthin/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg)
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.
![](file:///C:/Users/marthin/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg)
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.
![](file:///C:/Users/marthin/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg)
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
![](file:///C:/Users/marthin/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg)
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.
![](file:///C:/Users/marthin/AppData/Local/Temp/msohtmlclip1/01/clip_image030.jpg)
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
![](file:///C:/Users/marthin/AppData/Local/Temp/msohtmlclip1/01/clip_image032.jpg)
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.
Tidak ada komentar:
Posting Komentar