Sabit bir hızda hareket etmek için bir Catmull-Rom spline'ın yay uzunluğunu belirleme


18

Catmull-Rom spline'ların bir araya getirilmesiyle tanımlanan bir yolum var. 0 ile 1 arasında bir değer olan noktalar arasında enterpolasyon için izin XNA statik yöntem Vector2.CatmullRom kullanın.

Bu yoldaki her yiv aynı uzunlukta değildir. Yol boyunca ilerlerken ağırlığın her spline için sabit bir hızda gitmesine izin verirsem bu hız farklılıklarına neden olur. Ağırlığın hızının spline uzunluğuna bağlı olmasına izin vererek bunu çözebilirim. Böyle bir spline uzunluğunu nasıl belirleyebilirim? Spline'ı 10 düz çizgiye keserek ve uzunluklarını toplayarak mı yaklaştırmam gerekir?

Ben splines tarafından tanımlanan oluşturulan mesh dinamik doku eşleme için kullanıyorum.

Yanıtlar:


25

Nesnenin hızını tüm eğri üzerinde sabit bir değerde tutmak istediğiniz gibi görünüyor - yay uzunluğunu bilmek bunu yapmanıza yardımcı olmaz. Bu nesne son noktasına ulaşmak istiyorum saat kaçta hesaplamak yardımcı olacaktır eğer o hızda gittiğini daha iyi sen andan daha (nesne tüm noktalar arasında aynı ortalama hızı olacaktır) olacaktır, böylece, ancak nesnenin gerçek hızı, eğri etrafında hareket ettikçe değişecektir.

Daha iyi bir çözüm, parametrik parametremizi (0'dan 1'e giden, skarışıklığı önlemek için arayacağım parametre t = time) değişken bir ds/dthızda, nesnenin hangi hızda hareket etmesini istediğinize göre belirlenen bir değişken oranında değiştirmek olacaktır. eğri üzerinde o nokta. Başka bir deyişle, sher bir kareyi 0,01 değiştirmek yerine onu 0,005 bir kare, bir sonraki 0,02 vb. Değiştirebiliriz.

Bunu , her bir karenin x( dx/ds) ve y( dy/ds) türevlerini hesaplayıp

ds / dt = hız / sqrt ((dx / ds) 2 + (dy / ds) 2 )

Yani, gitmek istediğimiz hızı alarak ve ssabit bir artışla değişseydik aslında gideceğimiz hıza bölerek .


Kanıt

Nesnemizin hızının sabit olmasını istiyoruz; sabitin adını verelim speed.

Biz ikinci sınıf matematik olduğunu, parametrik denklemler için öğrenmek x(s)ve y(s),

hız = sqrt ((dx / dt) 2 + (dy / dt) 2 )

Ayrıca şunu öğreniyoruz

dx / dt = dx / ds * ds / dt     (zincir kuralı)

Böylece,

hız = sqrt ((dx / ds) 2 (ds / dt) 2 + (dy / ds) 2 (ds / dt) 2 )

Çözerek ds/dt, belirtilen denklemi alırız.


Türevlerin hesaplanması

Bu özel yivlerle hiç çalışmadım, ama sadece verdiğini x(s)ve y(s)kübik denklemleri açısından anladım s. Böylece, türevi dx/dskolayca bulabiliriz :

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

sonra

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

(Aynı için dy/ds) Tabii ki, tam değerlerinin bilinmesi gerekir a, bve cbunu yapmak için. Bu sayfaya göre , bu değerleri bulmak kolaydır.


Son olarak, başlıktaki soruyu cevaplamak için: bir parametrik fonksiyonun yay uzunluğu denklemini bulmak, oldukça karmaşık belirli bir integralin ; basit bir kübik denklem durumunda bile, bu genellikle yapılamaz.

Böylece, integrali sayısal olarak tahmin etmeniz gerekir . “Spline'ı 10 düz çizgiye ayırmak ve uzunluklarını toplamak” önerdiğiniz gibi bunu yapmanın çok basit bir yolu ; ancak, daha az çizgi segmenti kullanarak size çok daha doğru sonuçlar verecek biraz daha karmaşık yöntemler vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.