Расчет движения снаряда с динамикой бурундука - PullRequest
0 голосов
/ 05 января 2010

Мне нужно реализовать немного Ай, который может применить импульс к твердому телу, чтобы поразить цель. Как пушечное ядро, выпущенное из пушки. Я использую Бурундук Динамика для физического движка.

Моя математика ужасна, как и моя физика, но я читал, и с небольшой помощью SO и следующего из этой записи в Википедии , я получил это

float x = target.x = launchPos.x;
float y = target.y = launchPos.y;
float g = 9.8;
float v = 100;
float angle1, angle2;

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

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

// Split the velocities
float vVel = v * sin(angle2);
//NSLog(@"Vertical Velocity: %f", vVel);

float hVel = v / cos(angle2);
//NSLog(@"Horizontal Velocity: %f", hVel);

CGPoint force = cpv(hVel, vVel);

Что должно дать мне угол, из которого я могу рассчитать горизонтальные и вертикальные скорости, необходимые для запуска снаряда.

Однако это не работает, что меня совсем не удивляет по ряду причин. Во-первых, потому что я ужасен в математике и физике, а также потому, что меня смущает пара других вещей.

  1. Этот метод, похоже, не учитывает массу. Должно ли это? Я бы подумал, что это было довольно важно? Но потом я изучал искусство в колледже, так что я могу ошибаться.

  2. У Box2d есть PTM_RATIO, но я не могу найти ничего подобного в бурундуке, так как мои значения соответствуют пространственным координатам в бурундуке?

  3. Я знаю радианы и как они различаются в градусах, и как конвертировать между ними. Но что я должен использовать здесь? я должен преобразовывать angle1 и angle2 в градусы? Даже если я это сделаю, это все равно не сработает.

В целом, многое о физике и бурундуке я не понимаю. Поэтому я здесь и прошу помощи.

Есть ли что-то в бурундуке, что я могу использовать, чтобы выяснить это, или если кто-то должен был выяснить это самостоятельно, я был бы очень признателен за помощь.

Ответы [ 2 ]

1 голос
/ 05 января 2010

Например, я думаю, что горизонтальная скорость должна быть:

float hVel = v * cos(angle2);

А также, вы правы, что вам нужно принять во внимание массу. Похоже, вы выводите вектор силы непосредственно из скорости, и это не правильно.

Я никогда не использовал Бурундук, но я предполагаю, что вы не можете напрямую применить скорость к объекту? Вы должны применить силу, которая ускоряет объект до определенной скорости. Уравнение для Силы простое:

F = ma

Поскольку мы ускоряем этот снаряд с нулевой скорости до v, ускорение будет равно v. Однако вам нужно умножить это ускорение на массу объекта, чтобы получить требуемую правильную силу.

CGPoint force = cpv(hVel, vVel) * projectileMass;
0 голосов
/ 04 февраля 2010

Хорошо. Проблема в том (кроме опечатки v * cos (угол)), что вы путаете силу с импульсом.

Применение силы с углом не дает скорости объекта требуемого угла и величины. Вы должны либо:

  • Установите скорость на требуемую скорость, изменив скорость вручную с помощью установщика cpBodySetVel(cpBody *body, cpFloat Vel) или
  • Если исходная скорость равна 0, применить импульс к объекту.

Я не могу подчеркнуть это достаточно, Сила - это не то же самое, что Импульс:

  • Если вы прикладываете постоянную силу к объекту, скорость будет непрерывно изменяться во времени, от 0 до бесконечной скорости ... совсем не то, что вы хотите.
  • Если вы примените одноразовый импульс к объекту, скорость немедленно изменится с v0 на v0 + импульс / масса.

Я не думаю, что Бурундук позволяет применять импульсы. Но вы, вероятно, можете смоделировать импульс, разделив силу на временной шаг алгоритма, применив силу для одного временного шага и затем удалив ее. Но, вероятно, лучше придерживаться настройки скорости с помощью установщика.

Если вы действительно должны приложить постоянную силу к телу, чтобы добраться до цели, то уравнения не те, которые вы нашли в википедии.

...