начертайте динамична крива на снаряда в box2d

Искам да начертая кривата на снаряда, преди да хвърля обект.

Опитах се да създам движение на снаряд от следната връзка

http://www.iforce2d.net/src/iforce2d_Trajectories.h

Но дава пример за прехвърляне на хвърлен обект към целевото тяло.

Искам следното

  1. Начертайте кривата на снаряда между две позиции (1- фиксиран box2d обект и 2 - позиция на допир).

  2. Ако променя позицията на допир, кривата на снаряда също ще се премести в съответната позиция.

Някаква идея да следвам логиката?

Благодаря предварително.


person Vanarajan    schedule 26.11.2013    source източник
comment
МОЖЕТЕ ДА ИЗПОЛЗВАТЕ уравнението на BEZIER CORVE, в което съдържа четири точки, за да начертаете крива. Проверете в примера за демонстрация на cocos2d-x или wiengine   -  person Singhak    schedule 26.11.2013
comment
Но кривата на Безие се нуждае от контролни точки. Целевото тяло трябва да се намира на всяко място. Искам динамична крива. Не знаем контролните точки.   -  person Vanarajan    schedule 26.11.2013
comment
имате фиксирана точка и точка на докосване, тогава можете да откриете две точки също като използвате тези точки.   -  person Singhak    schedule 26.11.2013


Отговори (1)


Малко е двусмислено, ако искате да начертаете кривата, когато вече знаете скоростта на изстрелване (ъгъл и величина или 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
comment
Благодаря за вашия отговор. Ще пробвам това. - person Vanarajan; 30.11.2013