рассчитать box2d импульс для определенного угла удара - PullRequest
1 голос
/ 29 марта 2012

У меня есть шар (динамическое тело в форме круга), который действует на поверхность (батут) в условиях силы тяжести.

Когда мяч ударяет по батуту (нарисовано на рисунке от точки А до В), я хотел бы приложить импульс (нормальный к поверхности батута) к мячу.

enter image description here

Проблема в том, что сейчас я использую:

 b2Vec2 impulse = b2Vec2(0, [self fullMass]*[GameMaster sharedInstance].usrTrampolineForce);

 b2Vec2 impulsePoint = _body->GetWorldPoint(b2Vec2(0/PTM_RATIO, -1.0/PTM_RATIO));

 _body->ApplyLinearImpulse(impulse, impulsePoint);

Который направляет шар перпендикулярно (на поверхности) вверх (красное направление на чертеже), хотя он должен соответствовать определенной реалистической траектории (нарисованной черным)

Как я могу применить импульс для реалистичного прыжка?

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

1 Ответ

4 голосов
/ 29 марта 2012

Я не читаю цель-C, но проблема, кажется, ясна:

Ваш импульс b2Vec2(0, [self fullMass]*[GameMaster sharedInstance].usrTrampolineForce) на самом деле не включает ни одного компонента x!

Разделите ваш импульс на компоненты x и y (псевдокод):

Impulse_magnitude = Ball_mass * Trampoline_Force
# theta is the angle between the horizontal and your impulse
# this will depend on the angle of the trampoline.
Impulse_x = Impulse_magnitude * Cos(theta)
Impulse_y = Impulse_magnitude * Sin(theta)
# Create your impulse vector
Impulse_v = b2Vec(Impulse_x, Impulse_y)
...