Реалистичная камера / дрожание экрана от взрыва

36

Я хотел бы немного потрясти камеру во время взрыва, и я попробовал несколько различных функций для ее поворота, и, кажется, ничто не дает такого «вау, что за взрыв!» Типа ощущения, которые я ищу. Я попробовал несколько произвольных относительно высокочастотных синусоидальных паттернов с небольшим линейным затуханием, а также паттерн типа прямоугольной волны. Я попытался переместить только одну ось, две и все три (хотя в этом случае эффект долли был едва заметен).

Кто-нибудь знает хороший шаблон дрожания камеры?

falstro
источник
2
Попытайтесь найти кадры из фильма о сотрясениях камеры после взрывов и посмотреть ее в замедленном режиме, чтобы увидеть, как сотрясается камера, и основывать свой код на этом.
Skizz
У меня точно такая же проблема - колебание выглядит слишком гладким
Иан
Самая большая проблема, с которой я сталкиваюсь при реализации дрожания камеры, заключается в том, что персонаж игрока (на котором фокусируется камера) движется вместо камеры. Странно то, что движется камера, если вы смотрите на окружение, которое вы замечаете, но, поскольку вы так сосредоточены на персонаже игрока, ваше восприятие искажается. Я все еще пытаюсь решить эту проблему - возможно, путем изменения поля зрения, когда камера перемещается в сторону игрока.
Кадж

Ответы:

35

Я получил приличное дрожание камеры, применив шум Перлина к ориентации камеры. Это дает вам приличный большой толчок с встроенным высокочастотным встряхиванием, и может выглядеть действительно хорошо.

http://mrl.nyu.edu/~perlin/doc/oscar.html содержит более подробную информацию и пример кода для генерации шума.

Джеймс Сазерленд
источник
3
О, шум, почему я не подумала об этом ... После всего, я взрываю шум, не правда ли ... Отличная идея!
Фальстро
хорошая идея, есть ли что-то, что вы не можете использовать Perlin Noise для решения? : P
Cubed2D
1
Шум, безусловно, является подходящим способом, если вы даже представляете эффект, который вы испытываете, - его короткие изменения в случайном движении в разных направлениях. Но это не может быть спазмом, поэтому вам нужны короткие участки единообразия. Звучит как идеальное использование для шума Перлина.
замедленная
17

Если вы говорите об этом дрожании экрана от взрыва, я попытался реализовать это в моей игре-прототипе (это 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.

miklatov
источник
4
Мне очень нравится эта реализация, отлично работает для небольших 2D игр. В качестве комментария это эквивалентно тому randomAngle += (150 + rand()%60), чтобы избавиться от любых +/- проблем.
Krøllebølle
2
Ваше видео не работает.
Тара
Что за расчет "+/-"? Я никогда не видел такого рода вещи.
Ю Мацуо
4

Чтобы заставить «дрожать» камеру «чувствовать» правильно, нужно не столько направление движения, сколько кривые ускорения.

Дрожание камеры погружается в сферу анимации, поэтому применяются все правила действия / реакции. Если вы движетесь линейно от точки к точке, это будет выглядеть плавно и равномерно, а не как удар.

Если вы покачиваете головой взад-вперед, вы заметите, что она движется быстрее всего в средней точке между сменой направления и замедляется с каждой стороны, поскольку сначала вам нужно замедлиться, а затем начать движение в новом направлении.

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

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

wkerslake прав, дрожание камеры кажется более сложным, чем вы думаете.

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

Использование Perlin или Simplex шума определенно является вариантом, тогда все дело в поиске правильного баланса между различными коэффициентами шума. Но я обнаружил, что использование интерполяции между значениями требует меньше вычислительных ресурсов и может быть столь же эффективным.

Некоторое время назад я нашел скрипт Maya, который, кажется, многое делает правильно. Вы могли бы взглянуть на это .

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


источник
2

Если у вас есть физика динамических объектов [вероятно, не правильное слово, но вроде того, что я имею в виду], где любые нефиксированные объекты будут «сдуты» взрывом, вы можете заставить камеру воздействовать на такой объект.
Единственной разницей было бы просто изменить поворот / шаг / рыскание / крен камеры, а не положение.
Кроме этого, может быть, генерировать последовательность случайных чисел и как-то преобразовать их в ротацию? Подумайте, что карта высот, оттенки серого могут быть примером; они не совсем разные, но случайные.

Коммунистическая утка
источник
+1 интересная идея, я думаю, что я попробую движение шума, и когда у меня это запустится, я попытаюсь добавить более гладкий эффект, как будто камера была прикреплена к пружине и нажата назад от шока.
Фальстро