Bilardo oyunu için bir algoritma var mı?


14

Bir bilardo oyununda topların yönünü ve hızını hesaplamak için algoritma arıyorum. Havuz oyunları hatırlayabildiğim en eski bilgisayar oyunlarından biri olduğu için bunun için bir açık kaynak kodu türü olduğundan eminim.

Yani, bir top diğerine vurduğunda, her ikisinin yönünü hesaplamak için bir algoritmaya ihtiyacım var. Birbirlerine vurdukları yerin tam açısına ve hıza bağlı olacaktır.

Java kodlama pratiği yapmak istiyorum, bu yüzden java kodu veya bu tür bir kodu olan paket arıyorum.


2
Yine de kendiniz çözmek istiyorsanız, muhtemelen vektörler hakkında bilgi sahibi olmanız gerekecektir. Neyse ki, birisi geçen gün bu sitenin başka yerlerinde doğrusal matematik üzerinde harika bir yol gösterdi .
doppelgreener

Yanıtlar:


8

Temel küre-küre çarpışma tespiti / yanıtı oldukça basit olsa da, iyi bir havuz simülasyonu için yeterince doğru bir şekilde yapmak, spin ile uğraşmanız gerektiğinden daha zor olacaktır.

Fizik motorlarının varlığının farkında mısınız? Bazı popüler örnekler bunlar (ve sadece havuz topu çarpışmalarından çok daha fazlasını yapabilirler). Muhtemelen bir bilardo oyunu yapmak için iyi bir seçim, ama Java öğrenmek için çok fazla değil ...

2D

Box2D: http://www.box2d.org

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

3D olarak

Madde işareti: http://bulletphysics.org/

ODE: http://www.ode.org

Büyük bütçeli bir ticari oyun yapıyorsanız:

Havok: http://www.havok.com


1
Bunlardan hangisi Java fizik motorları?
Ricket

Box2D, Chipmunk, Bullet ve ODE için Java bağlantı noktaları veya en azından bağlamaları vardır
bluescrn


2

Döndürmenin modellenmediği basit bir bilardo oyunu için algoritma oldukça basittir.

  1. Bir çarpışma olup olmadığını kontrol etmek için, bilyalar arasındaki mesafenin yarıçaplarının toplamından daha küçük olup olmadığını kontrol edin.
  2. Etkinin normalini hesapla
  3. Darbe kuvvetini hız farkı, normal, darbe katsayısı ve kütlelere göre hesaplayın
  4. Her iki topa da darbe kuvveti uygulayın

Sahte kodda bu:

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
    }
}

Tüm toplar aynı kütleye sahipse ve aynı zamanda bir bilardo oyunu için tüm toplar için sabit yarıçap varsa, kütleyi algoritmadan çıkarabilirsiniz, ancak kod bu basitleştirmeler olmadan sizin için daha yararlı olacaktır.

Kod bu öğretici dayanmaktadır , ancak dürtü çarpma orada yanlış olduğunu hatırlıyorum.


Nokta sıfırdan küçükse ne olur? Bu sahte kodu araştırıyorum. Şüphesiz, her girdi pozisyonu ve hızı seti ile bir sonuç üretmek ister misiniz?

@Poldie Eğer nokta negatifse, toplar zaten birbirinden uzaklaşıyor demektir. Bu durumda çarpışmayı ele almaya gerek yok.
msell

Kodumun versiyonunu buraya getirdim : ideone.com/DhsAoW ve 110,90 ve 100,100 pozisyonları ve 0,2 ve 0, -3 hızları için -0,707 alıyorum. Bu az çok kafa kafaya bir çarpışmadır. (Başlangıç ​​yarıçapı tabanlı çarpışma algılama kontrolünün zaten yapıldığını varsayın).
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.