Создание HDRI-карты с помощью Blender и Hugin

Сферическая панорама == фотография с углом обзора в 360°.

HDRI-карта == сферическая панорама, в которой хранятся данные не только о цвете, но и о яркости каждого пикселя. Её можно использовать для освещения сцены, тем самым создавая реалистичное освещение в пару кликов.

Что понадобится?

0. Хард:

0.0. Зеркальная камера

0.1. объектив типа «Рыбий глаз» — не обязателен, но сэкономит кучу времени;

0.2. штатив

0.3. панорамная головка для штатива

1. Софт

1.0. Blender (бесплатно скачивается с http://blender.org)

1.1. Hugin (http://hugin.sourceforge.net).

Если нужного оборудования нет — его можно взять на Aliexpress, где стоимость ниже. Вот, например, вполне приличный «Рыбий глаз»:

Нищебродский вариант — линза, накручиваемая на объектив и увеличивающая угол обзора. Например:

Панорамная головка. Здесь важно не ошибиться и выбрать именно такую, которая подойдёт для нашей цели. Выглядит она примерно так:

(ссылка на товар на тот случай, если в момент прочтения сего он ещё будет в наличии).

Камера. Нужна опция брекетинга экспозиции aka вилка экспозиции, если у вас есть не зеркальная камера, которая это умеет — пойдёт и не зеркальная.

Штатив — тут особо рассказывать не о чем, подойдёт любой или почти любой.

Подготовка

Камеру устанавливаем на панорамную головку. Наша задача — сделать так, чтоб нодальная точка объектива не перемещалась при вращении камеры. Нодальная точка – место пересечения лучей света, проходящих через оптическую ось объектива.

(изображение отсюда, там же чуть подробнее про нодальную точку)

Камеру надо установить так, чтоб ось вращения штатива совпала с нодальной точкой. Как её найти — отдельный разговор, посмотрите документацию к объективу, если оной не имеется — подбирайте вручную, способы находятся в интернетах.

Панорамную головку с камерой ставьте на штатив.

Также нужно включить брекетинг экспозиции, как включить — зависит от модели камеры, читайте мануал. В этом режиме при одном нажатии на кнопку камера делает по 3 (и более) снимков с разной экспозицией (читай — разной яркостью). Это позволит создать не просто сферическую картинку, а именно HDRI, сохраняющую информацию о свете и понимающую, что белое солнце ярче белой футболки (в то время как для JPEG и там, и там - одинаковый белый пиксель).

Съёмка

Задача — сфотографировать всё вокруг себя, со всех сторон. Алгоритм следующий:

0. делаем снимок;

1. сдвигаем камеру в сторону так, чтоб на первом и втором кадре область процентов в 20-30 была общей, делаем ещё снимок;

(лайк за котика!)

2. повторяем процедуру, пока не сделаем полный круг;

3. Наклоняем камеру, чтоб она смотрела вверх — опять же, 20-30% верхних и нижних кадров должны быть общими.

4. Делаем ещё один круг, но уже уровнем выше.

5. Снова наклоняем камеру вверх, делаем круг — и так до тех пор, пока не снимите все вплоть до потолка.

6. Теперь возвращаем камеру в горизонтальное положение, наклоняем уже вниз, повторяем процедуру.

7. В итоге должны получить серию снимков, которые все вместе охватывают всё пространство вокруг. Практика показывает, что это 60-70 снимков на обычный фотоаппарат («мыльница» или «зеркалка» с обычным объективом) и 16-20 снимков на «рыбий глаз» (в связи с гораздо большим углом обзора). Если включен брекетинг и камера каждый раз делает по 3 снимка — соответственно, эти числа тоже умножаются на 3 (или по скольку там у вас за одно нажатие делает снимков камера).

Сшивка панорамы

Для сшивки панорамы будем использовать предназначенный специально для этого Hugin. Запускаем, сразу переводим в «экспертный» режим:

Жмём «Добавить снимки...» и добавляем все отснятые файлы.

Hugin может попросить заполнить данные об объективе (особенно если объектив китайский):

Заполняем в зависимости от характеристик используемого объектива. В моём случае (ссылка на объектив выше) тип объектива == полнокадровый рыбий глаз, ГорПЗ (v) == 162 (угол обзора, был указан в описании товара на Aliexpress), остальное Hugin подберёт сам.

Жмём «ОК». Если снимали с включенным брекетингом экспозиции, видим следующее:

Жмём «Link position».

Далее:

0. нажимаем "Создать контрольные точки";

1. когда Hugin закончит (выдаст сообщение типа "Добавлено 1456 контрольных точек") - находим пункт "Оптимизация Геометрическая", убеждаемся, что там стоит стандартное "Позиции (с приращением, начиная с фиксированного снимка" и жмём кнопку "Вычислить" справа;

2. когда закончит - соглашаемся с принятием изменений, переключаем геометрическую оптимизацию на "Всё без переноса" и снова жмём "Вычислить";

3. включаем просмотр панорамы:

4. Убеждаемся, что эти рычаги находятся в крайней правой/нижней позиции, если это не так — сдвигаем:

5. Теперь предпросмотр можно закрыть.

Переходим к сшивке.

Размер холста можно изменить, но больший размер будет сшиваться дольше.

По окончании сшивки (а она может идти долго) получаем результат:

Корректировка яркости

Для сабжа будем использовать программу Blender. Объяснять буду на примере уже другой панорамы, с ярким солнцем:

Открываем Blender. Для примера наглядности добавим плоскость и куб в сцену, рендер переключаем на Cycles, в качестве карты окружения устанавливаем нашу панораму (в формате .hdr или .exr), выбираем режим просмотра «Rendered».

Слабо соответствует погоде и освещённости, не так ли? Исправим.

Открываем редактор материалов, переключаемся на материалы «мира» и приводим всё к следующему виду:

Экспериментируем со значением Value узла Power и Strength узла Background (которые в данном примере 5.000 и 3.000 соответственно). Первый влияет на резкость теней, второй на яркость окружения в целом. Результат получается куда лучше:

Поскольку возиться с нодами материала каждый раз не хочется, сделаем следующее.

0. Из сцены удаляем всё кроме камеры.

1. Камеру располагаем в центре.

2. Повёрнута камера должна быть прямо перед собой.

3. В настройках камеры включаем режим Panoramic, Type == Equirectangular, остальное не трогаем.

Жмём F12 чтобы отрендерить изображение — получаем результат. Результат сохраняем. В меню сохранения нужно выбрать формат RadianceHDR или OpenEXR (но не png, как предложено по умолчанию). Наиболее компактный файл получается, если формат выбрать OpenEXR, а Codec - DWAA (lossy). Кстати, тех 50-100%, что мы видим в Resolution, для сферической панорамы недостаточно, лучше поставить там 300-400%.

Теперь сохранённый файл можно загрузить в качестве Environment Texture и освещение будет таким, каким должно быть (с ярким солнцем и резкими тенями).

А если у меня нет HDR, только JPG?

Допустим, съёмка кадров для будущей панорамы производилась без брекетинга экспозиции или помешало всё правильно сделать что-то иное, но у нас в распоряжении имеется панорама в формате типа JPG. Как уже было сказано ранее — такие форматы не имеют представления о яркости, то есть на этой панораме, если она в формате JPG, солнце и корпус корабля одной яркости (белый цвет, RGB==255,255,255). Но можно попытаться выкрутиться.

Создаём новую сцену в Blender. Камера, как и прежде, по центру и смотрит прямо, остальные объекты удалить. Создаём сферу (она должна окружать камеру со всех сторон), даём ей материал Emission, натягиваем в качестве текстуры панораму:

Делаем дубликат и сферы, и материала. На этом дубликате с помощью ColorRamp «изолируем» наиболее яркие области:

В результате солнце становится белым, всё остальное — прозрачным:

Теперь изменяя силу у нода Emission, мы можем регулировать яркость солнца:

И да, чтоб это яркое белое пятно излучало свет, но не было видно на самой панораме — отключаем его видимость при виде из камеры:

Нам нужно только объединить две сферы — сфера, на которой имеется полная картинка, и внутри неё чуть (совсем немного!) уменьшенная сфера, где есть только очень яркое солнце…

И, как уже делалось ранее, настроить камеру на 360-градусный обзор (Panoramic, тип Equirectangular). Рендерим, сохраняем в формате RadianceHDR или OpenEXR.

Стоит заметить, что в случае с ярким солнцем в безоблачную погоду этот приём вряд ли даст нужный результат (яркие и резкие тени). Здесь я бы попробовал добавить источник света типа Sun и правильно его спозиционировать. А вот усилить таким образом яркость окон на лестнице из примера выше — вполне можно.

Автор: Денис Скиба aka Mapper720

13.01.2018