нарисовать динамическую кривую снаряда в 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(тета)

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
comment
Спасибо за ваш ответ. Я попробую это. - person Vanarajan; 30.11.2013