Как мне воспроизвести эффект деформации из Geometry Wars?

12

Я пытаюсь добиться эффекта деформации, который вы видите в таких играх, как Geometry Wars .

Скриншот Geometry Wars, включая эффект деформации

Может кто-нибудь помочь объяснить, что здесь происходит? Я чувствую, что программист, так или иначе, каким-то образом манипулирует осью z сетки, но, может быть, есть какое-то известное математическое уравнение, которое действительно дает правильный эффект деформации?

Изменить: чтобы быть более конкретным, я имею в виду деформации сетки. Как все выглядит, тянется к отрицательной оси Z, а затем отскакивает.

Джои Грин
источник
1
Вы имеете в виду изгиб фона? Так как это Geometry Wars , на скриншоте много хаоса, что заставило меня немного почесать голову, чтобы попытаться сказать, на что вы ссылались.
Благодать Примечание
Да, фон искажается.
Джои Грин,

Ответы:

12

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

Обновлено, чтобы добавить некоторые мелкие детали:

Несколько других деталей. Из интервью, которое раньше размещалось на сайте Bizarre Creations (этот сайт исчез из-за закрытия компании), возник вопрос:

В: Одной из самых ярких новых графических функций в игре является игровая зона «Сетка гравитации». Как ты заставил это выглядеть так круто; каждый объект в игре действительно имеет собственную гравитацию? Сама сетка состоит из 60000 точек, каждая из которых прилагает небольшое усилие к своему соседу. Сама симуляция находится на грани стабильности, что заставляет его так сильно качаться, когда один из игровых объектов дает ему небольшой толчок! Только несколько типов объектов влияют на сетку. Поскольку сеточная система довольно дорога в расчете, она фактически работает на втором ядре вместе с аудиосистемой (первое ядро ​​предназначено для игрового процесса и частиц, третье используется для визуализации звука).

Роджер Перкинс
источник
1

Я не знаю, есть ли «правильный» способ сделать это, но это, вероятно, просто эстетически приятное линейное преобразование, примененное с падением, вычисленным от расстояния до точки.

Поэтому для любого элемента, с которым вы работаете, вы бы:

  • найдите расстояние до центра варпа (d)
  • рассчитать 1 - d / максимальное расстояние эффекта, который вы хотите (я для интенсивности)
  • зажмите это к [0-1]
  • преобразовать элемент с помощью lerp (identity, transform, i)

Iirc, Геометрические войны применили это как искажающее искажение к некоторым элементам, в то время как другие элементы, такие как частицы, были просто затронуты «силой», без искажений. Вы можете применить искажение в вершинном шейдере, предполагая, что у вас достаточно вершин для плавной выборки эффекта. В качестве альтернативы вы можете сначала отрисовать все, что нужно для воздействия на внеэкранный буфер, а затем отобразить результаты в хорошо тесселированный квад, к которому вы применяете искажение, перед добавлением всех неискаженных элементов сверху.

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

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

Крис Субаджио
источник
Круто, спасибо, я попробую это. Является ли описанный вами алгоритм в основном эффектом весны?
Джои Грин,
Нет, я не описал, как это будет меняться со временем, поэтому не весна. Я только что описал, как получить форму искажения, которую вы ищете. Анимация его в стиле GW потребует добавления еще одного фактора, модулирующего меня с течением времени. Попробуйте реализовать все это, и вам должно стать ясно, что вы можете масштабировать i, чтобы расслабить или усилить свой эффект. Пропустите синусоидальную волну через это модулирующее значение или отскоките его, как пружину 1D, и вы эффективно отскочит все это. Опять же, как только у вас будет набор с множеством переменных, эксперимент станет вашим другом.
Крис Субаджио