Jak odtworzyć efekt wypaczenia z Geometry Wars?

12

Staram się osiągnąć efekt wypaczenia widoczny w grach takich jak Geometry Wars .

Zrzut ekranu wojen geometrii z uwzględnieniem efektu wypaczenia

Czy ktoś może wyjaśnić, co się tutaj dzieje? Wydaje mi się, że programista manipuluje osią Z siatki w jakikolwiek sposób, ale czy może jest jakieś znane równanie matematyczne, aby naprawdę uzyskać właściwy efekt wypaczenia?

Edycja: Mówiąc dokładniej, mam na myśli wypaczenie siatki. Jak wszystko wygląda przyciągnięte w kierunku ujemnej osi Z, a następnie odbija się.

Joey Green
źródło
1
Masz na myśli pochylenie się w tle? Ponieważ są to Geometry Wars , na zrzucie ekranu panuje chaos, przez co od czasu do czasu drapię się po głowie i próbuję powiedzieć, o czym mówisz.
Grace Note
Tak, tło się pochyla.
Joey Green,

Odpowiedzi:

12

10-minutowe wdrożenie prostego systemu sprężynowego (przynajmniej tak pisze na swoim blogu ;)). System może obsłużyć wiele wypaczeń i inne rzeczy zniekształcające siatkę.

Zaktualizowano, aby dodać drobne szczegóły dotyczące dodawania:

Kilka innych szczegółów. Z wywiadu, który był kiedyś hostowany na stronie Bizarre Creations (ta strona zniknęła z powodu zamknięcia firmy), pojawiło się pytanie:

P: Jedną z najbardziej uderzających nowych funkcji graficznych w grze jest obszar gry „siatka grawitacji”. Jak sprawiłeś, że wyglądało to tak fajnie; czy każdy obiekt w grze ma swoją własną grawitację? Sama siatka składa się z 60 000 punktów, z których każdy wywiera niewielką siłę na sąsiada. Sama symulacja leży na krawędzi stabilności, co powoduje, że obraca się tak bardzo, gdy jeden z obiektów gry lekko ją naciska! Tylko kilka typów obiektów wpływa na siatkę. Ponieważ system siatki jest dość drogi do obliczenia, tak naprawdę działa na drugim rdzeniu wraz z systemem audio (pierwszy rdzeń jest przeznaczony do gry i cząstek, trzeci służy do renderowania dźwięku).

Roger Perkins
źródło
1

Nie wiem, czy jest to „właściwy” sposób, ale prawdopodobnie jest to po prostu przyjemna estetycznie transformacja liniowa zastosowana ze spadkiem obliczonym z odległości do punktu.

Tak więc dla każdego elementu, z którym pracujesz:

  • znajdź odległość do środka osnowy (d)
  • obliczyć 1 - d / maksymalną odległość efektu, który chciałbyś (i dla intensywności)
  • przymocuj to do [0-1]
  • przekształć element przez lerp (tożsamość, transformacja, i)

Iirc, wojny geometrii zastosowały to jako zniekształcającą osnowę do niektórych elementów, podczas gdy inne elementy, takie jak cząstki, zostały po prostu dotknięte „siłą”, bez zniekształceń. Możesz zastosować zniekształcenie w module cieniującym wierzchołki, zakładając, że masz wystarczającą liczbę wierzchołków, aby płynnie próbkować efekt. Alternatywnie możesz najpierw wyrenderować wszystko, co musi wpłynąć na bufor ekranowy, a następnie renderować wyniki na ładnie mozaikowanym kwadracie, do którego zastosujesz zniekształcenie, przed dodaniem wszystkich niezniekształconych elementów na wierzchu.

Jeśli chodzi o transformację, skalowanie da ci ssący wygląd. O ile dobrze pamiętam, działo się też trochę skręcanie, które byłoby tylko małą rotacją.

Możesz uzyskać bardziej wyrafinowane i bardziej wyrafinowane obliczenia współczynnika intensywności, aby uzyskać bardziej zwięzłe efekty. Można na przykład obliczyć kąt (a), jaki element ma względem środka, i uwzględnić w nim. Weź cos (a), aby uzyskać efekt fal promieniowych. To, co chcesz zrobić, to skonfigurować niezbędny kod rusztowania, a następnie udać się do miasta, eksperymentując z różnymi kombinacjami czynników.

Chris Subagio
źródło
Fajne dzięki, wypróbuję to. Czy algorytm, który opisujesz, jest w zasadzie efektem wiosennym?
Joey Green
Nie, nie opisałem, jak to będzie się zmieniać w czasie, więc nie wiosną. Właśnie opisałem, jak uzyskać kształt zniekształcenia, którego szukasz. Animowanie go w stylu GW wymagałoby dodania kolejnego czynnika, modulowania i w miarę upływu czasu. Spróbuj wdrożyć całość i powinno być dla ciebie jasne, że możesz skalować i, aby zrelaksować lub zintensyfikować swój efekt. Przepuść falę sinusoidalną przez tę modulującą wartość lub odbij ją jak sprężynę 1D, a skutecznie odbijesz całość. Ponownie, gdy będziesz miał uprząż z szeregiem zmiennych pływających wokół, eksperymentowanie będzie twoim przyjacielem.
Chris Subagio,