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ę centre
o tyle pikseli w losowym kierunku.
Dla każdej kolejnej aktualizacji (między losowaniami do ekranu) zmniejszam radius
o 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 centre
i 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 centre
ekranu.
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
.