2D跟踪弹算法

       最近在写一个手机游戏,其中涉及到一个跟踪弹的算法,成果如下:

/*子弹到目标的向量分量*/
int vx=target.getPosition().x-this.position.x;
int vy=target.getPosition().y-this.position.y;
/*使用内积判断向量的夹角[0,180]*/
double dot=Util.dot(dx,dy,vx,vy);//dx,dy为速度向量分量
double cos=dot/velocity*Util.modulus(vx,vy);//velocity为速度标量
double angle=Math.acos(cos);//两向量的夹角
/*使用外积判断向量的夹角是顺时针还是逆时针*/
double cross=Util.cross(dx,dy,vx,vy);
if(angle!=0&&Math.abs(cross)>0.00001)
{
	/*参考偏转角界限进行调整*/
	Point2D result=new Point2D();
	if(angle<deflectionAngleLimit)//deflectionAngleLimit为子弹最大偏转角,即从一帧跳到下一帧最大的旋转角度
	{
		if(cross>0)
		{
			//逆时针旋转
			direction+=angle;
			Util.rotate(dx,dy, angle, result);
			Log.d("TrackingBullet","ccw angle:"+angle+",direction:"+direction);
		}
		else if(cross<0)
		{
			//顺时针旋转
			direction-=angle;
			Util.rotate(dx,dy, -angle, result);
			Log.d("TrackingBullet","cw angle:"+angle+",direction:"+direction);
		}
	}
	else
	{
		if(cross>0)
		{
			//逆时针旋转
			direction+=deflectionAngleLimit;
			Util.rotate(dx,dy, deflectionAngleLimit, result);
			Log.d("TrackingBullet","ccw limit:"+deflectionAngleLimit+",direction:"+direction);
		}
		else if(cross<0)
		{
			//顺时针旋转
			direction-=deflectionAngleLimit;
			Util.rotate(dx,dy, -deflectionAngleLimit, result);
			Log.d("TrackingBullet","cw limit:"+deflectionAngleLimit+",direction:"+direction);
		}
	}
	Log.d("TrackingBullet","dx:"+dx+",dy:"+dy+"--result:"+result.x+","+result.y);
	this.dx=result.x;//新的速度分量
	this.dy=result.y;
}

 

然而其间遇到了一个问题,就是在数学中坐标系统Y分量的正方向是向上的,而手机的坐标系统Y分量的正方向是向下的,根据经验是可能使用y'=-y来转换的,不过在这里还不知道怎么转换,有机会我会再做进一步的研究,也希望有同道中人一起交流^_^

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值