Это немного двусмысленно, если вы просите нарисовать кривую, когда вы уже знаете скорость запуска (угол и величина или компоненты Vx(0),Vy(0)). Если вы знаете угол запуска и скорость, вы можете использовать следующие формулы:
Px(t) = Vx(0)*t
Py(t) = Vy(0)*t + 0.5*a*t*t
Где Px(t), Py(t) — положение в плоскости x, y соответственно.
Вы можете вычислить общее время полета, рассчитав Xdelta (от стартовой и целевой позиции). Затем
Xdelta = Tf*Vx(0) (общее время полета Tf) или Tf = Xdelta/Vx(0), которые затем можно повторять в цикле и отображать рассчитанные точки.
ПРИМЕЧАНИЕ. Фактический путь из Box2d будет немного отличаться от пути с закрытой формулой, поскольку Box2D аппроксимирует интеграл. Если ваш (фиксированный) временной шаг порядка 1,0/60,0, разница должна быть очень небольшой. Ваш пробег может варьироваться здесь.
В любом случае, это позволит вам построить любую точку на пути.
ОДНАКО, Я ПОДОЗРЕВАЮ, ЧТО ВАШ ВОПРОС ДЕЙСТВИТЕЛЬНО ЭТОТ:
Как рассчитать скорость пуска, чтобы поразить конкретную цель. Это не тривиальный ответ.
Начиная с угла запуска и скорости запуска Vo и Theta, вы можете написать два уравнения для Xdelta, Ydelta (из приведенных выше уравнений) как:
Xdelta = Tf * Vo*cos(тета)
Yдельта = Tf * V0*sin(тета) + 0,5*a*Tf*Tf
Если вы решите первое для Tf, вы получите
Tf = Xдельта/(Vo*cos(тета))
Подставьте во второй (вы должны проверить мою алгебру)
Yдельта = (xDelta*Vo*sin(тета))/(Vo*cos(тета)) + 0,5 * a * Xdelta^2/(Vo^2*cos(тета)^2))
Выполнение некоторой перестановки (опять же, проверьте алгебру):
2*Vo^2*cos(тета)^2*Yдельта - Vo^2*Xдельта*sin(2*тета) - a*Xдельта^2 = 0
Это нелинейное уравнение относительно Vo и тета.
Если ваш угол фиксирован, вы можете подставить тета, решить квадратное уравнение для Vo и получить из него решение.
В этой ситуации я получаю (опять же, проверьте алгебру):
Vo = +/- sqrt((a * Xdelta^2)/(2*cos(theta)^2*Ydelta - sin(2*theta)*Xdelta)
Если значение в sqrt(.) отрицательное, вы вообще не сможете сделать снимок.
Если ваш Vo фиксирован, вы можете найти решение для тета в закрытой форме или решить его численно.
Как только вы узнаете Во и тету, все еще остается вопрос «происходит ли столкновение при запуске этого снаряда».
Если вы знаете путь, по которому он следует, вы можете проверить точки на пути в цикле, используя AABB в Box2D, чтобы увидеть, есть ли какие-либо объекты, с которыми он может столкнуться. Все это можно было бы сделать в одной функции, которая выполняет итерации от 0 до Tf, с dt = фиксированный размер шага для моделирования. Обратите внимание, что если ваша скорость действительно высока, вы можете «прострелить» что-нибудь.
Это помогло?
person
FuzzyBunnySlippers
schedule
26.11.2013