box2d разница между углами двух тел - PullRequest
1 голос
/ 09 февраля 2012

Работая с 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 голосов
/ 09 февраля 2012

Используя вместо этого функцию 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;     
        }    
0 голосов
/ 09 февраля 2012

Используйте atan2 вместо atan в вашем коде.Он получает угол от одного объекта к другому.

...