box2d两个角度的角度差异

时间:2012-02-09 00:04:25

标签: math vector geometry box2d

使用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;     
        }

问题有两个:

  • 目标角度从-4.71跳到1.57弧度,导致车辆切换到错误的方向
  • 车辆角度是连续的并且不断增加而不是保持在一个范围内。

有没有办法让目标矢量和车辆角度都在一个设定范围内,例如,如果目标角度是0-360并且范角是0-360,我可以准确地比较它们吗?

还有其他办法吗?任何帮助表示赞赏!

2 个答案:

答案 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;     
        }