Как сделать эффект Geometry Wars под гравитационным эффектом

11

Я не говорю здесь о фоновой сетке, я говорю о вихревых частицах, движущихся вокруг гравитационных скважин! Мне всегда нравился эффект, и я решил, что это будет забавный эксперимент по его воспроизведению. Я знаю, что GW использует закон Гука повсюду, но я не думаю, что эффект Частицы-к-колодцу достигается с помощью пружин, выглядит как функция квадрата расстояния.

Вот видео, демонстрирующее эффект: http://www.youtube.com/watch?v=YgJe0YI18Fg

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

Как бы я заставил частицы по спирали выйти наружу? Как бы я держал пучки частиц вместе рядом с Колодцем, но разлетался бы друг от друга, когда они выбрасывались наружу? Как бы я держал частицы так сильно прикрепленными к Колодцу?

РЕДАКТИРОВАТЬ:
http://www.youtube.com/watch?v=1eEPl8kOXN8 <- Видео
https://dl.dropbox.com/u/49283213/gw.gif <- GIF пути частиц

Я отключил рандомизацию в GW, чтобы было легче увидеть эффект частиц, вот минутное видео, где вы можете увидеть сине-зеленый сток, отсылающий кучу частиц. Красные частицы от взрывов, которые обычно появляются повсюду. Некоторые наблюдения, которые я сделал из видео:

  • Частицы выбрасываются из центра (или около центра) стока
  • Все частицы вынуждены вращаться вокруг центра по часовой стрелке, поэтому происходит какое-то тангенциальное движение, вы можете легко увидеть это, когда красные частицы взрыва приблизятся к стоку.
Микель Стоун
источник

Ответы:

7

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

Каждая частица имеет скорость X и Y, к которой добавляется гравитация в каждом кадре, в зависимости от угла и расстояния до центра. Гравитация всегда добавляет скорость в направлении (углу) центра.

Таким образом, у вас есть для частицы: положение, скорость
Для гравитационного колодца у вас есть: положение, сила

Из позиций вы можете рассчитать угол между частицей и гравитационным колодцем. Для расчета угла вам понадобятся дельты между двумя координатами.

dx = particle.x - gravity.x; dy = particle.y - gravity.y
angle = atan2(dy, dx)

Этот угол является углом вектора скорости, который необходимо добавить.

Количество силы, которая применяется, зависит от расстояния. Точнее, он уменьшается на квадрат расстояния. Поэтому, если что-то вдвое дальше, применяется только четвертая часть силы. Для расстояния тоже нужны дельты.

distance = sqrt(dx*dx + dy*dy)
force = gravity.strength / distance*distance

Теперь у вас есть сила и угол, который вам просто нужно применить:

particle.velocity.x += force * sin(angle)
particle.velocity.y += force * cos(angle)
API-Beast
источник
Ваше решение очень похоже на мое, но оно использует atan, sin, cos, sqrt, ... поэтому оно может работать очень медленно. Лучше избегать части atan / sin / cos, см. мой пост, чтобы один (может быть, не лучший) сделать это быстрее.
GameAlchemist
Это не оптимизировано, так что это лучше понять.
API-Beast
Вы правы, но я думаю, что ответ будет гораздо полезнее, особенно для тех, кто не силен в вещах cos / sin, если после теоретического объяснения поставить «оптимизированный» псевдокод.
GameAlchemist
Я понимаю, что код здесь не оптимизирован, но кажется, что вы можете избежать вызова sqrt () на расстоянии, поскольку вы сразу же используете его через мгновение, возводя его в квадрат.
Кайл Баран
2

мне кажется, что нарисованы сегменты, а не точки. Так что я думаю, что скважина выбрасывает точку круга с высокой скоростью и вектором скорости, касательным к кругу. И еще одна точка бросается сразу после, которая связана с первым, чтобы нарисовать сегмент. Тогда я думаю, что законы физики (Ньютон) применяются с сильной гравитацией, что объясняет снижение скорости. Так что я думаю, вам нужно вовремя интегрироваться, чтобы сделать это.

с: C центр скважины, R его радиус.
P1 - точка, которую мы рассматриваем
как «большую» константу, которую вы выбираете в некоторых испытаниях (масса скважины).
vel0 - начальный вектор скорости, касательный к окружности.
vel0 должен быть высоким (также делать испытания)
pos0 начальная позиция на окружности в момент времени t0.
: d расстояние между C и P1
: Vn нормированный вектор C P1

accx= - Vnx * K * 1 / square(d)   ; accy = - Vny * K * 1/square (d)  
velx = accx*(t-t0) + vel0x   ;   vely = accy(t-t0) + vel0y  
posx= (1/2)*accx*square(t-t0) + vel0x*(t-t0) + pos0x   ;   
posy= (1/2)*accx*square(t-t0) + vel0y*(t-t0) + pos0y   

Init: Самый простой способ создать новую точку - выбрать угол A, затем:

  pos0x= Cx +R *cos(A)  ; pos0y = Cy + R*sin(A)  
  vel0x = v0*sin(A)   vel0y =  - v0*cos(A)     v0= float constant.

обновление: для каждой итерации вы должны вычислить:

d= square root( square(P1x-Cx)+square(P1y-Cy) )  
Vnx= (P1x-Cx)/d   ;   Vny=(P1y-Cy)/d  
acc (accx,accy) and finally pos (posx, posy)  as described above.     

нет необходимости вычислять скорость.
возможно в игре используется какое-то трение, тогда уравнение будет другим.
обратите внимание, что вы используете несколько раз cos (A) и sin (A), поэтому сохраните их.

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

Изменить: я думаю, вы должны попробовать это без трения, это может быть хорошо. трение - это сила, которая пропорциональна скорости, но имеет обратное направление вектора. таким образом, уравнение становится:

    Acc = Gravity force + Friction Force.

с силой трения = - постоянная * Вел. это я не знаю, как интегрировать, поэтому я бы пошаговую интеграцию:

   Vel(t+dt) = vel(t) + acc(t)*dt,   
   pos(t+dt)= pos(t)+ vel(t)*dt.  

Будет проблема численной стабильности, но поскольку время жизни частиц короткое, это не должно быть проблемой.

GameAlchemist
источник
Что должно измениться в уравнении под влиянием трения? У меня есть пара решений этой проблемы, но мне интересно услышать ваше.
Микель Стоун,
0

Я наконец сделал это, удовлетворительное воспроизведение поведения частиц.

http://www.openprocessing.org/sketch/73624

Эффект - это стандартный гравитационный эффект с завихрением, когда частицы попадают в определенный диапазон, к касательной нормали прикладывается сила. это заставляет частицы «вращаться» довольно нестабильно. Частицы в эскизе обработки не выгорают, но на вершине их орбиты это происходит, когда они выгорают и высвобождается другая группа. Спасибо всем за вашу помощь, даже если она не дала мне никакой новой информации, мы очень ценим то, что вы вложили время и усилия в свои ответы. Еще раз спасибо!

Микель Стоун
источник