使用box2d和cocos2d,我计算了两个向量:
我需要将车辆旋转到指向目标的方向。这可以通过将车辆的转向设置为向右转90度或向左转90度来完成。
此刻我正在查询车辆的box2d车身的角度,然后使用以下方法计算目标方向矢量的角度:
if(vector.y == 0){ vector.y = 0.000001f; }
float baseRadians = atan(vector.x/vector.y);
if(vector.y < 0){ baseRadians += PI_CONSTANT; } //Adjust for -Y
return -1 * baseRadians;
以下是粗俗的,我需要帮助......!
然后,我将车辆的角度与方向矢量返回的角度进行比较,并将转向设置如下:if(vehicleAngle < targetAngle)
{
steeringInput = -90.0;
}
else if(vehicleAngle > targetAngle)
{
steeringInput = 90.0;
}
else
{
steeringInput = 0.0;
}
问题有两个:
有没有办法让目标矢量和车辆角度都在一个设定范围内,例如,如果目标角度是0-360并且范角是0-360,我可以准确地比较它们吗?
还有其他办法吗?任何帮助表示赞赏!
答案 0 :(得分:0)
在代码中使用atan2代替atan
。它获得从一个对象到另一个对象的角度。
答案 1 :(得分:0)
使用atan2f函数,我设法得到车辆矢量角和目标矢量角。
我的新实现如下:
//get the direction the vehicle is facing and the direction the target is facing
CGPoint vehicleDirectionVector = ccpNormalize(ccpSub(ccp(vehicleBonnetTip.x*PTM_RATIO, vehicleBonnetTip.y*PTM_RATIO), ccp(vehicleCenter.x*PTM_RATIO, vehicleCenter.y*PTM_RATIO)));
CGPoint targetDirectionVector = ccpNormalize(ccpSub(ccp(origTarget.x, origTarget.y), ccp(vehicleCenter.x*PTM_RATIO, vehicleCenter.y*PTM_RATIO)));
vehicleAngle = atan2f(vehicleDirectionVector.x,vehicleDirectionVector.y);
targetAngle = atan2f(targetDirectionVector.x,targetDirectionVector.y);
if ( targetAngle < -M_PI / 2 && vehicleAngle > M_PI / 2 ) targetAngle += M_PI * 2;
if ( targetAngle > M_PI / 2 && vehicleAngle < -M_PI / 2 ) targetAngle -= M_PI * 2;
if ( vehicleAngle < -M_PI / 2 && targetAngle > M_PI / 2 ) vehicleAngle += M_PI * 2;
if ( vehicleAngle > M_PI / 2 && targetAngle < -M_PI / 2 ) vehicleAngle -= M_PI * 2;
CCLOG(@"vehicle angle is %f, target angle is %f", vehicleAngle, targetAngle);
然后粗略地设置我的转向(我还在努力做这个......)我这样做:
if(vehicleAngle < targetAngle)
{
steeringDegrees = 90.0;
}
else if(vehicleAngle > targetAngle)
{
steeringDegrees = -90.0;
}
else
{
steeringDegrees = 0.0;
}