2012-03-29 2 views
1

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

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

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); 

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

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

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

+0

реалистичная траектория _is_ красный. правильное отражение на нормальном уровне, IIRC. – brice

+0

@brice Я нарисовал картинку, чтобы сделать точку. Глядя на код, вы можете заметить, что если это правильный случай, это означает, что независимо от края АВ (угол между краем и вектором направления шара) каждое взаимодействие между шаром и краем АВ сделало бы мяч прыгать вверх, что неверно в реальном мире. – Alex

+0

Пошел. Это не сплошная поверхность, но вы хотите активно обеспечить импульс к мячу при столкновении. – brice

ответ

4

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

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

Сплит свой импульс в х и у компонентов (псевдокод):

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) 
+0

Черт, как я мог пропустить компонент x ?! Это то, что происходит, когда вы копируете-вставляете код. Спасибо, брат! – Alex

+0

приятно :) +1 Спасибо @Brice! – TonyMkenu

Смежные вопросы