Rabu, 02 Desember 2009

tumbukan bola pada lantai

Tumbukan & Energi Kinetik

Dalam tulisan ini, saya hanya membahas tumbukan antara sebuah bola dengan dinding atau objek statis. Kalo Anda ingin tahu cara membuat animasi tumbukan antara 2 atau lebih objek yang bergerak ( bola dengan bola ), sabar … tunggu tulisan yang akan datang mengenai impuls dan momentum.

Dari apa yang saya baca di buku “Kartun Fisika”1, ada 3 jenis tumbukan, yaitu Elastis, Semi-elastis, dan tidak elastis. Elastisitas tumbukan banyak dipengaruhi oleh besarnya Energi Kinetik yang terkonversi menjadi panas pada saat bola menumbuk dinding. Dalam ActionScript, Energi Kinetik sebuah benda yang bergerak dapat dihitung dengan:

EK = 0.5 * m * v * v

Untuk sementara, kita nggak memasukkan unsur massa bola ke dalam animasi kita, yang akan kita “hilangkan” adalah sebagian dari v. Dan kita juga tidak perlu tahu berapa tepatnya Energi Kinetik bola.

Yang kita ingin tahu adalah berapa besar perubahan kecepatan sebagai akibat hilangnya Energi Kinetik. Sebagai contoh, bola yang kehilangan sebagian energi kinetiknya pada saat menumbuk lantai kecepatan vertikalnya akan berubah dan dapat dihitung dengan cara :

vy *= (1 – lostEK)

lostEK adalah banyaknya EK yg hilang, nilainya bisa bervariasi dari 0 – 1. Jika lostEK = 0, maka yg terjadi adalah tumbukan Elastis sempurna. Jika lostEK = 1, tumbukan tidak elastis. Untuk nilai lostEK yg lain, tumbukan semi-elastis.

Rumus ini bukan rumus yg akurat namun hasilnya cukup realistis.
Tumbukan semi elastis

Dalam gambar di atas, pada saat terjadi tumbukan, sebagian EK bola hilang, karena massa bola kita abaikan maka bisa kita anggap hilangnya EK sebagai hilangnya vy ( vektor hijau, lost EK ). Jika tidak ada EK yg hilang, vy sesaat setelah tumbukan besarnya sama dengan vy sebelum tumbukan ( vektor vy0 ) hanya arahnya yg terbalik. Namun jika ada EK yg hilang, vy berkurang ( vektor vy1 ). Jadi secara sederhana,

vy1 = – ( vy0 – lostVy )

Komponen X tidak ada yg berubah, kecuali jika kita menentukan sebuah besaran lain yaitu “friksi” pada bidang yang ditumbuk oleh bola. Untuk sementara, kita anggap bidang/dinding tidak mempunyai friksi.

Catatan – [1] Buku ini berjudul “Kartun Fisika”, terbitan Kepustakaan Populer Gramedia, 2001. Saya beli di toko buku Togamas, Malang. Isinya bagus dan mudah dipahami karena konsep-konsep fisika dijelaskan dengan gambar-gambar lucu. Kata pengantar ditulis oleh Yohanes Surya, Ph.d, pembina Tim Olimpiade Fisika Indonesia. 99% materi tulisan saya di website ini juga berdasarkan apa yg ada di buku itu selain dari sumber yg lain.
Vektor

Kembali ke laptop vektor. Seperti yg kita tahu, kecepatan & percepatan adalah vektor dan untuk melakukan operasi matematik terhadap sebuah vektor kita perlu tahu komponen-komponennya. Tentu sesuai dengan sistem koordinat yang kita gunakan. Karena Flash menggunakan sistem koordinat Kartesian, maka kita perlu tahu komponen X dan Y dari vektor tersebut. Gambar A di bawah ini menunjukkan vektor kecepatan (v) dan komponen-komponennya ( vx , vy ). Jika kita ingin menggunakan/menambahkan percepatan, maka gambarnya kurang lebih seperti yg ditunjukkan dalam Gambar B.
Vektor kecepatan & percepatan

Kita lihat Gambar B. Vektor vx dipengaruhi oleh komponen ax. Sedangkan vy dipengaruhi oleh ay. Ingat bahwa percepatan adalah nilai perubahan kecepatan yang terjadi setiap (satuan) waktu. Jadi kecepatan sesaat sebuah objek dapat dihitung dengan menambahkan kecepatan inisialnya dengan percepatan. Dalam ActionScript dapat kita gunakan rumus :

vx += ax
vy += ay

Dan besarnya kecepatan, kita hitung dengan menggunakan rumus Phytagoras, yaitu :

v = Math.sqrt(vx*vx + vy*vy);

Dengan arah sudut:

sudut = Math.atan2(vx,vy);

Ok, let’s get to work.
Deteksi tumbukan dan reaksi bola

Buat sebuah MovieClip berbentuk lingkaran, beri nama ball_mc. Ingat, registration point MovieClip ini harus di tengah. Buat juga sebuah MovieClip berbentuk persegi empat, beri stroke 1 px. Beri nama walls_mc. Buat layer baru, beri nama “script”, klik frame 1, dan buka panel ActionScript (tekan F9).

Pertama, kita buat inisialisasi variabel ax, ay, vx, dan vy. Saya memberi nilai 0.1 untuk ax dan ay. Sementara vy & vx saya beri nilai 0. Anda bisa memberi nilai berapa saja, tapi sebaiknya gunakan nilai yg kecil supaya animasi tidak terlalu cepat.
Actionscript:

1.
var ax:Number = .1;
2.
var ay:Number = .1;
3.
var vx:Number = 0;
4.
var vy:Number = 0;

Kita juga perlu menentukan boundaries atau batas-batas pergerakan bola. Karena kita ingin walls_mc berlaku seperti dinding, maka kita buat variabel dengan memperhitungkan posisi relatif bola terhadap dinding dan jari-jari bola.
Actionscript:

1.
var top:Number = walls_mc._y + ball_mc._height/2;
2.
var bottom:Number = walls_mc._y + walls_mc._height-ball_mc._height/2;
3.
var left:Number = walls_mc._x + ball_mc._width/2;
4.
var right:Number = walls_mc._width-ball_mc._width/2;

Variabel-variabel di atas akan kita gunakan untuk mengecek apakah terjadi tumbukan. Kita ambil contoh, tumbukan dengan dinding sebelah kanan. Tumbukan terjadi jika koordinat bola kurang dari atau sama dengan koordinat dinding dikurangi dengan jari-jari bola.

Ada 4 skenario reaksi bola terhadap tumbukan dengan dinding :

1. tumbukan dengan dinding kiri, arah vx menjadi positif
2. tumbukan dengan dinding kanan, arah vx menjadi negatif
3. tumbukan dengan atap, arah vy menjadi positif
4. tumbukan dengan lantai, arah vy menjadi negatif

Untuk mengecek apakah terjadi tumbukan atau tidak sekaligus membuat reaksi bola jika terjadi tumbukan, kita buat sebuah function tersendiri yaitu checkBoundaries() . Untuk membalik arah vektor horisontal & vertikal, kita cukup mengalikannya dengan -1.
Actionscript:

1.
function checkBoundaries() {
2.
if (ball_mc._x > right) {
3.
ball_mc._x = right;
4.
vx *= -1;
5.
}else if(ball_mc._x < left){
6.
ball_mc._x = left;
7.
vx *= -1;
8.
}
9.
if (ball_mc._y > bottom ) {
10.
ball_mc._y = bottom;
11.
vy *= -1;
12.
}else if(ball_mc._y < top){
13.
ball_mc._y = top;
14.
vy *= -1;
15.
}
16.
};

Lihat gambar di bawah ini. Gambar A, terjadi tumbukan di mana ball_mc._x < right. Sebelum kita membalik arah vx, kita perlu memposisikan ball_mc, lihat Gambar B. Jika tidak kita posisikan seperti ini, maka bola bisa hilang dari Stage sesaat setelah tumbukan dan muncul kembali setelah sepersekian detik. Tentu animasi akan jadi aneh.
Bola dan dinding (boundaries)

Sekarang kita buat function untuk menjalankan animasi, seperti biasa, function ini saya panggil dari setInterval() untuk menghasilkan animasi yg tidak tergantung pada FPS. Function ini juga terus menerus mengeksekusi checkBoundaries().
Actionscript:

1.
var intID:Number = setInterval("animate",60);
2.
function animate() {
3.
vx += ax;
4.
ball_mc._x += vx;
5.
vy += ay;
6.
ball_mc._y += vy;
7.
vx_txt.text = vx;
8.
vy_txt.text = vy;
9.
checkBoundaries();
10.
}

Jalankan movie dan lihat hasilnya. Bola tidak akan pernah bergerak dalam garis lurus karena efek ax dan ay. Coba Anda ubah nilai ax & ay. Lihat perbedaan yg terjadi. Coba juga ubah nilai awal vx dan vy.

Berikut ini swf yg saya buat dengan skrip yg sama dengan di atas, ditambah sebuah tombol utk play & pause. Nilai ax,ay, vx, dan vy dapat dilihat juga. Perhatikan bahwa nilai vx & vy bertambah jika searah dengan ax & ay, berkurang jika berlawanan arah dengan ax & ay. Jika menumbuk dinding, nilainya akan berubah tanda dari positif ke negatif atau sebaliknya.

1 komentar: