Penyederhanaan yang umum adalah merobohkan 3D menjadi 2D. Meskipun rendering dan fisika mungkin benar-benar 3D, logika pengambilan keputusan tidak harus memperlakukan ketiga sumbu secara sama. Trek MotoGP memiliki beberapa bukit, sehingga AI kami dapat mengabaikan komponen y.
Selanjutnya, kami beralih dari koordinat kartesius x / z ke sistem trek-relatif. Posisi diwakili oleh sepasang nilai:
int distance = seberapa jauh di sekitar trek, disimpan dalam format 16.16 titik tetap
- 0 = garis awal
- 0x8000 = setengah jalan
- 0x10000 = diulang kembali ke awal
- 0x1C000 = tiga perempat jalan melalui lap kedua
float cross = seberapa jauh menyamping melintasi trek 0 = pada garis tengah
- -1 = tepi kiri permukaan balap
- 1 = tepi kanan permukaan balap
Untuk mengkonversi antara ini dan koordinat kartesius yang digunakan oleh fisika dan kode render kami, kami menyimpan daftar segmen yang menentukan bentuk permukaan balap: struct TrackSegment {Vector CenterPoint; float DistanceToLeftEdge; float DistanceToRightEdge; }
Kami menciptakan beberapa ratus struktur ini, dengan jarak yang sama di sekitar trek, dengan mengesampingkan kurva Bezier dari mana trek awalnya dibuat. Ini memberi kami informasi yang cukup untuk menulis fungsi konversi koordinat yang diperlukan.
Dengan koordinat trek-relatif, banyak perhitungan berguna menjadi sangat mudah:
if (abs(cross) > 1)
// You are off the track and should steer back toward the center line
if (this.distance > other.distance)
// You are ahead of the other player (even though you may be
// physically behind in 3D space if you have lapped them)
short difference = (short)(this.distance - other.distance);
if (abs(difference) < threshold)
// These two bikes are physically close together,
// so we should run obstacle avoidance checks
Karena format data titik tetap, casting penghitung jarak dari 32 ke 16 bit adalah cara mudah untuk membuang angka putaran, sehingga kami dapat memilih dan memilih perhitungan mana yang dipedulikan jika dua sepeda berada di pangkuan yang berbeda, dibandingkan ingin tahu apakah mereka dekat dalam ruang fisik. Berkat keajaiban pujian dua, memperlakukan perbedaan seperti yang ditandatangani 16 bit memberikan jarak terpendek terlepas dari sepeda yang ada di depan (ingat bahwa dalam sistem modulo aritmatika seperti pacuan kuda looping ada dua kemungkinan jarak, karena Anda dapat mengukur di baik arah di trek). Ini bekerja bahkan ketika kedua sepeda berada di sisi berlawanan dari garis start, situasi yang akan membutuhkan logika kasus rawan kesalahan khusus di sebagian besar sistem koordinat lainnya.
Meratakan dan meluruskan area permainan virtual ini membuatnya mudah untuk berpikir tentang hal-hal seperti "Apakah saya di jalur balap?" atau "Saya naik cepat di belakang motor lain ini: apakah saya punya lebih banyak ruang untuk melewatinya di kiri atau kanan?" yang akan sulit untuk diterapkan dalam ruang dunia 3D penuh. Begitu kami memutuskan untuk melintas di sebelah kiri, kami akan mengonversi koordinat relasi yang dihasilkan kembali ke ruang dunia, di mana titik kelengkungan trek diperhitungkan, menunjukkan bagaimana kita harus mengarahkan untuk mencapai tujuan yang kita pilih.