Bagaimana cara mensimulasikan pendulum ayun?

9

Saya ingin mensimulasikan tali dengan beban terpasang, berayun bolak-balik seperti pendulum. Fisika apa pun yang sebenarnya berlebihan; itu hanya mengulangi gerakan yang sama tanpa henti.

JQuery memiliki kemudahan "ayunan" mirip dengan apa yang saya cari. Bagaimana cara kerjanya?

Saya sedang berpikir untuk berputar dari satu sudut ke sudut yang lain Math.easeOutExpo, tetapi bandul sungguhan mudah berbeda ...

mjanisz1
sumber
2
Memiliki kurva sinus dimasukkan ke dalam kecepatan sudut pendulum, sehingga titik nol berada di puncak, dan nilai kecepatan tertinggi ada di bagian bawah.
Shotgun Ninja

Jawaban:

10

Nah, Anda harus menggunakan sedikit fisika, tetapi Anda tidak perlu mensimulasikan fisika apa pun. Ada rumus untuk gerakan pendulum yang dapat Anda gunakan dengan mudah untuk mengatur rotasi pendulum Anda. Untuk ayunan kecil, gerakan dapat didekati dengan gerakan harmonik sederhana .

Perpindahan sudut pada waktu tertentu dapat diperkirakan dengan:

masukkan deskripsi gambar di sini

Ini paling akurat untuk maksimum kecil θ, tetapi kemungkinan akan cukup akurat untuk tujuan Anda. Buat fungsi yang membutuhkan waktu saat ini, dan keluarkan sudut di mana pendulum Anda harus diputar, dan putar sprite Anda dengan jumlah itu.

MichaelHouse
sumber
4

Berikut ini adalah perhitungan tanpa-trig, berasal dari Trig dan Fisika Kelas 11 yang lurus ke depan. Diasumsikan bahwa titik asal adalah titik terendah dari suspensi pendulum bob, bahwa L adalah panjang pendulum, dan bahwa konvensi grafis normal y meningkat ke bawah, dan x meningkatkan ke kanan diadopsi:

Pembaruan: Saya awalnya mengacaukan percepatan; ini lebih mudah.
Pembaruan # 2 : Menambahkan kontrol waktu eksplisit, dan menambahkan satuan ukuran.

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;
}
Pieter Geerkens
sumber
2
Waktu tidak ada dalam persamaan.
Maik Semder
@MaikSemder: Satuan waktu didefinisikan sebagai siklus animasi, apa pun itu. Mengapa orang melakukannya dengan cara lain?
Pieter Geerkens
Saat ini integrasi percepatan Anda menggunakan waktu implisit 1 unit. Jika unit waktu permainan Anda adalah detik, Anda hanya dapat memiliki 1 kerangka simulasi per detik, cukup pasang waktu secara jelas dan Anda menyingkirkan masalah itu. Waktu sudah ada di sana, cukup buat eksplisit. Misalnya waktu bingkai bervariasi tetapi Anda memerlukan kecepatan konstan animasi yang independen dari waktu bingkai, juga antara platform yang berbeda, atau Anda ingin efek slomo, banyak alasan.
Maik Semder
1
Itu maksud saya, g berasal dari luar atau "permainan". Sekarang Anda memiliki unit waktu. Delta t sekarang adalah 1 dari unit waktu itu. Untuk simulasi waktu nyata itu tidak terlalu nyaman, karena gim Anda memiliki "ide" waktu berlalu sendiri. Menjadikannya sebagai parameter eksplisit dan bukan konstanta implisit dapat membuat jawaban Anda berguna untuk permainan.
Maik Semder
2
Bagus :) kecepatan harus dikalikan dengan "deltaT" juga, untuk mendapatkan "perpindahan" dari kecepatan, sehingga dapat ditambahkan ke "x",
terbalik