Якщо ви маєте на увазі цей тріск екрану від вибуху, я спробував реалізувати це у своїй прототипі гри (це 2d, але слід перекласти на 3d досить добре, я очікую). Подивіться на відео YouTube і переконайтесь, що це те, що ви шукаєте - тремтіння екрану починається близько 1:35
Як би там не було, я домігся того, щоб створити вікно перегляду сцени та зберігати центральну точку ( centre
).
Коли вибух починається, я створюю випадковий radius
розмір ~ 30 пікс. Потім я компенсую вікно перегляду 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
.