2010-01-05 6 views
0

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

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

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. Я знаю радианов и как они различаются по степеням, и как конвертировать между ними. Но что я должен здесь использовать? должен ли я преобразовывать угол1 и угол2 в градусы? Даже если я это сделаю, он все равно не работает.

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

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

ответ

1

С одной стороны, я бы думать, что горизонтальная скорость должна быть:

float hVel = v * cos(angle2); 

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

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

F = ma 

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

CGPoint force = cpv(hVel, vVel) * projectileMass; 
+0

Вы правы относительно cos (угол). Я также предполагаю, что это cpv (hVel * pmass, vVel * pMass). Это имеет смысл, но я все еще не получаю желаемого результата. Я думаю, что гравитация может быть проблемой, я предполагаю, что бурундук имитирует гравитацию как 9.8i. – gargantuan

0

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

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

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

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

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

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

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

+0

Извините, я читаю Бурундук и предполагаю, что C++'s Chipmunk :) Тем не менее, совет по физике один и тот же: формула в википедии предназначена для угла скорости, когда вы не применяете силу к объекту (только сила - сила тяжести). – Ezequiel

+0

Я понимаю, о чем вы говорите. Возможно, мое имя переменной было плохим выбором. «силой» я имею в виду «силу импульса». Возможно, не стоит смешивать терминологию, но в то время это имело смысл для меня. Бурундук позволяет вам применять импульс. – gargantuan

+0

Было бы неплохо иметь некоторую отладочную информацию, можете ли вы применить стимул и получить скорость? Кроме того, я хотел бы привести пример данных, которые вы используете: начальное положение снаряда, положение цели. Надеюсь, это не так много, чтобы спросить. Я физик, и я использовал расширения python для бурундука, поэтому я думаю, что смогу вам помочь. – Ezequiel