靜止的圓形只需檢測兩個圓心間的距離是否小于等于兩個圓的半徑。
對于勻速運動中的兩個圓形,已知圓1初始位置P1,速度V1,圓2初始位置P2,速度V2,
則在時間點T,圓心的位置p+v*t, 如果存在時間點T,兩個圓心間的距離等于兩個圓的半徑,則得出兩個圓形在時間T碰撞。
這樣就是求解一元二次方程了。
對于游戲來說,需要在每幀進行碰撞檢測,可以假設(shè)每一幀的物體運行都是勻速的,用上述方式判斷求解t,如果t小于幀的時間,則表示在
本幀碰撞了。附上2D簡易代碼:
public class CircleObject {
public float x, y; //position
public float vx,vy; //velocity
public float r; //radius
//delta 一幀的間隔
public boolean isCollision(CircleObject obj, float delta)
{
float dx = x-obj.x;
float dvx = vx-obj.vx;
float dy = y-obj.y;
float dvy = vy-obj.vy;
float sr = r+obj.r;
float a = dvx*dvx+dvy*dvy;
float b = -(2*dx*dvx+2*dy*dvy);
float c = dx*dx+dy*dy-sr*sr;
//相對靜止
if (a == 0)
{
if (c <= 0)
{
return true;
}
else
{
return false;
}
}
//求解一元二次方程 [-b±√(b^2-4ac)]/2a
float tmp = b*b-4*a*c;
if (tmp < 0)
{
return false;
}
tmp = (float) Math.sqrt(tmp);
float t1 = (-b+tmp)/(2*a);
if (t1 > 0 && t1 <= delta)
{
return true;
}
float t2 = (-b-tmp)/(2*a);
if (t2 > 0 && t2 <= delta)
{
return true;
}
return false;
}
}
ps:可能我的想法和代碼都是錯的 :)
posted on 2013-08-16 15:15
merlinfang 閱讀(1319)
評論(0) 編輯 收藏 引用