Realistyczne drgania aparatu / ekranu z eksplozji

36

Chciałbym trochę potrząsnąć kamerą podczas eksplozji, a ja wypróbowałem kilka różnych funkcji do kołysania nią i wydaje się, że nic tak naprawdę nie daje tego „wow, co za huk!” Wpisz uczucie, którego szukam. Próbowałem dowolnych wzorców fal sinusoidalnych o stosunkowo wysokiej częstotliwości z odrobiną liniowego tłumienia, a także wzoru fali prostokątnej. Próbowałem przesunąć tylko jedną oś, dwie i wszystkie trzy (chociaż w tym przypadku efekt dolly był ledwo zauważalny).

Czy ktoś wie o dobrym wzorze drgań aparatu?

falstro
źródło
2
Spróbuj znaleźć film z drgań aparatu po eksplozji i obejrzyj go w zwolnionym tempie, aby zobaczyć, jak porusza się kamera, i oprzyj na tym swój kod.
Skizz
Mam dokładnie ten sam problem - kołysanie wygląda po prostu zbyt gładko
Iain
Największym problemem, z którym się spotykam przy wdrażaniu drgań aparatu, jest to, że wydaje się, że postać gracza (na której skupia się kamera) porusza się zamiast aparatu. Dziwne jest to, że porusza się kamera, jeśli spojrzysz na otoczenie, które zauważysz, ale ponieważ jesteś tak skupiony na postaci gracza, twoja percepcja się psuje. Wciąż próbuję rozwiązać ten problem - prawdopodobnie zmieniając pole widzenia, gdy kamera oddala się / w stronę gracza.
Kaj

Odpowiedzi:

35

Mam przyzwoite drgania aparatu, stosując szum Perlina do orientacji aparatu. Daje przyzwoity duży wstrząs z wbudowanym drżeniem wyższych częstotliwości i może wyglądać naprawdę dobrze.

http://mrl.nyu.edu/~perlin/doc/oscar.html zawiera więcej szczegółów i przykładowy kod do generowania szumu.

James Sutherland
źródło
3
Och, hałas, dlaczego o tym nie pomyślałem ... Mimo wszystko huk, prawie krótki wybuch hałasu, prawda ... Świetny pomysł!
falstro
dobry pomysł, czy jest coś, czego nie można użyć do rozwiązania problemu perlin? : P
Cubed2D
1
Hałas to zdecydowanie najlepsza droga, jeśli nawet wyobrazisz sobie swój efekt, jego krótkie zmiany losowego ruchu w różnych kierunkach. Ale to nie może być skurcz, więc potrzebujesz krótkich odcinków jednolitości. Brzmi jak idealne zastosowanie do hałasu Perlin.
spowolniłaviar
17

Jeśli masz na myśli wstrząsające wstrząsy ekranu z eksplozji, próbowałem zaimplementować to w mojej prototypowej grze (jest to 2d, ale, jak sądzę, powinno to dość dobrze tłumaczyć na 3d). Spójrz na wideo z YouTube'a i sprawdź, czy tego właśnie szukasz - wstrząsy ekranu zaczynają się około 1:35

W każdym razie sposób, w jaki to osiągnąłem, to utworzenie rzutni dla sceena i zapisanie punktu środkowego ( centre).

Kiedy rozpoczyna się eksplozja, tworzę losowy radius~ 30px. Następnie przesunąłem rzutnię centreo tyle pikseli w losowym kierunku.

Dla każdej kolejnej aktualizacji (między losowaniami do ekranu) zmniejszam radiuso 10-20% i ponownie odsuwam rzutnię o tyle pikseli centre. Jednak zamiast wybierać losowy kąt dla tego przesunięcia, zamiast tego wybieram poprzedni kąt rzutni centrei dodałem do niego 180 +/- 60 stopni.

Zasadniczo każda aktualizacja (lub około 10-20 ms) przesunąłem obszar wyświetlania o malejącą liczbę pikseli od centreekranu.

Oto pseudokod:

viewportCentre = (400,300) //Lets say screen size is 800 x 600
radius = 30.0
randomAngle = rand()%360
offset = ( sin(randomAngle) * radius , cos(randomAngle) * radius) //create offset 2d vector
viewport.setCentre(viewportCentre + offset) // set centre of viewport
draw()  

while(true)  //update about every 10-20ms
{ 
    radius *=0.9 //diminish radius each frame
    randomAngle +=(180 +\- rand()%60) //pick new angle 
    offset = (sin(randomAngle) * radius , cos(randomAngle) * radius) //create offset 2d vector
    viewport.setCentre(viewportCentre + offset) //set centre of viewport
    draw() //redraw
}

Zazwyczaj zatrzymuję wstrząsanie ekranu, gdy promień jest mniejszy niż 2,0, w którym to momencie resetuję ponownie rzutnię centre.

miklatov
źródło
4
Bardzo podoba mi się ta implementacja, doskonale sprawdza się w małych grach 2D. Jako komentarz jest to równoznaczne z randomAngle += (150 + rand()%60)pozbyciem się problemów +/-.
Krøllebølle,
2
Twój film jest wyłączony.
Tara
Jakiego rodzaju obliczenia „+/-”? Nigdy nie widziałem tego rodzaju rzeczy.
Yoo Matsuo,
4

Poprawne „wyczucie” drgania kamery polega nie tyle na kierunku ruchu, co na krzywych przyspieszenia.

Drgania aparatu nurkują w krainę animacji, dlatego obowiązują wszystkie zasady akcji / reakcji. Jeśli poruszasz się liniowo od punktu do punktu, będzie on gładki i jednolity, a nie jak uderzenie.

Jeśli potrząśniesz głową do przodu i do tyłu, zauważysz, że porusza się on najszybciej w punkcie środkowym między zmianą kierunku i zwalnia z każdej strony, ponieważ najpierw musisz zwolnić, a następnie zacząć w nowym kierunku.

Oto lista różnych funkcji łagodzenia, które można zastosować do twojego ruchu. Możesz chcieć tylko EaseOut pierwszy ruch, aby poczuć się nieco bardziej gwałtowny, a następnie EaseInOut resztę, aby zasymulować ruch głowy / kamery.

wkerslake
źródło
1
Myślę, że złagodzenie nadal sprawi, że będzie to zbyt płynne. Hałas perlin wydaje się być dobrym pomysłem lub w inny sposób zwykłym przypadkowym z zakresem losowym zmniejszającym się do zera w czasie, aby go zaniknąć (wolałbym eksperymentować z innymi funkcjami łatwości na malejącym promieniu niż na rzeczywistym ruchu, ułatwiając ruch sam sprawi, że aparat poczuje się, jakby był na wiosnę, z mojego doświadczenia nie pasuje do drgań aparatu).
Kaj
3

wkerslake ma rację, drgania aparatu wydają się bardziej złożone, niż mogłoby się wydawać.

Podczas emulacji wstrząsającej kamery należy pomyśleć o tym, jaki typ kamery (operatora) chcesz naśladować. Ciężar aparatu wpływa na bezwładność, np. cięższe kamery wygładzają niewielkie „losowe” ruchy. Operator kamery na szynie lub w samochodzie powoduje dodatkowy hałas.

Korzystanie z szumu Perlin lub Simplex jest zdecydowanie opcją, wtedy chodzi o znalezienie właściwej równowagi między różnymi stosunkami hałasu. Odkryłem jednak, że użycie interpolacji między wartościami jest mniej intensywne obliczeniowo i może być równie skuteczne.

Jakiś czas temu znalazłem skrypt Mayi, który wydaje się naprawiać wiele rzeczy. Można spojrzeć na to .

Warto też rzucić okiem na Gran Turismo (5) , ich zespół wykonał imponującą robotę, wykonując różnego rodzaju drgania kamery w czasie rzeczywistym, gdy oglądasz powtórkę w grze.


źródło
2

Jeśli masz fizykę dynamicznych obiektów [prawdopodobnie nie jest to właściwe słowo, ale coś, co mam na myśli], gdzie wszelkie nieruchome obiekty zostaną „zdmuchnięte” przez eksplozję, możesz mieć wpływ na kamerę jako taki obiekt.
Jedyną różnicą byłaby tylko zmiana obrotu / pochylenia / odchylenia / przechyłu kamery, a nie pozycja.
Poza tym, może wygenerować losową sekwencję liczb i przekonwertować ją na rotację? Pomyśl, że mapa wysokości, skala szarości może być przykładem; nie są zupełnie inne, ale są losowe.

Kaczka komunistyczna
źródło
+1 interesujący pomysł, myślę, że spróbuję ruchu hałasu, a kiedy już to uruchomię, spróbuję dodać bardziej płynny efekt dolly, jakby kamera była przymocowana do sprężyny i wciśnięta do tyłu przez szok.
falstro