Применить линейные импульсы к заданной точке - Box2D на Android

Я хотел бы получить форму, чтобы двигаться от середины дна к точке, которую я касаюсь. Проблема заключается в том, чтобы решить угол (или градус?) До точки касания.

float angle = ?
float power = calculatePower(touchY);
Vec2 impulse = new Vec2(angle, power);
Vec2 point = body.getWorldCenter(); // to prevent rotation of shape
body.applyLinearImpulse(impulse, point);

Кто-нибудь получил предложение?

РЕДАКТИРОВАТЬ: РЕШЕНО

Благодаря Эндрюс ответ. Вот рабочий код:

Point delta = new Point(touchX - bodyX, touchY - bodyY);
double angle = Math.atan2(delta.y, delta.x);
Vec2 direction = new Vec2((float)Math.cos(angle), (float)-Math.sin(angle));
float power = calculatePower(touchY);
Vec2 impulse = new Vec2(power * direction.x, power * direction.y);
Vec2 point = body.getWorldCenter();
body.applyLinearImpulse(impulse, point);

1 ответ

Решение

Псевдокод выглядит следующим образом. atan2 это стандартная математическая функция

Vec2 delta  = touchPoint - body.position;
float angle = math.atan2(delta.y, delta.x);

Эта линия Vec2 impulse = new Vec2(angle, power); выглядит очень странно, хотя Ты используешь angle как x значение и power как y, Это не имеет особого смысла. Я думаю, что ваша цель - применить импульс силы power в направлении angle, В этом случае код должен выглядеть следующим образом:

Vec2 dir     = Vec2(math.cos(angle), math.sin(angle));
Vec2 impulse = power * dir;

Но с тех пор delta а также dir Различаясь только по величине, вы можете упростить расчет импульса как:

Vec2 delta   = touchPoint - body.position;
Vec2 dir     = delta.normalize();
Vec2 impulse = power * dir
Другие вопросы по тегам