Apakah ada algoritma untuk permainan biliar?

14

Saya mencari algoritma untuk menghitung arah dan kecepatan bola dalam permainan biliar. Saya yakin harus ada beberapa jenis kode sumber terbuka untuk ini karena permainan biliar adalah beberapa permainan komputer tertua yang dapat saya ingat.

Maksud saya, ketika satu bola menyentuh bola yang lain, saya perlu algoritma untuk menghitung arah keduanya. Itu akan tergantung dari sudut yang tepat di mana mereka saling memukul dan pada kecepatan.

Saya ingin berlatih kode Java, jadi saya mencari kode java atau paket yang memiliki jenis kode ini.

Vaillancourt
sumber
2
Jika Anda ingin menyelesaikannya sendiri, Anda mungkin perlu sedikit pengetahuan tentang vektor. Untungnya, seseorang memposting langkah-langkah hebat pada matematika linier di tempat lain di situs ini beberapa hari yang lalu.
doppelgreener
mungkin situs ini dapat membantu Anda archive.ncsa.illinois.edu/Classes/MATH198/townsend/…

Jawaban:

8

Sementara deteksi / respons tumbukan bola-bola dasar cukup sederhana, melakukannya cukup akurat untuk simulasi kumpulan yang baik akan lebih rumit, karena Anda harus berurusan dengan putaran.

Apakah Anda sadar akan keberadaan mesin fisika? Beberapa contoh populer adalah ini (dan mereka dapat melakukan lebih dari sekedar tabrakan bola biliar). Mungkin pilihan yang baik untuk membuat permainan biliar, tetapi tidak begitu banyak untuk belajar Java ...

Dalam 2D

Box2D: http://www.box2d.org

Chipmunk: http://code.google.com/p/chipmunk-physics/

Dalam 3D

Bullet: http://bulletphysics.org/

ODE: http://www.ode.org

Jika Anda membuat game komersial beranggaran besar:

Havok: http://www.havok.com

bluescrn
sumber
1
Manakah dari ini adalah mesin fisika Java?
Ricket
Ada port Java, atau setidaknya binding untuk Box2D, Chipmunk, Bullet, dan ODE
bluescrn
2

Untuk permainan biliar sederhana di mana spin tidak dimodelkan, algoritma ini cukup sederhana.

  1. Untuk memeriksa apakah tabrakan terjadi, periksa apakah jarak antara bola lebih kecil dari jumlah jari-jarinya.
  2. Hitung dampak normal
  3. Hitung gaya tumbukan berdasarkan perbedaan kecepatan, normal, koefisien tumbukan dan massa
  4. Terapkan gaya tumbukan ke kedua bola

Dalam kode semu ini menjadi:

vector difference = ball2.position - ball1.position
float distance = sqrt(difference)
if (distance < ball1.radius + ball2.radius) {
    vector normal = difference / distance
    //vector velocityDelta = ball2.velocity - ball1.velocity
    vector velocityDelta = ball1.velocity - ball2.velocity

    float dot = dotProduct(velocityDelta, normal)

    if (dot > 0) {
        float coefficient = 0.5
        float impulseStrength = (1 + coefficient) * dot * (1 / ball1.mass + 1 / ball2.mass)
        vector impulse = impulseStrength * normal
        ball1.velocity -= impulse / ball1.mass
        ball2.velocity += impulse / ball2.mass
    }
}

Anda dapat menghilangkan massa dari algoritme jika semua bola memiliki massa yang sama dan juga mengasumsikan jari-jari konstan untuk semua bola untuk permainan pool, tetapi kode akan lebih berguna bagi Anda tanpa penyederhanaan tersebut.

Kode ini didasarkan pada tutorial ini , tetapi saya ingat bahwa perkalian impuls tidak benar di sana.

msell
sumber
Bagaimana jika titik kurang dari nol? Saya telah menyelidiki kodesemu ini (dan yang Anda tautkan juga, tetapi yang lain berakhir dengan usaha saya untuk mengambil kuadrat dari angka negatif - mungkin itulah masalah yang Anda identifikasi dengannya). Tentunya Anda ingin menghasilkan hasil dengan setiap set posisi input dan kecepatan?
@Poldie Jika titik negatif, bola sudah bergerak menjauh satu sama lain. Tidak perlu menangani tabrakan dalam kasus itu.
msell
Saya baru saja mengetuk versi kode saya di sini: ideone.com/DhsAoW dan saya mendapatkan -0,707 untuk posisi 110,90 dan 100,100, dan kecepatan 0,2 dan 0, -3. Ini adalah tabrakan langsung. (Asumsikan pemeriksaan deteksi tabrakan berbasis jari-jari awal telah terjadi).