随笔 - 79  文章 - 58  trackbacks - 0
<2013年8月>
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(9)

随笔分类

随笔档案

文章档案

相册

搜索

  •  

积分与排名

  • 积分 - 283192
  • 排名 - 86

最新评论

阅读排行榜

评论排行榜

静止的圆形只需检测两个圆心间的距离是否小于等于两个圆的半径。
对于匀速运动中的两个圆形,已知圆1初始位置P1,速度V1,圆2初始位置P2,速度V2,
则在时间点T,圆心的位置p+v*t, 如果存在时间点T,两个圆心间的距离等于两个圆的半径,则得出两个圆形在时间T碰撞。
这样就是求解一元二次方程了。

对于游戏来说,需要在每帧进行碰撞检测,可以假设每一帧的物体运行都是匀速的,用上述方式判断求解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 阅读(1160) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理