Box2d Расчет траектории - PullRequest
       2

Box2d Расчет траектории

1 голос
/ 14 августа 2010

Я пытаюсь заставить физические тела, сгенерированные в случайном положении со случайной скоростью, поражать цель. Я почерпнул и немного изменил этот код из Интернета, который использовал chipmunk для запуска в Box2d

+ (CGPoint) calculateShotForTarget:(CGPoint)target from:(CGPoint) launchPos with:(float) velocity
{
    float xp = target.x - launchPos.x;
    float y = target.y - launchPos.y;
    float g = 20;
    float v = velocity;
    float angle1, angle2;

    float tmp = pow(v, 4) - g * (g * pow(xp, 2) + 2 * y * pow(v, 2));

    if(tmp < 0){
        NSLog(@"No Firing Solution");
    }else{
        angle1 = atan2(pow(v, 2) + sqrt(tmp), g * xp);
        angle2 = atan2(pow(v, 2) - sqrt(tmp), g * xp);
    }

    CGPoint direction = CGPointMake(cosf(angle1),sinf(angle1));
    CGPoint force = CGPointMake(direction.x * v, direction.y * v);

    NSLog(@"force = %@", NSStringFromCGPoint(force));
    NSLog(@"direction = %@", NSStringFromCGPoint(direction));

    return force;
}

Проблема в том, что я не знаю, как применить это к моей программе, у меня есть сила тяжести -20 для y, но если положить 20 для g и меньшую скорость, например 10 для v, я получу только «No Firing Solution» .

Что я делаю не так?

1 Ответ

1 голос
/ 14 августа 2010

Меньшая скорость, равная 10, никогда не сработает. Снаряд не обладает достаточной мощностью, чтобы преодолевать расстояние.

Ошибка в расчете состоит в том, что все в метрах, за исключением вычислений расстояния, которыев пикселях!

Изменение кода на это исправило сумасшедшие скорости, которые я получал:

+ (CGPoint) calculateShotForTarget:(CGPoint)target from:(CGPoint) launchPos with:(float) velocity
{
    float xp = (target.x - launchPos.x) / PTM_RATIO;
    float y = (target.y - launchPos.y) / PTM_RATIO;
    float g = 20;
    float v = velocity;
    float angle1, angle2;

    float tmp = pow(v, 4) - g * (g * pow(xp, 2) + 2 * y * pow(v, 2));

    if(tmp < 0){
        NSLog(@"No Firing Solution");
    }else{
        angle1 = atan2(pow(v, 2) + sqrt(tmp), g * xp);
        angle2 = atan2(pow(v, 2) - sqrt(tmp), g * xp);
    }

    CGPoint direction = CGPointMake(cosf(angle1),sinf(angle1));
    CGPoint force = CGPointMake(direction.x * v, direction.y * v);

    NSLog(@"force = %@", NSStringFromCGPoint(force));
    NSLog(@"direction = %@", NSStringFromCGPoint(direction));

    return force;
}
...