Граф сцены и шаблоны проектов
Шестнадцать рыцарей, стоящих кругом вокруг статуи и направивших на нее мечи, — это не шестнадцать импортов, расставленных вручную. Это граф: импорт, кольцо из них, «Смотреть на» и немного вариаций, чтобы ни один не повторял другого. Заменить шестнадцать на двадцать четыре — это одно число.
Этот граф находится на панели Граф сцены шага «Сцена». Это тот же холст, что и граф стиля на шаге «Стиль», — блоки, связи, параметры в теле узла, — но со своим видом связей, поэтому узел облика нельзя перетащить в него, и наоборот. Заметка добавляет заметку, как и в графе стиля: ваш текст в рамке позади узлов, которая перемещает узлы внутри себя.
Проект, который никогда его не открывает и ничего не добавляет в сцену, не хранит граф вовсе и рендерит то, что импортировал.
Все, что вы добавляете в сцену, — это узел этого графа: другая модель (предмет), реквизит на кости, пружина, фигура, изображение, слова, объем, лампа, эффект, а также местность, трава, вода и небо мира (D49). + в «Структуре» добавляет узел в конец цепочки; «Структура» перечисляет предметы графа, и строка с ее узлом — одно целое: выбор одного выбирает другое, Инспектор показывает его со всеми элементами управления, а удаление одного удаляет оба. Узел, добавленный из собственного меню «Добавить» графа, сразу становится строкой в «Структуре». Предмет внутри группы (фонарь из набора) перечисляется под строкой группы; его выбор открывает группу на месте и выбирает узел внутри нее.
Каждый параметр этих узлов — это свойство (см. Узлы): строка с портом слева, которую задают на узле или подключают от значения. Одно Числовое значение, подключенное к Количество у «Кольца» и у «Ряда», заставляет их расти вместе. У узлов мира (местность, вода, небо, облака, ветер…) они тоже есть; то, что не является одним числом или словом, — есть ли у участка свой цвет, что еще двигает ветер, время суток — остается элементом управления на узле.
Узлы
| Узел | Что делает |
|---|---|
| Импорт | То, что импортировал проект, и где оно стоит: модель с ее реквизитом. |
| Объект | Модель с ее реквизитом и место, где она стоит. Все, что не названо ни одним узлом, не рендерится. |
| Предмет | Еще одна модель рядом с импортом, из своего файла: где она стоит, ее поворот и масштаб, собственный клип. Добавляется так же, как фигура: передает свой список дальше и добавляет свою копию (--item). |
| Реквизит | Модель, которую держит кость импорта, — меч, факел — с ее положением, поворотом и масштабом на кости и узлом модели, за который кость ее держит (--add-prop). Часть модели: каждая копия импорта несет ее, поэтому она не добавляет собственной копии и передает свой список дальше. |
| Пружина | Кость и все, что под ней, раскачиваются вместе с движением — волосы, плащ, хвост — с жесткостью, затуханием и гравитацией (--spring). Как и реквизит, это часть модели в каждом ее объекте. |
| Фигура | Одна из собственных фигур Pixor — коробка, цилиндр, буквы — с местом, размером, поворотом, цветом и фаской на узле. Она передает свой список дальше и добавляет в него свой объект; если ничего не подключено, она начинает список, так что «Фигура» в «Кольцо» — это кольцо из этой фигуры. |
| Изображение, Текст | Изображение на плоскости или слова пиксельным шрифтом на карточке («Изображения и слова»), добавляемые так же, как фигура. |
| Объем | Дым, огонь или жидкость (Объемы): по одному на каждый объект узла, доходящий до выхода, размещенный им. |
| Лампа | Свет со своим местом: по одному на каждый объект, который доходит до Выхода, поэтому Ряд после лампы — это ряд ламп. Лампа, ни к чему не подключенная, ничего не освещает. |
| Эффект | Частицы — взрыв, искры, дождь, светлячки — по одной системе на каждый объект, дошедший до «Выхода». |
| Кольцо | Объекты по кругу: сколько, как далеко от центра, где стоит первый и смотрят ли они в центр. |
| Ряд | Объекты в линию, с шагом. |
| Сетка | Объекты на сетке: столько-то в ширину и столько-то в глубину. |
| Рассеять | Объекты, рассыпанные в коробке по сиду, с расстоянием, ближе которого никакие два не сходятся. |
| Смотреть на | Поворачивает каждый объект лицом к точке. Доп. поворот наводит модель, чье оружие не лежит на ее оси «вперед». |
| Разброс | Дает каждому объекту собственную фазу клипа, поворот и размер — из его номера и сида. |
| Воспроизвести | Клип, который играют эти объекты, что бы ни играл остальной лист: качающееся дерево рядом с атакующим рыцарем. Они играют его в каждом действии, поверх кадров действия, — ветряная мельница, вращающаяся рядом с неподвижным домом, это новое действие на шаге «Действие» и узел «Воспроизвести» на мельнице. Действия создаются там, а не здесь. |
| Видно камере | Объекты, которые видит только одна камера, и кадры (ниже). |
| Слить | Два списка объектов как один. |
| Переместить, Отразить | Сдвигайте, поворачивайте и масштабируйте каждый объект; добавляйте отражение каждого объекта относительно плоскости. |
| Подразделить | Делит каждый треугольник каждого объекта на четыре, один раз или до четырех раз, чтобы у «Смещения» были точки для сдвига. |
| Смещение | Выталкивает и вдавливает поверхность каждого объекта шумом с сидом — на величину до заданного числа метров, с бугорками на заданном расстоянии друг от друга. Каждая копия получает свои бугорки, так что ряд коробок становится рядом разных камней. |
| Поле высот | Поднимает поверхность каждого объекта прямо вверх по полю высот с сидом, видимому сверху: после «Подразделить» плоская плоскость превращается в холмистую землю. Земля только поднимается. |
| Фаска | Срезает ребра коробок каждого объекта под углом 45 градусов. |
| Опустить на землю | Опускает каждый объект прямо вниз на самую высокую поверхность под ним: другие предметы сцены (или один из них) и любой рельеф раньше в цепочке, с подъемом над ней и наклоном по склону, насколько вы зададите. |
| На поверхности | Распределяет объекты из переданного по поверхности предмета, пропорционально площади и с сидом, — только по верхним граням или везде. |
| На точках | Ставит объект из того, что ему передано, на каждый угол предмета. |
| Разность | Объекты первого входа, из которых вырезаны объекты второго там, где они стоят: окна в стене, выемка в ящике. Второй вход — лишь форма отверстия, и он не рендерится. |
| Объединить | Два списка объектов, нарисованные как одна часть, чтобы на стыке не было линии: башня из коробок, которая читается как одно здание. |
| Задать фигуру | Задает один параметр фигур каждого объекта — размер (множитель), ширину, высоту, глубину, сегменты, фаску или оттенок — из атрибута, умноженного на число, плюс число. |
| Атрибут | Записывает число на каждый объект, чтобы его использовал следующий узел (ниже). |
| Выбрать | Оставляет объекты, атрибут которых проходит проверку. |
| Выход | То, что стоит перед камерой: единственный результат графа. |
Узлы мира — Terrain, Sprigs, Foliage, Water, Clouds, Sky, Wind, Light shafts, Times of day и Chunks — находятся в том же меню «Добавить»; см. Миры. Узлы значений (число, вкл./выкл., угол, слова и арифметика между ними) питают свойства.
Узел раскладки выполняется один раз на каждую переданную ему копию. Кольцо рядов — это ряд на каждую копию кольца. Вот и вся вложенность — второго правила нет.
Разнообразие берется из номера копии и сида графа и ни из чего больше, поэтому один и тот же граф каждый раз дает одну и ту же толпу — на любом компьютере и на обоих бэкендах.
Шестнадцать рыцарей
Добавьте «Кольцо», задайте «Количество» 16 и «Радиус» 3, выключите «Повернуть к центру», затем добавьте «Смотреть на» с «К точке» на статуе. Добавьте «Разброс» и задайте «Фаза клипа» 1, чтобы все они были в разных точках своей ходьбы. Число внизу холста показывает, сколько копий создает граф, а спрайт рядом показывает их.
Статуя рядом с ними — узел «Предмет»: другая модель из своего файла, стоящая там, куда ее поставили. Как и любой узел объекта, он передает дальше то, что получил, и добавляет одну свою копию, поэтому его место в цепочке определяет, что его повторяет: «Предмет» после «Кольца» — это одна статуя среди шестнадцати рыцарей, а «Предмет» перед ним дал бы шестнадцать статуй. В приложении + › «Предмет» › «Из файла модели…» Структуры ставит его в конец цепочки, после кольца.
Из скрипта, по одному узлу:
pxr project scene game.pixor ring --count 16 --radius 3 --face-out
pxr project scene game.pixor look-at --at 0,0.8,0
pxr project scene game.pixor vary --phase 1 --seed 3
pxr project scene game.pixor --set ring.count=24
pxr project scene game.pixor # prints the graph and the count
pxr graph add и pxr project scene ставят узел в конец цепочки. Узел, который создает собственные копии и ничего не принимает («Объект», «Импорт»), начинает цепочку вместо голого импорта, а после чего-либо еще встает рядом с цепочкой, сливаясь с ней, чтобы ничего из уже рендерившегося не потерялось. --alone добавляет узел, ни к чему не подключенный, а --in подключает другой узел к одному из его входов.
pxr graph add game.pixor --which scene --node object --set of=model # the knight alone
pxr graph add game.pixor --which scene --node ring --set count=16 --set radius=3
pxr project set game.pixor --item statue.glb@0,0 # an Item after the ring
«Предмет», стоящий отдельно и ни к чему не подключенный (--alone), начинает собственный список, который принимает «Слить», «Рассеять» или «Видно камере». «Объект» называет только модель: предмет, фигура и изображение — отдельные узлы, и называть их через «Объект» — ошибка.
Что видит каждая камера
Камера кадрирует все, что граф ставит перед ней. «Видно камере» дает одной камере копии, которых не видит ни одна другая камера, поэтому проект с основной камерой и камерой портрета может показать все кольцо на одном листе, а статую — на другом: соедините отдельно стоящий «Предмет» статуи через «Видно камере» portrait с остальным при помощи «Слить». Портрет кадрирует статую вместе со всем, что видят все камеры; основная камера статую не видит вовсе.
pxr project new game.pixor --model knight.glb --force
pxr project scene game.pixor ring --count 16 --radius 3 # node 2
pxr project set game.pixor --add-camera portrait:three-quarter:64 # NAME:VIEW:SIZE[:ANGLE]
pxr graph add game.pixor --which scene --node item --set model=statue.glb --alone # node 3
pxr graph add game.pixor --which scene --node seen-by --set camera=portrait --alone --in objects=3 # node 4
pxr graph add game.pixor --which scene --node merge --in b=4 # the ring, and the statue for the portrait
pxr project scene game.pixor # 17 objects
Здесь узел Item статуи добавлен с --alone, поэтому он не в конце цепочки кольца (номера выводит pxr graph list); Merge ставится в конец цепочки, так что кольцо приходит на его первый вход. pxr render записывает game.png — одно кольцо — и game_portrait.png — кольцо вокруг статуи.
Граф как один узел
Кольцо рыцарей вокруг статуи, ряд рыночных прилавков, толпа с вариациями: граф сцены можно сохранить как одну группу и использовать в другом проекте. «Сохранить набор…» на панели, когда группа не выбрана, записывает весь граф как набор («Сохранить граф сцены как набор»; его узел «Выход» становится выходом группы), а когда группа выбрана — эту группу («Сохранить группу как набор»); «Использовать набор…» («Добавить набор как группу») в меню «Добавить» холста вставляет набор как группу. Это один блок со своим именем, а стрелка на нем (или двойной щелчок) открывает его на месте, чтобы посмотреть или изменить, из чего он состоит; стрелка сворачивает его снова. Узел «Вход» внутри него обозначает вход, поэтому сохраненному кольцу можно передать копии, которые нужно расставить по кругу.
pxr graph save market.pixor --which scene -o stalls.pixorkit --name "Row of stalls"
pxr graph add town.pixor --which scene --kit stalls.pixorkit
pxr graph flatten town.pixor --which scene # the nodes it stands for
Группа — это данные, а не код: она может делать только то, что делают узлы внутри нее, и рендерит ровно так же, как они.
Несколько листов из одного рендера
То, что записывается, — не дело этого графа. Узел Выход в конце цепочки — это то, что стоит перед камерой, и он единственный; второй файл — набор иконок, промо-кадр, лист одних линий — это выход графа ассета, который берет кадры, в которые были отрендерены копии этого графа.
Анимированная сцена из нескольких моделей
Предмет тоже берет клип и фазу, чтобы сдвинуть его вперед:
pxr project new patrol.pixor \
--item knight.glb@-0.9,0.2,-20:walk \
--item knight.glb@0.9,0.2,-20:walk,0.45 \
--item chest.glb@-1.8,-1.6,25,1.2
Предмет с клипом приносит свой риг и воспроизводит клип; предмет без клипа запекается на месте, что дешевле. Клип берется из собственного файла модели или из соседних файлов name@clip, как и везде в Pixor.
Размещение, изменение формы и выбор
Узлы графа сцены не только раскладывают. Переместить сдвигает, поворачивает и масштабирует каждую копию; Отразить добавляет отражение каждой копии относительно плоскости.
Атрибут записывает число на каждую копию — ее номер в списке, где она стоит, как повернута, как далеко от центра или шум по сиду, — а Выбрать оставляет копии, чей атрибут проходит проверку, и отбрасывает остальные. Вместе они позволяют сказать только задние, вдвое меньше, не называя, какие именно сзади (z направлена к камере, так что задние — на нижнем конце):
pxr project new town.pixor --model chest.glb --force
pxr project scene town.pixor row --count 6 --step 1,0,0.5
pxr project scene town.pixor attribute --name depth --from z
pxr project scene town.pixor select --name depth --how below --at 1
pxr project scene town.pixor move --size 0.5
«Подразделить» и «Смещение» меняют форму собственных поверхностей копий: параллелепипед становится камнем, гладкий утес — шероховатым. Это параметры, которые копии несут и по которым строятся их части, а не треугольники, отредактированные вручную, поэтому один и тот же граф везде дает одни и те же камни:
pxr project new yard.pixor --add-shape rock=box:0.5 --size 64
pxr project scene yard.pixor row --count 3 --step 1.4,0,0
pxr project scene yard.pixor subdivide --times 3
pxr project scene yard.pixor displace --amount 0.12 --bumps 0.35 --seed 4
Опустить на землю, На поверхности и На точках читают сцену, в которую граф расставляет предметы. Россыпь в коробке становится россыпью на холме, когда после нее идет «Опустить на землю», а местность есть в ее списке:
pxr project new hill.pixor --model chest.glb --terrain 12:24:2 # the terrain is node 2
pxr graph add hill.pixor --which scene --node object --set of=model --alone # node 3
pxr graph add hill.pixor --which scene --node scatter --alone --in objects=3 --set count=14
pxr graph add hill.pixor --which scene --node merge --in b=4
pxr graph add hill.pixor --which scene --node drop-to-ground
а свечи стоят на каждом зубце короны благодаря узлу «Фигура» свечи и узлу На точках короны. Холст подсчитывает копии «На поверхности» до того, как что-либо построено; число копий «На точках» становится известно, как только построена сцена.
Разность вырезает тем, что ей передано вторым, там, где оно стоит: маленькая коробка в «Ряду» из трех, проходящая сквозь длинную стену, дает стену с тремя окнами. Внутренность отверстия облицовывается цветом, которым нарисована большая часть детали. Часть, привязанная к ригу (модель со скиннингом, фигура на кости или фигура с ключами), не вырезается, потому что вырез меняет вершины, переданные ригу, как и часть, в которой больше 5,000 треугольников.
pxr project new house.pixor --add-shape wall=box:4,2,0.2 --size 96 # the wall, node 2
pxr graph add house.pixor --which scene --node shape --set name=window --set size=0.4,0.5,0.4 --set at=-1.2,0.1,0 --alone # node 3
pxr graph add house.pixor --which scene --node row --alone --in objects=3 --set count=3 --set step=1.2,0,0 # node 4
pxr graph add house.pixor --which scene --node difference --in "cut by=4"
pxr render house.pixor -o out/house.png
Фигура стоит центром на своей точке at, поэтому первое окно на 1.2 м левее середины стены, а «Ряд» ставит два других с шагом 1.2 м от него, все три внутри стены длиной 4 м.
У фигур, которые строит Pixor, есть свои параметры, и Задать фигуру управляет ими из графа: ряд ящиков, каждый выше предыдущего и чуть дальше по цветовому кругу, — это узел «Фигура» ящика, «Ряд», «Атрибут» положения каждой копии вдоль ряда и два узла «Задать фигуру».
pxr project new crates.pixor --add-shape 'crate=box:0.5:0,0,0:#c86432' --size 64 # an orange crate alone
pxr project scene crates.pixor row --count 5 --step 1.1,0,0
pxr project scene crates.pixor attribute --name x --from x
pxr project scene crates.pixor set-shape --setting height --from x --times 0.15 --plus 0.5
pxr project scene crates.pixor set-shape --setting hue --from x --times 40
pxr project scene crates.pixor bevel --width 0.06
pxr render crates.pixor -o out/crates.png
Ящики стоят на расстоянии от 0 до 4.4 м, поэтому вырастают от 0.5 м примерно до 1.2 м и меняют цвет с оранжевого через желтый и зеленый до бирюзового. Оттенок поворачивает цвет, поэтому он виден на цветной фигуре; серая остается серой.
Параметры фигуры применяются до любого «Подразделить» или «Смещения», в каком бы порядке ни стояли узлы, потому что фигура, заново построенная из своих параметров, начинается со своей собственной поверхности. Их принимают только самостоятельные фигуры; фигура, висящая на кости, — часть модели.
Часть, привязанная к скину или несущая морф-таргеты, смещается, но не подразделяется, потому что у новой точки посередине ребра нет честных весов; то же относится к части, которая качается на ветру.
Копия отличается от соседей номером, атрибутами и сидом или ничем — но никогда не именем, потому что именование сделало бы граф файлом сцены.
Шаблоны проектов
Проект указывает на эту модель. Шаблон проекта — то же самое, но пути вынесены наружу и получили имена и типы — облик, граф выше, клипы и экспорт, — поэтому один рецепт обрабатывает целую папку моделей, а не копируется двадцать раз с правками каждой копии.
«Проект › Сохранить как шаблон проекта…» записывает .pixorblueprint. Открытие такого файла («Проект › Открыть проект…») запрашивает его входы, а затем он ведет себя как любой проект; результат не имеет имени, поэтому его сохранение не может перезаписать рецепт.
Из командной строки:
pxr project blueprint game.pixor -o four-way.pixorblueprint
pxr run four-way.pixorblueprint --in model=hero.glb -o out/hero.png
pxr batch models/ --blueprint four-way.pixorblueprint --out out/
pxr run four-way.pixorblueprint --in model=hero.glb --set ring.count=12
pxr graph set four-way.pixorblueprint --which style --node 0 --set dither=0.5 # change the recipe itself
--set NODE.SETTING=VALUE меняет один параметр одного узла: в графе сцены, если там есть этот узел, иначе в каждом конвейере ассета и Стиле, где он есть (--set hold.times=4: узел «Удержание» каждого конвейера ассета). --set PIPELINE/NODE.SETTING=VALUE меняет его только в этом конвейере. Узел называется по своей подписи в нижнем регистре, с дефисами между словами (ring для «Кольца», look-at для «Смотреть на»: их выводит pxr project scene); сама подпись ("Look at") тоже работает. Файл палитры каждого Стиля — отдельный слот: palette для первого Стиля, palette:NAME для другого. Отсутствующий слот или слот с неверным типом называет себя и ожидаемый тип еще до того, как что-либо загружено.
Pixor поставляется с несколькими шаблонами в assets/blueprints/: лист персонажа с четырех сторон, иконка инвентаря и промо-кадр.
Что изменилось с прошлой сборки
Каждый экспорт несет рецепт (как был сделан лист), поэтому две сборки можно сравнить без базы данных сборок:
pxr diff out-yesterday/ out-today/
Он показывает, какие файлы новые, какие исчезли, какие отличаются и на сколько пикселей — и какой параметр, какой вход или какой шаблон проекта это вызвал:
changed ring.png 36598 of 82944 pixels (44.12%)
scene.nodes[3].settings.count: 16 -> 12
--exact завершается с кодом 1 при любом изменении — для сборки, которая должна быть воспроизводимой.
Слои, которые записывает экспорт
Элементы бумажной куклы, лист теней и слои параллакса — отдельные файлы. В 2D-виде шага «Ассет» пункт Все, стопкой в списке Слой складывает слои листа от дальнего к ближнему, как это сделает движок: переключатель на каждый слой и строка, сообщающая, совпадает ли каждый слой по размеру с основой. Ничего не нужно экспортировать заранее: слои рисуются из уже отрендеренных кадров тем же кодом, что их записывает, и раскладываются так, как их раскладывает выбранный выход спрайт-листа, — готовый спрайт (base), его тень, линии, плоские цвета, нормали, глубина, свечение и дополнительные выходы графа стиля. Спрайт и его тень включены с самого начала; карта нормалей поверх спрайта скрыла бы его. Из файлов вместо этого читает то, что экспорт действительно записал, — те же файлы, которые загрузит движок, включая элементы бумажной куклы и слои параллакса.
То, что описано на этой странице, есть в полной версии; бесплатное демо в браузере ограничено обликом по умолчанию и PNG-листом.
Попробовать в браузере Получить Pixor