Stack Overflow topluluğunun yardımıyla oldukça basit ama eğlenceli bir fizik simülatörü yazdım.
Bir topu başlatmak için fareyi tıklayıp sürükleyin. Etrafta zıplayacak ve sonunda "katta" duracaktır.
Eklemek istediğim bir sonraki büyük özellik, top çarpışması. Topun hareketi balta ve y hız vektörüne bölünür. Yerçekimim var (her adımda y vektörünün küçük azalması), sürtünme var (her çarpışmada bir duvarla her iki vektörün küçük bir azalması). Toplar dürüstçe şaşırtıcı derecede gerçekçi bir şekilde hareket eder.
Sanırım sorum iki bölümden oluşuyor:
- Toptan topa çarpışmayı tespit etmenin en iyi yöntemi nedir?
Sadece her topun üzerinde tekrarlayan ve diğer tüm topların yarıçapla çakışıp çakışmadığını kontrol eden bir O (n ^ 2) döngüm var mı? - Topla çarpışmaya karşı hangi denklemleri kullanırım? Fizik 101
İki topun hız x / y vektörlerini nasıl etkiler? İki topun yöneldiği yön nedir? Bunu her top için nasıl uygularım?
"Duvarlar" ın çarpışma tespiti ve sonuçta meydana gelen vektör değişiklikleri kolaydı ancak top-top çarpışmalarında daha fazla komplikasyon görüyorum. Duvarlarda sadece uygun x veya y vektörünün negatifini almak zorunda kaldım ve kapalı doğru yönde ilerleyecekti. Toplarla bu şekilde olduğunu sanmıyorum.
Bazı hızlı açıklamalar: Basitlik için şimdilik mükemmel elastik bir çarpışma ile iyiyim, ayrıca tüm toplarım şu anda aynı kütleye sahip, ancak gelecekte bunu değiştirebilirim.
Düzenleme: Yararlı bulduğum kaynaklar
Vektörlerle 2d Top fiziği: Trigonometri Olmadan 2 Boyutlu Çarpışmalar.pdf
2d Top çarpışma algılama örneği: Çarpışma Tespiti Ekleme
Başarı!
Top çarpışma tespiti ve yanıtı harika çalışıyor!
İlgili kod:
Çarpışma algılama:
for (int i = 0; i < ballCount; i++)
{
for (int j = i + 1; j < ballCount; j++)
{
if (balls[i].colliding(balls[j]))
{
balls[i].resolveCollision(balls[j]);
}
}
}
Bu, her top arasındaki çarpışmaları kontrol eder, ancak gereksiz kontrolleri atlar (eğer top 1'in top 2 ile çarpışıp çarpışmadığını kontrol etmek zorunda kalırsanız, top 2'nin top 1 ile çarpışıp çarpışmadığını kontrol etmeniz gerekmez. Ayrıca, kendisiyle çarpışma kontrolünü atlar. ).
Sonra, benim top sınıfta benim colliding () ve resolCollision () yöntemleri var:
public boolean colliding(Ball ball)
{
float xd = position.getX() - ball.position.getX();
float yd = position.getY() - ball.position.getY();
float sumRadius = getRadius() + ball.getRadius();
float sqrRadius = sumRadius * sumRadius;
float distSqr = (xd * xd) + (yd * yd);
if (distSqr <= sqrRadius)
{
return true;
}
return false;
}
public void resolveCollision(Ball ball)
{
// get the mtd
Vector2d delta = (position.subtract(ball.position));
float d = delta.getLength();
// minimum translation distance to push balls apart after intersecting
Vector2d mtd = delta.multiply(((getRadius() + ball.getRadius())-d)/d);
// resolve intersection --
// inverse mass quantities
float im1 = 1 / getMass();
float im2 = 1 / ball.getMass();
// push-pull them apart based off their mass
position = position.add(mtd.multiply(im1 / (im1 + im2)));
ball.position = ball.position.subtract(mtd.multiply(im2 / (im1 + im2)));
// impact speed
Vector2d v = (this.velocity.subtract(ball.velocity));
float vn = v.dot(mtd.normalize());
// sphere intersecting but moving away from each other already
if (vn > 0.0f) return;
// collision impulse
float i = (-(1.0f + Constants.restitution) * vn) / (im1 + im2);
Vector2d impulse = mtd.normalize().multiply(i);
// change in momentum
this.velocity = this.velocity.add(impulse.multiply(im1));
ball.velocity = ball.velocity.subtract(impulse.multiply(im2));
}
Kaynak Kodu: Top-top çarpıştırıcı için tam kaynak.
Herkes bu temel fizik simülatörü geliştirmek için bazı öneriler varsa bana bildirin! Henüz eklemem gereken bir şey açısal momentum, böylece toplar daha gerçekçi bir şekilde yuvarlanacak. Başka öneriniz var mı? Yorum Yap!
Vector2d impulse = mtd.multiply(i);
normalleştirilmiş mtd vektörü olmalıdır. Gibi bir şey:Vector2d impulse = mtd.normalize().multiply(i);