Saya bertanya-tanya bagaimana tabrakan di beberapa game balap mobil 3d sederhana dilakukan (terutama di game seperti Outrun 2 / Motoracer).
Dalam permainan balap mobil klasik dengan lingkungan yang kompleks (dunia terbuka), saya kira ini dilakukan dengan kotak dasar (untuk mobil) untuk tabrakan pesawat (untuk trek, bangunan dan hal-hal lain). Semuanya akan dioptimalkan menggunakan beberapa kotak pembatas (ini adalah cara tabrakan dilakukan di banyak game).
Dalam game seperti Outrun 2 / Motoracer, gameplaynya sangat sederhana sehingga pengembang mungkin tidak membutuhkannya dan semuanya bisa disederhanakan banyak. Bagi mereka yang tidak pernah memainkannya, inilah yang sangat spesifik:
- Mobil / sepeda selalu terpaku di jalan.
- Ukuran jalan selalu sama dan memiliki bentuk yang sangat sederhana.
- Satu-satunya kemungkinan adalah mengikuti jalan itu, tidak mungkin untuk meninggalkan jalan, atau bertabrakan dengan sesuatu yang lain (kecuali mobil / sepeda lain tetapi kami tidak peduli).
- Ketika Anda bertabrakan dengan jalan, tabrakan arcade yang sangat mendasar dilakukan (mobil hanya didorong menjauh darinya)
Beginilah menurut saya tabrakan (bisa) dilakukan:
Seluruh trek bisa dianggap sebagai kurva bezier 3d raksasa. Dari kurva itu, poligon jalan dapat dihasilkan (menggunakan vektor depan, kiri dan atas yang dihasilkan dari kurva). Elemen-elemen lain (seperti rumah, pohon, ...) dapat juga ditempatkan dan disejajarkan menggunakan metode ini.
Kemudian, untuk menangani tabrakan (dan menggambar mobil):
1) Temukan posisi terdekat pada kurva 3d dari posisi 3d mobil saat ini. Dengan kata lain, ubah posisi mobil 3d menjadi posisi kurva bezier. Setiap posisi 3d di jalan dapat dianggap sebagai perpindahan sepanjang kurva 3d ( t
) + perpindahan lateral ( d
). Periksa gambar di bawah ini jika tidak jelas (ini adalah contoh 2d tapi ini berlaku untuk 3d dengan mudah).
ketika t = 0 mobil di awal bagian lintasan, ketika t = 1 mobil di akhir. ketika d = -1 atau 1 mobil berada di perbatasan lintasan, ketika d = 0 mobil berada di tengah jalan
2) sejajarkan mobil ke jalan menggunakan t
dan d
(sangat sederhana: untuk apa pun t
dan d
nilai - nilai saya bisa mendapatkan posisi 3d + vektor atas / depan / kiri). mobil sekarang terpaku di jalan
3) periksa perpindahan lateral d
mobil. jika nilainya terlalu besar (d > 1)
atau rendah, (d < -1)
mobil berada di luar jalur. hanya klip itu untuk meletakkan mobil di tempat yang benar.
Ini juga membuat pemusnahan 3d menjadi sangat sederhana, cukup tarik trek dari t
posisi mobil saat ini ke t + some_big_enough_value_to_avoid_visible_clipping
.
Atau mungkin saya benar-benar salah: akan jauh lebih cepat dan sederhana untuk hanya memeriksa tabrakan mobil (kotak pembatas) dan satu set poligon yang sangat sederhana yang mewakili trek (tanpa bangunan dan semacamnya). Dunia 3d (dan model tumbukan yang dihasilkan) hanya akan dihasilkan sebelumnya, menggunakan beberapa alat pihak ke-3 (tidak ada lagi kurva 3d saat menjalankan game, hanya sekelompok poligon).
sumber
Dalam pembalap OpenGL saya, saya awalnya mulai dengan menggunakan dua lingkaran untuk menentukan batas trek, tapi sepertinya terlalu merepotkan. Saya hanya menggunakan glReadPixel untuk membaca warna piksel. Jika mobil pemain melebihi piksel hijau (rumput berwarna), maka pergerakannya semakin terbatas. Ada sedikit efek pada kinerja.
sumber