Применить линейные импульсы к заданной точке - 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