big

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

big
Исходный размер 3840x2020

Шот это короткий файл со списком слоев. Новая версия любого слоя попадает в шот заменой одной строки.

1. Шот из слоев

Шот собирается в одном коротком текстовом файле в publish шота, в примере sq010_sh0010.usda. Своих prim, объектов сцены, в нем нет. Только время шота, то есть первый и последний кадр, и список слоев, как плейлист без самих песен. Такой файл называют root шота, главным файлом, с него USD начинает сборку.

big
Исходный размер 3840x2020

В root сильнее первая строка списка. В ноде SubLayer из урока 1 наоборот, там сильнее последний файл. Полосы на схеме идут как строки в файле.
1. Скелет последней строкой, он самый слабый.
2. Перед ним окружение и риф, все три из папки _seq. В окружении земля, на которую в уроке 6 насыпали риф.
3. Перед ними слои отделов. Аниматор правит то, что поставил лейаут, поэтому anim стоит раньше layout.
4. Свет и рендер добавим в уроке 8.

2. Камера, лейаут, анимация

Исходный размер 3840x2020

Сцены отделов лежат в activities шота и устроены одинаково, покажем на камере.
1. SubLayer подключает скелет, окружение и риф. Скелет ставим первым файлом, он самый слабый, как в уроке 1.
2. Layer Break, как в уроке 1. В файл отдела попадут только его правки.
3. Дальше свои ноды. У камеры это Scene Import, он приносит камеру из /obj.
4. USD ROP пишет слой в publish шота.

Исходный размер 3840x2020

Из Alembic или Maya камера часто приходит в цепочке нулей, иногда с масштабом, а такую камеру Karma понимает плохо. Тогда движение и фокус переносят на чистую камеру. Если камера и так чистая, шаг пропускаем.
1. В Translate чистой shotcam пишем origin (»», «./cam_alembic», «TX»), это положение пришедшей камеры в мире. По Y и Z то же с TY и TZ.
2. В Rotate то же с RX, RY, RZ, в Focal Length ссылка ch (»./cam_alembic/focal»).
3. Пришедшая cam_alembic висит под нулем cam_rig.
4. Чистая shotcam лежит прямо в /obj.

Исходный размер 3840x2020

В USD камера ‑ это prim типа Camera, а ее движение лежит в слое как time samples, то есть значения по кадрам, как запеченные ключи.
1. В Scene Import Destination Path ставим /World/cameras.
2. В Objects чистая shotcam.
3. Flatten Hierarchy включаем, камера ляжет в /World/cameras/shotcam без нулей. На этот путь ссылаются настройки рендера, и новый нуль в /obj его не сломает.
4. У USD ROP Valid Frame Range ставим Render Specific Frame Range с кадрами шота, иначе запишется один кадр.
5. Output File ведет в publish/usd/cam/v001.

Камеру пишем в файл, а не тянем Scene Import прямо в сцену рендера. Живой импорт пересчитывается на каждом кадре, Karma знает камеру только около текущего кадра, и motion blur от камеры двоится.

Исходный размер 3840x2020

Лейаут ставит в шот дрон, готовый ассет учебного проекта. Reference приносит его из publish ассета, Transform задает ему позицию.
1. В Primitive Path пишем /World/vehicles/Drone_001.
2. В File Pattern файл дрона.
3. В Translate позиция дрона, без ключей.
4. У USD ROP Valid Frame Range не трогаем. Дрон стоит, ему хватит одного кадра.

Исходный размер 3840x2020

Аниматор работает поверх лейаута, слои лейаута и камеры стоят в SubLayer его сцены.
1. Transform берет тот же prim, что лейаут, /World/vehicles/Drone_001.
2. В Translate и Rotate ключи.
3. USD ROP пишет кадры шота в anim/v001. В слое позиция и поворот дрона на каждом кадре.

Вопрос на подумать. Лейаут выпустил новую версию и переставил дрон. Где дрон будет в шоте?

3. FX одним слоем

Взрыв посчитан в SOP той же сцены. Объем лежит в файлах VDB, оболочка дыма и искры раскладываются по кадрам, а в слое FX только пути к этим файлам.

Анимацию, разложенную по файлам на кадр, называют value clips. USD читает только файл нужного кадра.

Исходный размер 3840x2020

Сеть 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 пишет слой.

Исходный размер 3840x2020

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 своего кадра.

Исходный размер 3840x2020

Объем тяжелый для вьюпорта, поэтому ему делают прокси, легкую оболочку по форме дыма. Ее строят в SOP этой же сцены из того же кэша VDB.
1. File Cache читает кэш VDB с диска.
2. VDB Resample укрупняет воксели. Оболочке хватит грубой сетки, зато она будет легкой.
3. Blast с Group @name=density и галкой Delete Non Selected оставляет одно поле density.
4. Convert VDB с Convert To Polygons делает из него сетку.
5. Isovalue ‑ плотность, по которой проходит граница оболочки. Ставим ее низкой, иначе оболочка пропадет, как только дым поредеет.

Выход OUT_proxy забирает SOP Import в /stage, как в пункте 3 сети FX. Вьюпорт показывает оболочку, а рендер берет объем, как render и proxy в уроке 3.

Исходный размер 3840x2020

Оболочку по кадрам раскладывает Geometry Clip Sequence.
1. Первый вход пустой, оболочка приходит во второй, иначе ее кадры лягут в сам слой.
2. В Primitive Path пишем /World/fx/explosion/geo/proxy. По умолчанию там /$OS, и оболочка ляжет мимо /World.
3. Get Geometry From Second Input и Flatten Clip Files включаем, в файл кадра пишется сама геометрия.
4. Save Clip File Path ведет в proxy/clip, рядом лягут manifest и topology.

Урок 7. Шот: камера, анимация и FX по слоям
Проект создан 30.10.2026