Với sự giúp đỡ của cộng đồng Stack Overflow, tôi đã viết một trình giả lập vật lý khá cơ bản - nhưng thú vị.
Bạn nhấp và kéo chuột để khởi động một quả bóng. Nó sẽ nảy xung quanh và cuối cùng dừng lại trên "sàn".
Tính năng lớn tiếp theo của tôi, tôi muốn thêm vào là va chạm bóng. Chuyển động của quả bóng được chia thành vectơ tốc độ rìu và y. Tôi có lực hấp dẫn (giảm nhỏ vectơ y mỗi bước), tôi có ma sát (giảm nhỏ cả hai vectơ mỗi va chạm với tường). Các quả bóng trung thực di chuyển xung quanh một cách thực tế đáng ngạc nhiên.
Tôi đoán câu hỏi của tôi có hai phần:
- Phương pháp tốt nhất để phát hiện bóng để va chạm bóng là gì?
Tôi có chỉ có một vòng lặp O (n ^ 2) lặp lại trên mỗi quả bóng và kiểm tra từng quả bóng khác để xem liệu bán kính của nó có trùng nhau không? - Những phương trình nào tôi sử dụng để xử lý bóng để va chạm bóng? Vật lý 101
Làm thế nào để nó ảnh hưởng đến hai vectơ tốc độ x / y? Hướng kết quả của hai quả bóng đi vào là gì? Làm thế nào để tôi áp dụng điều này cho mỗi quả bóng?
Xử lý phát hiện va chạm của các "bức tường" và thay đổi vectơ kết quả là dễ dàng nhưng tôi thấy nhiều biến chứng hơn với va chạm bóng. Với các bức tường, tôi chỉ cần lấy âm của vectơ x hoặc y thích hợp và tắt nó đi theo hướng chính xác. Với những quả bóng tôi không nghĩ nó là như vậy.
Một số giải thích nhanh: hiện tại tôi vẫn ổn với một va chạm hoàn toàn đàn hồi, tất cả các quả bóng của tôi đều có cùng khối lượng ngay bây giờ, nhưng tôi có thể thay đổi điều đó trong tương lai.
Chỉnh sửa: Tài nguyên tôi thấy hữu ích
Vật lý bóng 2d với vectơ: Va chạm 2 chiều không có lượng
giác.pdf Ví dụ phát hiện va chạm bóng 2d: Thêm phát hiện va chạm
Sự thành công!
Tôi có phát hiện va chạm bóng và phản ứng làm việc tuyệt vời!
Mã liên quan:
Phát hiện va chạm:
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]);
}
}
}
Điều này sẽ kiểm tra va chạm giữa mỗi quả bóng nhưng bỏ qua kiểm tra dư thừa (nếu bạn phải kiểm tra xem bóng 1 có va chạm với bóng 2 không thì bạn không cần kiểm tra xem bóng 2 có va chạm với bóng không 1. Ngoài ra, nó bỏ qua việc kiểm tra va chạm với chính nó ).
Sau đó, trong lớp bóng của tôi, tôi có các phương thức va chạm () và notifyCollision ():
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));
}
Mã nguồn: Hoàn thành nguồn cho bóng để va chạm bóng.
Nếu ai có một số gợi ý về cách cải thiện trình mô phỏng vật lý cơ bản này, hãy cho tôi biết! Một điều tôi chưa thêm là động lượng góc để các quả bóng sẽ lăn thực tế hơn. Bất cứ một đề nghị nào khác? Để lại một bình luận!
Vector2d impulse = mtd.multiply(i);
nên là i * vectơ mtd chuẩn hóa. Một cái gì đó như:Vector2d impulse = mtd.normalize().multiply(i);