Давайте напишем ... MMO! Часть 7: Производство видео

Опубликовано NowhereMan - пн, 05/11/2020 - 21:26

5 января 2011

Должен сказать, что производство моего маленького видео оказалось головной болью. Но это моя первая попытка снять видео, так что, наверное, я должен был ожидать некоторых проблем.

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

Я интегрировал это в мой (медленный) трассировщик лучей. Затем мне нужно было расположить камеру и лететь в поисках фильма. Для этого я добавил функцию в демо-версию моего кубического мира. Я могу летать в этом мире, и с помощью функциональной клавиши записывать текущее положение и углы камеры в файл. Это дает мне возможность легко проложить путь камере. Затем трассировщик лучей считывает этот файл и создает отдельные кадры, 30 в секунду, вдоль пути камеры. Достаточно просто.

Рис. 1: Мои первые 9 секунд

{"preview_thumbnail":"/sites/default/files/styles/video_embed_wysiwyg_preview/public/video_thumbnails/30soEo5e-QI.jpg?itok=GC3mmftD","video_url":"https://youtu.be/30soEo5e-QI","settings":{"responsive":1,"width":"854","height":"480","autoplay":0},"settings_summary":["Embedded Video (Адаптивный)."]}

Я создал девятисекундное видео с моим очень медленным трассировщиком лучей, которое вы можете увидеть на рисунке 1. Файл AVI, конечно же, был огромным, так как ни один из кадров не был сжат. Обычно я использую Handbrake для перекодирования видео. К сожалению, он не взял бы AVI-файл без звуковой дорожки.

AVI utilities имеют функцию добавления аудио, так что я решил, что я просто сделаю это. К сожалению, код делает некоторые предположения об аудио файле, которые не были верны на моей машине (заголовок разного размера в одном месте), поэтому он просто упал. Я потратил пару часов на чтение документации AVI, чистку кода и исправление ошибки. Потом у меня появился AVI-файл со звуком.

Я пытался отобразить файл с помощью VLC, но он пожаловался на то, что мой файл поврежден, и предложил починить его. После этого он отобразился корректно. После дополнительного чтения и отладки я обнаружил, что AVI utilities некорректно работают со стереозвуком. После того, как я исправил это, VLC удовлетворился, и я подумал, что мои проблемы закончились....

Handbrake загрузил видео, сказал, что это было 9 секунд, а затем полностью провалил конвертацию. Он создал видео длиной 18 секунд. Первая половина была идеальной, затем звук остановился, и он повторил все видео. Играя с кодом вывода AVI, я получил несколько вариантов. В некоторых случаях Handbrake, казалось, кодировал только разницу между кадрами, давая причудливые результаты. Я так и не удовлетворил его.

Windows Movie Maker прочитал AVI и создал видео, которое было правильным, за исключением того, что он был помечен как 15 секунд длиной, а не 9. VLC проиграл его без каких-либо жалоб, но это было странно.

Наконец, я вернулся к чистому видео и позволил Movie Maker добавить аудио и сжать его стандартным способом (кажется, я не могу найти опции сжатия в этой программе). Это видео отлично загрузилось на YouTube и дало результат, который вы видите. Достаточно хорошо!

Конечно, в первый раз, когда я создал действительно длинное видео, получившийся несжатый AVI файл был несколько гигабайт, и ни одна из этих программ не прикоснулась бы к нему. Я предположил, что где-то были 32-битные ограничения по размерам или смещениям, и что я их превысил. Поэтому я изменил трассировщик лучей, чтобы вывести фильм в гигабайтных кусках, а затем собрать их вместе в Movie Maker. Вздох.

Более быстрый трассировщик лучей

Рис. 2: Шаг через кубики

Трассировщик лучей, написанный в последней части, просто сравнил каждый луч из глаза со всеми треугольниками в сцене. Это сработало для моих маленьких тестовых случаев с 1000 треугольниками, но не сработало бы для миллионов треугольников в мире, который я хотел бы рендерить. Чтобы справиться с этим, мне нужно было сократить количество треугольников, с которыми я сравниваю.

Я повторно использовал код Octree, который я ввел в первой части. Все треугольники сцены помещаются в дерево, так что каждый "лист" дерева содержит список треугольников, пересекающихся с этим кубом. Чтобы отследить луч, я начинаю с куба, содержащего глаз, затем перехожу к следующему кубу вдоль луча (см. рисунок 2.) В каждом кубе я тестирую луч против всех треугольников, хранящихся в этом узле дерева. Когда я, наконец, попадаю в непрозрачный, я останавливаюсь.

Большинство кубов сцены пустые и не требуют времени на тестирование. По мере продвижения по лучу вы быстро попадаете в треугольники сцены. В кубе их может быть дюжина. Один из них - непрозрачный, который останавливает луч, и вы закончили. Для прозрачных треугольников, шаг продолжается до тех пор, пока мы не столкнемся с чем-то непрозрачным. Затем тот же самый шаг используется для отслеживания луча от точки попадания до каждого из источников света.

Пока я занимался этим, я реструктурировал свой трассировщик лучей, чтобы использовать несколько потоков, так что я мог получить максимальную отдачу от своей машины (шестиядерный процессор AMD Phenom II). В новой версии мой чанк Minecraft, который, как оказалось, имеет 461 источник света и 342 970 треугольников, был отображен за 2.4 секунды. Смотрите полученное изображение на Рисунке 5, с Minecraft и неосвещенными демо-версиями на Рисунках 3 и 4.

Рис. 3: Освещение Minecraft

 

Рис. 4: Освещение в демо

 

Рис. 5: Освещение с трассировкой луча

 

Это все еще не похоже на версию Minecraft, но теперь, когда я смотрю на освещение там, я вижу, где у меня не так. Во-первых, Нотч отбрасывает все тени прямо под объектом, так что башня справа находится в тени в версии Minecraft. В моей тень светлее, потому что она смотрит только в сторону от солнца, а не затеняет саму себя. Трассировка лучей также производит более точные длинные тени от всех кубов в пейзаже и от моста. Благодаря тому, как я реализую прозрачность, тени отбрасываются не на поверхность воды, а на дно. Настоящий трассировщик лучей исправит это, но то, что у меня есть, достаточно хорошо, чтобы продолжать.

Видео

Из-за всех проблем с аудио- и видеопроизводством, на этой неделе я на самом деле не занимался созданием мира. В качестве утешительного приза, вот видео с моим куском данных Minecraft с twentymine.com.

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

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

{"preview_thumbnail":"/sites/default/files/styles/video_embed_wysiwyg_preview/public/video_thumbnails/AqW86iZlq9I.jpg?itok=Flc1VJO3","video_url":"https://youtu.be/AqW86iZlq9I","settings":{"responsive":1,"width":"854","height":"480","autoplay":0},"settings_summary":["Embedded Video (Адаптивный)."]}

Обновление: Вот версия со стеклами, имеющими края. Это облегчает наблюдение за тем, что происходит в начале, хотя вокруг кадров много неровностей.

{"preview_thumbnail":"/sites/default/files/styles/video_embed_wysiwyg_preview/public/video_thumbnails/Sy-A_lFmj0o.jpg?itok=X6Fxdmz9","video_url":"https://youtu.be/Sy-A_lFmj0o","settings":{"responsive":1,"width":"854","height":"480","autoplay":0},"settings_summary":["Embedded Video (Адаптивный)."]}