Menentukan posisi objek sepanjang kurva dari waktu ke waktu


8

Saya memiliki beberapa objek dalam permainan saya yang "dilempar". Saat ini saya mencoba menerapkan ini dengan meminta benda-benda ini mengikuti kurva parabola. Saya tahu titik awal, titik akhir, titik dan kecepatan objek.

  1. Bagaimana saya bisa menentukan pada waktu atau kerangka tertentu apa koordinat x & y itu?
  2. Apakah kurva parabola bahkan merupakan kurva yang tepat untuk digunakan?

Masukan Anda ambigu. Saya menganggap simpul berarti posisi menatap. Dan titik akhir berarti posisi akhir. Apa artinya kecepatan? Seberapa jauh objek tersebut dapat berjalan dalam sedetik? Apakah kecepatan berapa lama waktu yang dibutuhkan objek untuk mulai dari awal hingga akhir?
deft_code

Permintaan maaf karena tidak jelas. Saya akan mencoba membuatnya sederhana - Saya ingin membuat bola bergerak dari satu sisi layar (x = 0) ke sisi lain (x = 480), mulai dari y = 0, dan mencapai maksimum y = 320 (setengah jalan, x = 240). Saya ingin melakukan ini lebih dari 2 detik. Dari informasi ini, dapatkah saya menentukan dari rumus koordinat x dan y saya untuk setiap frame?
Ben Williams

Jawaban:


4

Apa yang Anda cari plot parametrik dari fungsi parabola. Paling mudah untuk membuat fungsi parametrik menggunakan rentang p ∈ [0,1].

Bentuk kanonik untuk parabola parametrik adalah

k: = konstanta
f_x (p) = 2kp
f_y (p) = kp²

Menggunakan rumus ini dan beberapa aljabar dasar untuk fungsi morphing dan saya dapat

p ∈ [0,1] → x, y ∈ [0,1]
atau dengan kata lain menjaga p antara 0 dan 1 dan x, y juga antara 0 dan 1.
x = p
y = 4p - 4p²

Jadi untuk mendapatkan fungsi-fungsi ini akan menghasilkan angka yang Anda cari.

float total_time = 2;
float x_min = 0;
float x_max = 480;
float y_min = 0;
float y_max = 320;

float f_x( float time )
{
   float p = time/total_time;
   return x_min + (x_max-x_min)*p;
}

float f_y( float time )
{
   float p = time/total_time;
   return y_min + (y_max-y_min)*(4*p-4*p*p);
}

notasi Anda sedikit membingungkan. Anda f_xmenggunakan f_yakselerasi s asebagai setengah kecepatannya? Anda harus membuatnya x(t) = x0 + vx0*tdany(t) = y0 + vy0*t + .5*ay*t*t
Tobias Kienzler

Saya sengaja tidak menggunakan rumus gerak euler. adan thanya nama yang dipilih dengan buruk. Anda harus memperhatikan bahwa tidak ada komponen kecepatan dalam formula. Gerak euler dan parabola parametrik bukan hal yang sama, tetapi mereka sangat mirip karena penerbangan balistik melacak jalur parabola.
deft_code

4

Menemukan persamaan kurva yang Anda inginkan agar objek Anda bergerak adalah salah satu cara untuk mencapai apa yang Anda inginkan, tetapi mungkin bukan yang terbaik.

Sebagai gantinya, seseorang biasanya melacak properti lokal dari suatu objek (kecepatan, akselerasi) dan kemudian menggunakan nilai-nilai ini untuk memperbarui posisi objek setiap frame.

Karena Anda menyebutkan parabola saya berasumsi bahwa Anda melempar bola dalam 2D ​​dan Anda ingin jatuh di sepanjang sumbu y. Jadi, objek Anda memiliki akselerasi konstan dalam arah-y (sebut saja g) dan tidak ada akselerasi dalam arah-x. Ketika benda itu dilemparkan diberi kecepatan, mari kita sebut itu vxdan vy.

Lalu, setiap frame aplikasi Anda, Anda akan menambahkan akselerasi objek ke kecepatannya, dan kemudian menambahkan kecepatannya ke posisinya. Sesuatu seperti:

vy += g;
x += vx;
y += vy;

Lakukan ini setiap frame dan bola Anda akan mulai bergerak. Ada banyak lagi yang perlu diketahui tentang ini, tapi ini awal.


Saya melempar bola dalam 2D, tetapi bola memang memiliki akselerasi dalam arah x. Saya ingin itu dilemparkan dari satu sisi layar ke sisi lain (lihat komentar pada pertanyaan asli). Saya mengerti cara memperbarui berdasarkan vx dan vy, tetapi saya tidak yakin bagaimana memperbarui nilai-nilai itu sendiri.
Ben Williams

2
@ Ben Williams Anda hanya perlu mengatur vx dan vy di awal. Dan tambahkan gravitasi ke setiap frame. Anda juga bisa mengalami gesekan dengan mengalikan vx dan vy dengan angka di bawah 1 (kira-kira 0,95 mungkin bekerja tergantung pada frame rate Anda). Cari di google "bouncing ball YourProgrammingLanguageHere" dan Anda mungkin akan mendapatkan beberapa tutorial dasar, tetapi bermanfaat.
AttackingHobo

3
Sebenarnya, jika Anda tahu bahwa objek Anda mengikuti lintasan parabola, itu jauh, jauh lebih baik untuk mengimplementasikannya sebagai fungsi kurva, daripada langkah-langkah fisik yang terpisah. Ya, ini bisa 'lebih sulit' untuk kode pada awalnya, tetapi hasilnya adalah bahwa pergerakan objek Anda menjadi dipisahkan dari masalah frame-rate.
Blair Holloway

1
Saya kedua
@ Blair


0

Dalam permainan konsol, kita sering menggunakan Interpolasi Bicubic untuk menyelesaikan masalah ini. Pertama, sampel posisi objek secara berkala t. Untuk proyektil, tambahkan percepatan gravitasi [0, dy / dt / dt] ke kecepatannya [dx / dt, dy / dt] pada setiap interval. Rekam semua koordinat [x, y] yang dihasilkan dalam array.

Kemudian, untuk merekonstruksi posisi objek [x, y] untuk t yang diberikan, baca empat sampel yang paling dekat dengan t dari buffer yang Anda rekam: [t-1, t, t + 1, t + 2]. Blender keempat sampel sesuai dengan koefisien dalam artikel wikipedia tertaut untuk mendapatkan gerakan halus di ruang angkasa.

Ini tidak seakurat secara fisik seperti melakukan perhitungan fisika saat bepergian tetapi memungkinkan lisensi artistik dan skala ekonomis untuk membantu simulasi Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.