球對球碰撞.檢測和處理在Stack溢出社區(qū)的幫助下,我編寫了一個非?;镜腥さ奈锢砟M器。你點擊并拖動鼠標來發(fā)射一個球。它會彈來跳去,最后停在“地板”上。我想加入的下一個大特性是球對球的碰撞。球的運動被分解成x和y的速度矢量。我有重力(y矢量的每一步的小約化),我有摩擦力(兩個向量的小減縮,每一次與墻的碰撞)。這些球誠實地以一種令人驚訝的現(xiàn)實的方式移動。我想我的問題有兩部分:什么是檢測球對球碰撞的最佳方法?我是否只有一個O(n^2)循環(huán),對每個球進行迭代,并檢查其他每個球的半徑是否重疊?我用什么方程來處理球到球的碰撞?物理101它如何影響兩個球的速度x/y矢量?這兩個球的方向是什么?我該如何把這個應用到每個球上?處理碰撞檢測的“墻壁”和由此產(chǎn)生的矢量變化是容易的,但我看到更復雜的球-球碰撞。對于墻壁,我只需取適當?shù)膞或y向量的負數(shù),它就會朝正確的方向走。我不認為是這樣的。一些快速的澄清:為了簡單,現(xiàn)在我可以用完全彈性的碰撞,我所有的球現(xiàn)在都有相同的質量,但是我可能會在將來改變它。編輯:我發(fā)現(xiàn)有用的資源帶矢量的二維球物理:沒有三角函數(shù)的二維碰撞二維球碰撞檢測實例:加碰撞檢測成功!我的球碰撞檢測和反應工作很棒!相關守則:碰撞檢測: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]);
}
}
}這將檢查每個球之間的碰撞,但跳過冗余檢查(如果必須檢查球1是否與球2發(fā)生碰撞,則不需要檢查球2是否與球1發(fā)生碰撞。而且,它跳過了檢查與自身的碰撞)。然后,在我的球類中,我有了CONICING()方法和RESSIVE Collision()方法: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)));
}源代碼:完整的源球到球對撞機。如果有人對如何改進這個基本的物理模擬器有一些建議,請告訴我!有一件事我還沒有補充,那就是角動量,所以球會更現(xiàn)實地滾動。還有其他建議嗎?留下評論!
球對球碰撞.檢測和處理
暮色呼如
2019-06-25 11:23:41