Di mana karakter saya akan berhenti?

12

Bertahun-tahun yang lalu saya mengkodekan beberapa AI untuk game pseudo-3d anggaran. Ada satu perhitungan yang saya tidak pernah benar-benar menemukan cara terbaik untuk melakukannya, dan itu menghitung di mana musuh akan berakhir jika berhenti sekarang. Sebagai contoh:

  • Musuh saat ini di X = 540.0.
  • Musuh bergerak dengan kecepatan 10 piksel per frame.
  • Ketika musuh ingin berhenti, kecepatannya akan turun 1 pixel per frame hingga mencapai nol.

Apakah ada formula sederhana yang akan membuat saya berada di posisi di mana musuh berakhir ketika dia sepenuhnya berhenti? Saya akhirnya menghitung ulang dan meng-hardcoding offset yang bekerja untuk kebutuhan saya tetapi harus dihitung secara terpisah untuk musuh dengan kecepatan yang berbeda.

Kaivosukeltaja
sumber

Jawaban:

7

Saya biasanya setuju dengan jawaban John. Saya akan menawarkan formula yang sedikit dimodifikasi (yang menambahkan V / 2 tambahan nilainya):

D = V / A * (V + A) / 2 

Dengan V = 10dan A = 1, itu mendapat D = 55. Ini persis hasil dari

10 + 9 + 8 + 7 + .... + 3 + 2 + 1

yang merupakan gerakan frame-by-frame dari musuh.

Ini semacam cara Anda mencapai langkah itu.

  1. V : Kecepatan Saat Ini = 10 piksel / bingkai, A : Akselerasi Saat Ini = 1 piksel / bingkai ^ 2
  2. T : Saatnya Menghentikan = V / A = 10 frame.
  3. Jarak yang ditempuh dalam 10 frame = frame1 + frame2 + frame3 + ... = V + (VA) + (V-2 * A) + ...
  4. Ini sama dengan T * V - A / 2 * T * (T-1), yang menyederhanakan persamaan di atas.
Jimmy
sumber
+1 Saya tidak bisa melihat kesalahan logika apa pun dalam solusi Anda, dan saya benar-benar tidak ingat bagaimana saya menemukan solusi saya. Jadi ekspresi saya pasti salah dan saya mungkin tidak memperhatikan karena perbedaan kecil dan kurangnya pengujian rinci? Apakah ekspresi saya menjadi benar jika saya hanya menambahkan setengah dari kecepatan?
John McDonald
Saya menjawab pertanyaan saya sendiri menggunakan power calc. Mengambil ekspresi saya + (v / 2) tampaknya selalu sama dengan ekspresi Anda untuk v dan a.
John McDonald
Terima kasih kepada @John dan Anda, ini akan menyelamatkan saya dari banyak upaya di masa lalu! Saya menerima jawaban ini, karena lebih sederhana dan lebih efisien tetapi jawaban John juga sangat dihargai. Cheers guys!
Kaivosukeltaja
6

Saya memiliki masalah yang sama persis ketika mengerjakan game saya, dan butuh selamanya untuk mendapatkan matematika yang benar (bleh). Jadi begini:

minDistanceToStop = 0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0);

Ditulis ulang ke dalam matematika reguler:

(Acceleration / 2) * (linearVelocity / Acceleration)^2

Di mana akselerasi dalam kasus Anda adalah 1, dan linearVelocity adalah 10:

(1 / 2) * (10 / 1)^2
= 50 units to stop

EDIT

Hasil dan penjelasan Jimmy keduanya benar. Formula saya mengharuskan Anda juga menambahkan setengah dari kecepatan.

minDistanceToStop = (0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0)) + (velocityLinear() / 2);

atau

((Acceleration / 2) * (linearVelocity / Acceleration)^2) + (linearVelocity / 2)
((1 / 2) * (10 / 1)^2) + (10 / 2)
= 55
John McDonald
sumber
2
Sebagai catatan, Math.Pow () adalah ide yang sangat buruk di sini. Ini mungkin khusus kasus '2.0' eksponen jika itu cukup pintar, tapi cara apapun yang Anda mengiris itu, menulis ulang bahwa ekspresi sebagai '0,5 * linearVelocity * linearVelocity / Percepatan' harus menang besar.
Steven Stadnicki
4

Perhitungan tentang mengubah kecepatan adalah seluruh titik kalkulus. Saya belum melakukannya dalam beberapa saat jadi saya tidak ingat dari atas kepala saya, tapi saya pikir situasi Anda hanya mengambil integral dari -1 (mis. Deselerasi).

jhocking
sumber
0

Bukankah ini gerakan percepatan yang konstan?

X = Xi + V*t + (1/2) * a * (t^2)

Di mana:
X: Posisi terakhir
Xi: Posisi awal
V: Kecepatan
t: Waktu
a: Akselerasi

Satu-satunya bagian yang sulit di sini adalah bagaimana menentukan "t", karena kita melambat dengan akselerasi -1, maka kita dapat menghitung t = V / a, lalu t adalah 10.

jadi,
Xi: 540
V: 10
t: 10
a: -1

Kenakan semuanya:

X = 540 + 10*10 + (1/2) * (-1) * (10 ^ 2) 
X = 540 + 100 + (-50) 
X = 540 + 50 
X = 590

Rumus berasal dari dengan mengambil integrasi percepatan: Periksa di sini

tesla
sumber