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

Шот это короткий файл со списком слоев. Новая версия любого слоя попадает в шот заменой одной строки.
1. Шот из слоев
Шот собирается в одном текстовом файле в publish шота, в примере sq010_sh0010.usda.
Файл шота, в котором нет своих примов, а есть время шота и список слоев, называется root шота.

В root сильнее всех верхняя строка.
1. Внизу скелет из урока 3.
2. Над ним окружение и риф секвенции из папки _seq.
3. Выше слои отделов шота.
4. Свет и рендер добавим в уроке 8.
2. Камера, лейаут, анимация
Сцены отделов лежат в activities шота и устроены одинаково, покажем на камере.
1. SubLayer подключает скелет, окружение и риф, у следующих отделов еще слои предыдущих.
2. Layer Break отрезает все это от слоя отдела.
3. Дальше свои ноды отдела, у камеры это Camera.
4. USD ROP пишет слой в publish шота.
Camera ставит камеру шота, USD ROP пишет ее по кадрам.
1. В Primitive Path пишем /World/cameras/shotcam.
2. В Translate ключи, поля зеленые.
3. Valid Frame Range ставим Render Specific Frame Range с кадрами шота, иначе запишется один кадр.
4. Output File ведет в publish/usd/cam/v001.
Значения атрибута по кадрам называются time samples, так в слое лежит анимация.
Лейаут ставит дрон. Reference приносит его из publish ассета, Transform ставит на место.
1. В Primitive Path пишем /World/vehicles/Drone_001.
2. В File Pattern файл дрона, Reference Primitive по умолчанию.
3. В Translate место дрона, без ключей.
4. Valid Frame Range не трогаем. Дрон стоит, ему хватит одного кадра.
Аниматор работает поверх лейаута, слои лейаута и камеры стоят в SubLayer его сцены.
1. Transform берет тот же прим, что лейаут.
2. В Translate и Rotate ключи.
3. USD ROP пишет кадры шота в anim/v001. В слое место и поворот дрона на каждом кадре.
Вопрос на подумать. Лейаут выпустил новую версию и переставил дрон. Где дрон будет в шоте?
3. FX одним слоем
Взрыв посчитан в SOP той же сцены. Объем лежит в файлах VDB, оболочка дыма и искры раскладываются по кадрам, а в слое FX только пути к этим файлам.
Анимацию, разложенную по файлам на кадр, называют value clips. USD читает только файл нужного кадра.
Сеть FX собрана в /stage.
1. Primitive делает корень /World/fx/explosion, kind component.
2. Volume ставит объем, Configure Primitive дает ветке render purpose render.
3. Оболочку дают SOP Import, Configure Primitive с purpose proxy и Geometry Clip Sequence.
4. У искр своя пара SOP Import и Geometry Clip Sequence.
5. Merge собирает ветки, USD ROP пишет слой.
Volume ставит объем взрыва.
1. В Primitive Path пишем /World/fx/explosion/geo/render/volume.
2. Parent Primitive Type ставим Scope, geo и render только папки.
3. В File Path путь к файлам VDB, $F4 дает файл на каждый кадр.
Прим объема называется Volume. В нем поля density, flame, temperature и vel, в их атрибуте filePath путь к VDB своего кадра.
Оболочку по кадрам раскладывает Geometry Clip Sequence.
1. Первый вход пустой, оболочка приходит во второй, иначе ее кадры лягут в сам слой.
2. Get Geometry From Second Input и Flatten Clip Files включаем, в файл кадра пишется сама геометрия.
3. Save Clip File Path ведет в proxy/clip, рядом лягут manifest и topology.
В слое FX нет ни одного вокселя и ни одной точки. В нем только пути, а кадры лежат рядом.
USD ROP пишет слой FX по кадрам шота, как у камеры.
1. Output File ведет в fx/explosion/v001, рядом с папками vdb, proxy и sparks.
2. Flush Data After Each Frame включаем, каждый кадр сразу уходит на диск и не копится в дорогой нам оперативке
4. Собираем шот



