Граф сцены и шаблоны проектов

Шестнадцать рыцарей, стоящих кругом вокруг статуи и направивших на нее мечи, — это не шестнадцать импортов, расставленных вручную. Это граф: импорт, кольцо из них, «Смотреть на» и немного вариаций, чтобы ни один не повторял другого. Заменить шестнадцать на двадцать четыре — это одно число.

Граф сцены нового проекта: узел «Импорт», соединенный с «Выходом», слева — библиотека узлов

Этот граф находится на панели Граф сцены шага «Сцена». Это тот же холст, что и граф стиля на шаге «Стиль», — блоки, связи, параметры в теле узла, — но со своим видом связей, поэтому узел облика нельзя перетащить в него, и наоборот. Заметка добавляет заметку, как и в графе стиля: ваш текст в рамке позади узлов, которая перемещает узлы внутри себя.

Проект, который никогда его не открывает и ничего не добавляет в сцену, не хранит граф вовсе и рендерит то, что импортировал.

Все, что вы добавляете в сцену, — это узел этого графа: другая модель (предмет), реквизит на кости, пружина, фигура, изображение, слова, объем, лампа, эффект, а также местность, трава, вода и небо мира (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