Малко е двусмислено, ако искате да начертаете кривата, когато вече знаете скоростта на изстрелване (ъгъл и величина или 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(тета)
Ydelta = Tf * V0*sin(theta) + 0,5*a*Tf*Tf
Ако решите първото за Tf, получавате
Tf = Xdelta/(Vo*cos(тета))
Заместете във втория (трябва да проверите моята алгебра)
Ydelta = (xDelta*Vo*sin(theta))/(Vo*cos(theta)) + 0,5 * a * Xdelta^2/(Vo^2*cos(theta)^2))
Извършване на известно пренареждане (отново, проверка на алгебрата):
2*Vo^2*cos(theta)^2*Ydelta - Vo^2*Xdelta*sin(2*theta) - a*Xdelta^2 = 0
Това е нелинейно уравнение във Vo и тита.
Ако вашият ъгъл е фиксиран, можете да включите тита, да решите квадратното за Vo и трябва да можете да извлечете решения от него.
В тази ситуация получавам (отново, проверете алгебрата):
Vo = +/- sqrt((a * Xdelta^2)/(2*cos(theta)^2*Ydelta - sin(2*theta)*Xdelta)
Ако стойността в sqrt(.) е отрицателна, изобщо не можете да направите изстрела.
Ако вашето Vo е фиксирано, може да успеете да намерите решение в затворена форма за тета или да го решите числено.
След като знаете Vo и theta, все още остава въпросът "възниква ли сблъсък, когато този снаряд бъде изстрелян".
Ако знаете пътя, който следва, можете да тествате точки по пътя в цикъл, като използвате AABB в Box2D, за да видите дали има обекти, с които може да се сблъска. Всичко това може да се направи в една функция, която итерира от 0 до Tf, с dt = фиксиран размер на стъпката за симулацията. Обърнете внимание, че ако скоростта ви е наистина висока, може да "пробудете" нещо.
Беше ли Ви полезно?
person
FuzzyBunnySlippers
schedule
26.11.2013