Если вы говорите об этом дрожании экрана от взрыва, я попытался реализовать это в моей игре-прототипе (это 2d, но я ожидаю, что она вполне может быть переведена в 3d). Посмотрите на видео YouTube и посмотрите, действительно ли это то, что вам нужно - дрожание экрана начинается примерно с 1:35.
В любом случае, я достиг этого, создав окно просмотра для сцены и сохранив центральную точку (centre
).
Когда начинается взрыв, я создаю случайный radius
~ 30px. Затем я сместил окно просмотра изcentre
на столько пикселей в случайном направлении.
Для каждого последующего обновления (между рисованием на экран) я уменьшаю radius
на 10-20% и centre
снова смещаю область просмотра на столько пикселей . Однако вместо того, чтобы выбрать случайный угол для этого смещения, я вместо этого беру предыдущий угол области просмотра изcentre
и добавил к нему 180 +/- 60 градусов.
Таким образом, в основном, при каждом обновлении (или 10-20 мс или около того) я смещаю область просмотра на уменьшающееся число пикселей от centre
экрана.
Вот некоторый псевдокод:
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
}
Я обычно останавливаю дрожание экрана, когда радиус становится меньше 2.0, после чего я возвращаю окно просмотра обратно centre
.