Saya memiliki sprite yang telah Velocity
dan Position
, disimpan sebagai Vector2
. Pada setiap Update
siklus, kecepatan ditambahkan ke posisi.
Saya ingin memberikan sprite vektor ketiga Target
,. Target baru dapat diberikan pada setiap iterasi. Saya ingin sprite pada dasarnya bergerak dalam pola berjalan acak, namun dua parameter harus diekspos:
- Jalan acak tipikal memiliki kemungkinan yang sama untuk menambah atau mengurangi jarak ke setiap
Target
gerakan yang diberikan (ditambah sedikit peluang gerakan tangensial). Saya harus bisa membiasakan jalan acak saya sehingga, sementara masih acak, arah sprite "memutuskan" harus lebih cenderung membawanya lebih dekatTarget
. - Jalan acak harus "mulus" - sprite tidak boleh dengan cepat mengubah arah, karena ini akan terlihat seperti "berkedip" atau "gemetar" ke pemain. Seharusnya secara bertahap membelok ke arah ini atau itu, bergerak secara acak, sementara perlahan semakin dekat ketika rata-rata.
Apa cara yang baik dan sederhana untuk melakukan ini? Jika memungkinkan, berikan jawabannya sebagai Vector2 RandomWalk(Vector2 target)
metode.
Saya sudah memiliki NextGaussian(mean, stdev)
metode yang tersedia, jika itu membantu.
xna
c#
random
linear-algebra
Hebat
sumber
sumber
Jawaban:
Saya akan mengambil kemudi-perilaku "berkeliaran" (kode sumber dapat ditemukan di sini ) dan men-tweak dengan cara sehingga angka acak bias terhadap target Anda.
sumber
Untuk mendapatkan jalan acak yang mulus, Anda bisa menggunakan splines Catmull-Rom . Spline semacam ini mengambil urutan titik dan menghasilkan kurva halus yang melewati setiap titik. Jadi, Anda bisa membuat titik arah acak agar sprite dapat bergerak dan menghidupkannya di sepanjang garis spline Catmull-Rom melalui titik arah. Agar spline berfungsi, Anda membutuhkan total empat titik arah: dua sebelumnya dan dua berikutnya. Saat sprite mencapai titik lewat, buang yang tertua dari empat set Anda dan hasilkan yang baru, kemudian lanjutkan animasi di sepanjang spline.
Adapun akhirnya menuju target, satu ide adalah untuk mengimbangi distribusi jalan acak menuju target. Misalnya, jika Anda biasanya memilih titik jalan acak menggunakan distribusi Gaussian yang berpusat pada posisi sprite Anda saat ini, Anda dapat mengimbangi pusat Gaussian dengan jarak yang telah ditentukan sebelumnya ke target. Ukuran relatif dari offset dan standar deviasi Gaussian akan menentukan seberapa bias gerakannya.
sumber
Ini adalah sesuatu yang saya hasilkan dalam 20 menit. Kami mengambil arah dari walker ke target, memilih arah dalam jumlah derajat tertentu dari arah itu (jumlah yang menurun ketika walker semakin mendekati target mereka). Algoritma ini juga memperhitungkan jarak ke target sehingga tidak akan melewati target. Singkatnya, pada dasarnya goyangan ke kiri dan kanan sedikit acak dan rumah pada target karena semakin dekat.
Untuk menguji algoritma ini, saya menempatkan walker di (10, 0, 10), dan target di (0, 0, 0). Pertama kali algoritme dijalankan, secara acak memilih posisi walker untuk berjalan ke (3.73f, 0, 6.71f). Setelah walker mencapai posisi yang dipilihnya (2.11f, 0, 3.23), lalu (0.96f, 0, 1.68f), lalu (0.50f, 0, 0.79f), lalu berjalan lurus ke target karena berada dalam jangkauan. jarak toleransi minimum.
Dipetakan dari pandangan mata burung, jalan akan terlihat seperti titik-titik pada gambar di bawah ini, mulai dari 'W' (walker) dan berakhir pada 'T' (target). Jika Anda menginginkan gerakan yang lebih alami, Anda akan melakukan precalcuate beberapa poin sebelumnya, dan membuat spline, memberi Anda lebih banyak poin yang bisa diikuti oleh walker. Saya telah memperkirakan seperti apa jalan ini setelah dibuat menjadi spline, dan itu diwakili oleh garis dalam gambar.
Dan inilah contoh kode:
Berdasarkan permainan spesifik Anda, Anda dapat mengubah jarak, FOV, keacakan, dan frekuensi bahwa ini dijalankan, sampai sesuai dengan kebutuhan Anda. Saya yakin algoritme dapat dibersihkan sedikit dan dioptimalkan, saya tidak menghabiskan banyak waktu untuk itu, saya hanya ingin itu mudah dibaca.
sumber