Реалістичний тремтіння камери / екрану від вибуху


36

Я хотів би трохи похитнути камеру під час вибуху, і я спробував декілька різних функцій для розгойдування її навколо, і, здається, ніщо насправді не дає цього "вау, який удар!" тип почуття, яке я шукаю. Я спробував декілька довільних синусоїдальних моделей порівняно високої частоти з лінійним ослабленням, а також квадратного типу хвильового типу. Я спробував перемістити лише одну вісь, дві та всі три (хоча ефект куреня був ледь помітний у такому випадку).

Хтось знає про хороший тремтіння камери?


2
Спробуйте знайти кілька знімків фільму про струски камери після вибухів, і дивіться його в повільному темпі, щоб побачити, як камери трясуться, та базуйте свій код на цьому.
Skizz

У мене точно така ж проблема - коливання просто виглядає занадто гладко
Iain

Найбільшою проблемою, з якою я стикаюсь при здійсненні тремтіння камери, є те, що здається, що персонаж гравця (на якому фокусується камера) замість камери. Дивно, що саме камера рухається, якщо ви дивитесь на оточення, яке помічаєте, але оскільки ви настільки зосереджені на персонажі гравця, ваше сприйняття накручується. Я все ще намагаюся вирішити це - ймовірно, змінюючи поле зору, коли камера відсувається / спрямовує плеєр.
Кай

Відповіді:


35

Я отримав гідний тремтіння камери, застосувавши звук Перліна до орієнтації камери. Це дає вам пристойний великий поштовх з вбудованою більш високою частотою, і може виглядати дуже добре.

http://mrl.nyu.edu/~perlin/doc/oscar.html містить більше деталей та зразок коду для створення шуму.


3
О, шум, чому я не подумав про це ... Запропонувавши удар, я дуже короткий вибух, чи не так ... Відмінна ідея!
falstro

хороша ідея, чи є щось, що ви не можете використовувати перлін шум для вирішення? : P
Cubed2D

1
Шум - це безумовно шлях, якщо ви навіть змалюєте ефект, який ви отримаєте після, його короткі зміни випадкового руху в різних напрямках. Але це не може бути спазмом, тому вам потрібні короткі розділи однаковості. Звучить як ідеальне використання шуму Перліна.
deceleratedcaviar

17

Якщо ви маєте на увазі цей тріск екрану від вибуху, я спробував реалізувати це у своїй прототипі гри (це 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.


4
Мені дуже подобається ця реалізація, прекрасно працює для невеликих 2D ігор. Як коментар це рівнозначно, щоб randomAngle += (150 + rand()%60)позбутися будь-яких +/- проблем.
Krøllebølle

2
Ваше відео вимкнено.
Тара

Який розрахунок "+/-"? Я ніколи не бачив цього роду речі.
Yoo Matsuo

4

Для правильного тремтіння камери правильним є менше значення напрямку руху та більше кривих прискорення.

Потрохи камери занурюються у сферу анімації, тому застосовуються всі правила дії / реакції. Якщо ви рухаєтеся лінійним способом від точки до точки, він буде відчувати себе рівним і рівномірним і не схожим на удари.

Якщо ви похитаєте головою вперед і назад, ви помітите, що вона рухається найшвидше в середині точки між зміною напрямку і сповільнюється з кожної сторони, як спочатку вам доведеться сповільнитись, а потім запустити в новому напрямку.

Ось перелік різних функцій полегшення, які потрібно застосувати до вашого руху. Ви можете хотіти лише EaseOut перший рух, щоб він відчував себе трохи більш різким, а потім EaseInOut решта, щоб імітувати рух голови / камери.


1
Я думаю, що ослаблення все-таки зробить це занадто гладко. Шум перлин здається гарною ідеєю, інакше звичайний випадковий випадковий діапазон, що зменшується до нуля з часом, щоб зникнути (я б скоріше експериментував з різними функціями легкості на зменшуваному радіусі, ніж на фактичному русі, полегшуючи рух сама по собі змусить камеру відчути, що вона пружина, не відчуває себе правильно з тремтінням камери, на мій досвід).
Кай

3

wkerslake вірно, струси камери здаються складнішими, ніж ви могли подумати.

Під час емуляції тремтячої камери вам доведеться подумати, який тип камери (оператора) ви хочете імітувати. Вага камери впливає на інерцію, наприклад. важчі камери згладжують невеликі «випадкові» рухи. Оператор камери на залізниці або в вагоні додає додатковий шум.

Використання шуму Perlin або Simplex, безумовно, є варіантом, тоді все полягає у пошуку правильного балансу між різними рівнями шуму. Але я виявив, що використання інтерполяції між величинами є менш обчислювальною та може бути настільки ж ефективною.

Нещодавно я знайшов сценарій майя, який, здається, виправив багато речей. Ви могли поглянути на це .

Крім того, ви можете поглянути на Gran Turismo (5) , їх команда зробила вражаючу роботу, роблячи різні типи тремтіння камери в режимі реального часу, коли ви спостерігаєте за повтором у грі.


2

Якщо у вас є фізика динамічного об'єкта [напевно, не правильне слово, але щось таке, що я маю на увазі], коли будь-які об'єкти, що не були зафіксовані, були б "здуті" вибухом, ви могли б вплинути на камеру як такий предмет.
Єдина відмінність полягала б у тому, щоб змінити обертання / крок / позіхання / рулон камери, а не положення.
Крім цього, можливо, генерувати випадкову послідовність чисел і перетворити їх на обертання якось? Подумайте, що приклад з висоти, відтінки сірого можуть бути прикладом; вони не зовсім різні, але випадкові.


+1 цікава ідея, я думаю, що я спробую рух шуму, і коли я запускаю цей крок, я спробую додати ефект більш малого кузова, на зразок, як якщо б камера була прикріплена до пружини і натиснута назад від шоку.
falstro
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.