Tentukan panjang busur dari spline Catmull-Rom untuk bergerak dengan kecepatan konstan

18

Saya memiliki jalur yang ditentukan oleh gabungan splines Catmull-Rom. Saya menggunakan metode statis Vector2.CatmullRom di XNA yang memungkinkan untuk interpolasi antara titik-titik dengan nilai dari 0 ke 1.

Tidak setiap spline di jalur ini memiliki panjang yang sama. Ini menyebabkan perbedaan kecepatan jika saya membiarkan bobot bergerak pada kecepatan konstan untuk setiap spline saat melanjutkan sepanjang jalur. Saya dapat memperbaiki ini dengan membiarkan kecepatan berat tergantung pada panjang spline. Bagaimana saya bisa menentukan panjang spline seperti itu? Haruskah saya memperkirakan dengan memotong spline menjadi 10 garis lurus dan menjumlahkan panjangnya?

Saya menggunakan ini untuk pemetaan tekstur dinamis pada jala yang dihasilkan ditentukan oleh splines.

Wouter
sumber

Jawaban:

25

Sepertinya Anda ingin menjaga kecepatan objek pada beberapa nilai konstan pada seluruh kurva - mengetahui panjang busur tidak akan membantu Anda melakukan ini. Ini akan membantu Anda menghitung pada waktu apa objek akan mencapai titik akhirnya jika bergerak dengan kecepatan itu, jadi itu akan lebih baik daripada apa yang Anda miliki sekarang (objek akan memiliki kecepatan rata-rata yang sama antara semua titik), tetapi kecepatan aktual objek masih akan bervariasi saat bergerak di sekitar kurva.

Solusi yang lebih baik adalah dengan mengubah parameter parametrik kami (parameter yang berubah dari 0 menjadi 1, yang akan saya panggil suntuk menghindari kebingungan t = time) pada laju variabel ds/dt, yang ditentukan oleh kecepatan apa yang Anda inginkan dari objek yang akan dipindahkan. titik itu pada kurva. Jadi dengan kata lain, alih-alih mengubah s0,01 setiap frame, kita dapat mengubahnya dengan 0,005 satu frame, 0,02 berikutnya, dll.

Kami melakukan ini dengan menghitung turunan dari x( dx/ds) dan y( dy/ds) setiap frame, lalu pengaturan

ds / dt = kecepatan / sqrt ((dx / ds) 2 + (dy / ds) 2 )

Yaitu, dengan mengambil kecepatan yang ingin kita tuju, dan membaginya dengan kecepatan yang sebenarnya kita tuju jika kita berubah sdengan kenaikan tetap.


Bukti

Kami ingin kecepatan objek kami konstan; mari kita beri nama konstanta itu speed.

Kita belajar dalam kalkulus tahun kedua itu, untuk persamaan parametrik x(s)dan y(s),

kecepatan = sqrt ((dx / dt) 2 + (dy / dt) 2 )

Kami juga belajar itu

dx / dt = dx / ds * ds / dt     (aturan rantai)

Jadi,

kecepatan = sqrt ((dx / ds) 2 (ds / dt) 2 + (dy / ds) 2 (ds / dt) 2 )

Memecahkan untuk ds/dt, kita mendapatkan persamaan yang dinyatakan.


Menghitung turunannya

Saya tidak pernah bekerja dengan splines khusus itu, tapi saya mengerti mereka hanya memberi x(s)dan y(s)dalam hal persamaan kubik s. Dengan demikian, kita dapat menemukan turunannya dx/dsdengan mudah: jika

x (s) = a * s 3 + b * s 2 + c * s + e

kemudian

dx / ds = 3a * s 2 + 2b * s + c

(Sama untuk dy/ds) Tentu saja, Anda harus tahu nilai-nilai yang tepat dari a, b, dan cuntuk melakukan hal ini. Menurut halaman ini , nilai-nilai itu mudah ditemukan.


Akhirnya, untuk menjawab pertanyaan dalam judul: menemukan persamaan panjang busur dari fungsi parametrik melibatkan penyelesaian integral tertentu yang cukup rumit ; bahkan untuk kasus sederhana dari persamaan kubik, ini umumnya tidak dapat dilakukan.

Dengan demikian, Anda harus memperkirakan integral secara numerik . "Memotong spline menjadi 10 garis lurus dan menjumlahkan panjangnya" seperti yang Anda sarankan adalah salah satu cara yang sangat sederhana untuk melakukan ini ; namun, ada metode yang sedikit lebih rumit yang akan memberi Anda hasil yang jauh lebih akurat menggunakan lebih sedikit segmen-garis.

BlueRaja - Danny Pflughoeft
sumber