Снаряд Расстояние / Время - PullRequest
1 голос
/ 21 июля 2011

Я делаю игру, и мне нужно выяснить, сколько времени понадобится объекту, чтобы упасть на определенную высоту.

Объект имеет начальное значение y (y), начальную вертикальную скорость (vy), гравитационную постоянную (гравитацию) и вертикальное расстояние до цели, которое он должен опускать (пункт назначения).1004 * Я могу понять это с помощью цикла:

int i = 0;
while(y < destination) {
    y += vy;
    vy += gravity;
    i++;
}
return i;

Единственная проблема с этим заключается в том, что мне нужно сделать это для нескольких сотен объектов, и я должен делать это для каждого кадра.* Есть ли способ выяснить это, используя какую-то формулу?Таким образом, я могу ускорить свою игру, все еще решая эту проблему.

Спасибо

Ответы [ 4 ]

1 голос
/ 21 июля 2011

Вы хотите знать, сколько кадров потребуется, чтобы пройти расстояние d , учитывая начальную (вертикальную) скорость v и ускорение (из-за силы тяжести) a .

После n кадров пройденное расстояние составляет

вн + Σ (0≤ j <<em> n ) aj = вн + ½ символ ( N -1)

Так установите d = vn + ½ an ( n -1) и решите для n :

d = vn + ½ и ( n -1)
½ ½ и 2 + n ( v - ½ a ) - d = 0

А затем используйте квадратную формулу, чтобы получить n :

n = (½ a - v ± √ (( v - ½ a ) 2 - 2 ad )) / a


Некоторые другие ответы ссылались на обычные решения уравнений движения Ньютона, но они работают только для непрерывных уравнений. Здесь у вас есть дискретное моделирование , поэтому, если вы хотите получить точные, а не приблизительные ответы, вам нужны суммы, а не интегралы, как описано выше.

Первый раз, когда мне пришлось писать код предсказания такого типа, была игра, в которой танки стреляли друг в друга артиллерийскими снарядами. Чтобы помочь с прицеливанием, игра нарисовала целевую сетку на земле в предсказанном положении, в которое приземлится снаряд. Для моей первой попытки я использовал нормальные решения непрерывных уравнений движения, и результат был довольно далек. Дискретность симуляции вносит заметный вклад в результат, и для некоторых приложений (например, рисование целевой сетки) очень важно согласие между прогнозом и симуляцией.

1 голос
/ 21 июля 2011

Вы можете решить это явно, используя элементарную физику (кинематику).

При заданной начальной скорости v, постоянном ускорении a и фиксированном расстоянии x время составляет:

(1/2) в ^ 2 + vt - x = 0

или

в ^ 2 + 2Вт - 2x = 0

Решите эту квадратную формулу и найдите положительное время.

0 голосов
/ 21 июля 2011

The only problem with this is that I need to do this for several hundred objects and I have to do it every frame.

Я думаю, что если производительность важна для вас, то формула с большим количеством * с и ^ с, вероятно, не подойдет вашей ситуации.

Я не знаю, какова ваша цель, нужна ли вам симуляция, чтобы быть точной или нет, но я думаю, вы могли бы проверить Система частиц .Хотя это всего лишь общий метод, и он не будет ускорять вашу программу напрямую, в этой области проводится множество исследований, которые могут оказаться полезными.Кроме того, вы можете прочитать this , чтобы узнать больше об этом.

Кроме того, поскольку ваш метод использует только +, я считаю, что он довольно эффективен.Если ваши объекты действительно трудно рендерить, несколько сотен не будут проблемой.Большинство формул, вероятно, сделает вашу программу лучше, но она не будет работать лучше.К вашему сведению, однажды я рендерил почти 10000 частиц на довольно старой машине, и она отлично работала.

0 голосов
/ 21 июля 2011
...