Як зробити ефект гравітації Геометрії воєн добре


11

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

Ось відео, що демонструє ефект: http://www.youtube.com/watch?v=YgJe0YI18Fg

Я можу реалізувати ефект пружини або сили тяжіння до деяких частинок просто чудово, це просто. Але я не можу отримати ефект, схожий на ефект GW. Коли я спостерігаю за ефектом в грі, то здається, що частинки викидаються в пучки з самої свердловини, вони спірально виходять навколо центру колодязя, і врешті-решт викидаються назовні, падають назад до колодязя і повторюються.

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

EDIT:
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)

ваше рішення досить схоже на моє, але воно використовує atan, sin, cos, sqrt, ... тому воно може ставати дуже повільним. краще уникати частини atan / sin / cos, перегляньте мій пост, щоб один (можливо, не найкращий) зробити це швидше.
GameAlchemist

Це не оптимізовано, так що це краще зрозуміло.
API-Beast

Ви маєте рацію зробити це, але я думаю, що відповідь набагато корисніше, особливо для тих, хто не сильний у cos / sin речах, якщо ви поставите «оптимізований» псевдокод після теоретичного пояснення.
GameAlchemist

Я усвідомлюю, що код тут не оптимізований, але, здається , ви можете уникнути дзвінка sqrt () на відстані, оскільки ви негайно використовуєте його через мить, вдавивши його.
Кайл Баран

2

мені здається, що те, що намальовано, це сегменти, а не бали. Тож я гадаю, що свердловина викидає точку кола з великою швидкістю та дотичною до кола вектор швидкості. І ще один момент кидається відразу після, який пов’язаний з першим, щоб намалювати відрізок. Тоді я думаю, що закони фізики (Ньютона) застосовуються з сильною гравітацією, що пояснює зниження швидкості. Тому я здогадуюсь, що для цього потрібно вчасно інтегруватися.

з: C центр свердловини, R її радіус.
P1 точка, яку ми дивимось на
K, як на "велику" константу, яку ви обираєте за допомогою деяких випробувань (маса свердловини).
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   

Ініт: Найпростіший спосіб перейти до нересту нової точки - це вибрати кут А, потім:

  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. це я не знаю, як інтегруватися, тому я б пішов на покрокову інтеграцію:

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

ВИНАГО буде чисельність стабільності, але оскільки термін експлуатації деталей короткий, це не повинно бути проблемою.


Що було б змінити щодо рівняння під впливом тертя? У мене є пару рішень цього питання, але мені цікаво почути ваше.
Мікель Стоун

0

Нарешті я це зробив, задовільною реплікацією поведінки частинок.

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

Ефект - це стандартний ефект тяжіння із поворотом, коли частинки потрапляють у певний діапазон, сила докладається на дотичну норму. це змушує частинки "орбіти" досить нестабільно. Частинки в обробці ескізу не вигорають, але на вершині їх орбіти саме тоді вони вигорять і ще одна купа буде випущена. Дякую всім за вашу допомогу, навіть якщо вона насправді не надала мені ніякої нової інформації, дуже цінуємо, що ви вклали час і зусилля, які ви зробили, щоб відповісти. Знову дякую!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.