Sallanan bir sarkaç nasıl simüle edebilirim?


9

Bir sarkaç gibi ileri geri sallanan bir ağırlık ile bir ip simüle etmek istiyorum. Gerçek fizik aşırıya kaçar; sadece aynı hareketi tekrar ediyor.

JQuery aradığım benzer bir "salıncak" kolaylığı vardır . O nasıl çalışır?

Bir açıdan diğerine dönmeyi düşünüyordum Math.easeOutExpo, ama gerçek sarkaçlar farklı şekilde rahatlıyor ...


2
Sarkaçın açısal hızına bir sinüs eğrisi besleyin, böylece sıfır noktası zirvelerdedir ve en yüksek hız değeri en alttadır.
Shotgun Ninja

Yanıtlar:


10

Biraz fizik kullanmanız gerekecek, ancak herhangi bir fiziği simüle etmenize gerek yok . Sarkacın dönüşünü ayarlamak için kolayca kullanabileceğiniz sarkaç hareketi için formüller vardır . Küçük salınımlar için, hareket basit harmonik hareketle yaklaşık olarak tahmin edilebilir .

Belirli bir zamanda açısal yer değiştirme aşağıdakilerle yaklaşık olarak tahmin edilebilir:

resim açıklamasını buraya girin

Bu, küçük bir maksimum θ için en doğrudur, ancak muhtemelen amaçlarınız için yeterince doğru olacaktır. Geçerli saati alan ve sarkaçınızın döndürülmesi gereken açıyı veren bir işlev oluşturun ve hareketli grafiğinizi bu miktarda döndürün.


4

İşte basit 11. Sınıf Trig ve Fizik'ten türetilmiş trig olmayan bir hesaplama. Kökünün sarkaç bobunun süspansiyonunun en alçak noktası olduğunu, L'nin sarkaçın uzunluğu olduğunu ve y'nin normal grafik kuralının azaldığını ve x'in sağa doğru arttığını kabul eder:

Güncelleme: Başlangıçta hızlandım; bu daha kolay.
Güncelleme # 2 : Açık zaman kontrolü eklendi ve ölçü birimleri eklendi.

const float gravity = 9.8;     // units of metres/sec/sec
const float deltaT  = 0.001;   // equals 0.001 sec or 1 millisecond

var xVelocity = 0.010;         // units metres/sec equals 10 cm/sec 
var x = 0.0;                   // units metres
var y = 0.0;                   // units metres

while (true) {
  var xAcceleration = -gravity * (x/L) * (L-y)/L;

  x += (xVelocity + (xAcceleration/2 * deltaT)) * deltaT;
  y  = Math.SQRT(L*L - x*x) - L; 

  xVelocity += xAcceleration * deltaT;
}

2
Denklemde zaman eksik.
Maik Semder

@MaikSemder: Zaman birimi, ne olursa olsun, animasyon döngüsü olarak tanımlanır. Neden başka bir yolla yapsın ki?
Pieter Geerkens

Şu anda ivme entegrasyonunuz 1 birim örtük bir zaman kullanıyor. Oyun zaman biriminiz saniye ise, saniyede sadece 1 simülasyon çerçeveniz olabilir, sadece zamanı açık bir şekilde takın ve bu sorundan kurtulun. Zaman zaten orada, sadece açık yap. Örneğin kare süresi değişkendir, ancak farklı platformlar arasında kare süresinden bağımsız olarak animasyonun sabit bir sabit hızına ihtiyacınız vardır veya bir slomo efekti istiyorsanız, bunun birçok nedeni vardır.
Maik Semder

1
Demek istediğim, g dışarıdan ya da “oyundan” geliyor. Artık zaman biriminiz var. Delta t şu anda bu zaman biriminden 1'dir. Gerçek zamanlı bir simülasyon için, oyununuz geçen zamanın kendi "fikrine" sahip olduğundan, çok uygun değil. Bunu örtük bir sabit yerine açık bir parametre yapmak, cevabınızı bir oyun için kullanışlı hale getirebilir.
Maik Semder

2
Güzel :) hız "deltaT" ile çarpılmalıdır, "deplasman" hızdan çıkarmak için, bu yüzden "x", eklenebilir, yükseltilmiş
Maik Semder
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.