Le graphe de scène et les plans de projet
Seize chevaliers en cercle autour d’une statue, chacun pointant son épée vers elle, ce ne sont pas seize imports placés à la main. C’est un graphe : un import, un anneau de copies, une orientation vers une cible, et un peu de variation pour qu’aucun ne soit identique. Passer de seize à vingt-quatre ne coûte qu’un nombre.
Le panneau Graphe de scène de l’étape Scène contient ce graphe. C’est le même canevas que le graphe de Style de l’étape Style — boîtes, liens, réglages dans le corps — avec son propre type de lien, si bien qu’un nœud de look ne peut pas y être déposé, ni l’inverse. Note y place une note, comme sur le graphe de Style : vos mots dans une boîte derrière les nœuds, qui déplace les nœuds qu’elle contient.
Un projet qui ne l’ouvre jamais, et n’ajoute rien à la scène, n’enregistre aucun graphe et rend ce qu’il a importé.
Tout ce que vous ajoutez à la scène est un nœud de ce graphe — un autre modèle (un élément), un accessoire sur un os, un ressort, une forme, une image, des mots, un volume, une lampe, un effet, et le terrain, l’herbe, l’eau et le ciel du monde (D49). Le + de l’Arborescence ajoute le nœud, en bout de chaîne ; l’Arborescence liste les éléments du graphe, et une ligne et son nœud ne font qu’un : choisir l’un choisit l’autre, l’Inspecteur le montre avec toutes ses commandes, et supprimer l’un supprime les deux. Un nœud ajouté depuis le menu Ajouter du graphe lui-même devient aussitôt une ligne de l’Arborescence. Un élément à l’intérieur d’un groupe (la lanterne d’un kit) est listé sous une ligne pour le groupe ; le choisir ouvre le groupe sur place et choisit le nœud qu’il contient.
Chaque réglage de ces nœuds est une propriété (voir nœuds) : une ligne avec un port à sa gauche, réglée sur le nœud ou reliée à une valeur. Une seule Valeur numérique reliée au Nombre d’un Anneau et à celui d’une Ligne les fait grandir ensemble. Les nœuds du monde (terrain, eau, ciel, nuages, vent…) ont aussi les leurs ; ce qui n’est pas un seul nombre ou un seul mot — si une parcelle a sa propre couleur, ce que le vent fait bouger d’autre, les heures du jour — reste une commande sur le nœud.
Les nœuds
| Nœud | Ce qu’il fait |
|---|---|
| Importer | Ce que le projet a importé, et sa position : le modèle avec ses accessoires. |
| Objet | Le modèle avec ses accessoires, et sa position. Ce qu’aucun nœud ne nomme n’est pas rendu. |
| Élément | Un autre modèle à côté de l’import, depuis son fichier : sa position, sa rotation et son échelle, un clip propre. Ajouté comme une forme : il transmet sa liste et ajoute une copie de lui-même (--item). |
| Accessoire | Un modèle que tient un os de l’import — une épée, une torche — avec sa position, sa rotation et son échelle sur l’os, et son nœud que saisit l’os (--add-prop). Il fait partie du modèle : chaque copie de l’import le porte, il n’ajoute donc aucune copie propre et transmet sa liste. |
| Ressort | Un os et tout ce qui est en dessous, qui se balance avec le mouvement — cheveux, cape, queue — avec sa raideur, son amortissement et sa gravité (--spring). Comme un accessoire, il fait partie du modèle dans chacun de ses objets. |
| Forme | L’une des formes propres à Pixor — une boîte, un cylindre, des lettres — avec sa position, sa taille, sa rotation, sa couleur et son biseau sur le nœud. Elle transmet sa liste et y ajoute un objet d’elle-même ; sans rien de relié, elle commence une liste, si bien qu’une Forme reliée à un Anneau donne un anneau de cette forme. |
| Image, Texte | Une image sur un plan, ou des mots dans une police pixel sur une carte (Images et mots), ajoutée comme une forme. |
| Volume | Fumée, feu ou liquide (Volumes) : un pour chaque objet du nœud qui atteint la Sortie, placé par lui. |
| Lampe | Une lumière avec un emplacement : une pour chaque objet qui atteint la Sortie, donc une Ligne après une lampe est une ligne de lampes. Une lampe reliée à rien n’éclaire rien. |
| Effet | Des particules — une explosion, des étincelles, de la pluie, des lucioles — une pour chaque objet qui atteint la Sortie. |
| Anneau | Des objets autour d’un cercle : combien, à quelle distance, où se trouve le premier, et s’ils font face au centre. |
| Ligne | Des objets en ligne, espacés d’un pas. |
| Grille | Des objets sur une grille, tant en largeur et tant en profondeur. |
| Dispersion | Des objets dispersés dans une boîte, avec une graine, et une distance en deçà de laquelle deux d’entre eux ne se rapprochent jamais. |
| Regarder | Tourne chaque objet vers un point. Tourner davantage oriente un modèle dont l’arme n’est pas sur son axe avant. |
| Varier | Donne à chaque objet sa propre phase de clip, sa rotation et sa taille, à partir de son numéro et d’une graine. |
| Lire | Le clip que jouent ces objets, quoi que joue le reste de la planche : un arbre qui se balance à côté d’un chevalier qui attaque. Ils le jouent dans chaque action, sur les images de l’action — un moulin qui tourne à côté d’une maison immobile est une nouvelle action dans l’étape Action et un nœud Lire sur le moulin. Les actions se créent là-bas, pas ici. |
| Vu par | Les objets qu’une seule caméra voit, et les images (ci-dessous). |
| Fusionner | Deux listes d’objets en une. |
| Déplacer, Miroir | Décaler, tourner et redimensionner chaque objet ; ajouter le reflet de chaque objet par rapport à un plan. |
| Subdiviser | Divise chaque triangle de chaque objet en quatre, une fois ou jusqu’à quatre fois, pour qu’un Déplacer ait des points à bouger. |
| Déplacer | Pousse la surface de chaque objet vers l’intérieur et l’extérieur selon un bruit à graine, jusqu’à une amplitude en mètres, avec des bosses espacées d’une certaine taille. Chaque copie reçoit ses propres bosses, si bien qu’une rangée de boîtes devient une rangée de rochers différents. |
| Champ de hauteurs | Soulève la surface de chaque objet tout droit selon un champ de hauteurs à graine vu de dessus : après un Subdiviser, un plan plat devient un terrain vallonné. Le sol ne fait que monter. |
| Biseau | Coupe les arêtes des boîtes de chaque objet à 45 degrés. |
| Poser au sol | Fait tomber chaque objet tout droit sur la surface la plus haute en dessous : les autres éléments de la scène (ou l’un d’eux) et tout terrain placé avant lui dans la chaîne, avec une élévation au-dessus, en suivant la pente autant que vous le demandez. |
| Sur la surface | Répartit des objets de ce qu’il reçoit sur la surface d’un élément, selon l’aire et avec une graine — seulement sur ses dessus, ou partout. |
| Sur des points | Place un objet de ce qu’il reçoit sur chaque coin d’un élément. |
| Différence | Les objets de sa première entrée, avec les objets de sa seconde entrée découpés à l’endroit où ils se trouvent : des fenêtres dans un mur, une encoche dans une caisse. La seconde entrée n’est que la forme du trou et n’est pas rendue. |
| Joindre | Deux listes d’objets dessinées comme une seule partie, pour qu’aucun trait ne soit tracé là où elles se touchent : une tour de boîtes qui se lit comme un seul bâtiment. |
| Définir la forme | Règle un réglage des formes de chaque objet — taille (un multiple), largeur, hauteur, profondeur, segments, biseau ou teinte — à partir d’un attribut multiplié par un nombre, plus un nombre. |
| Attribut | Écrit un nombre sur chaque objet, pour qu’un nœud suivant l’utilise (ci-dessous). |
| Sélectionner | Garde les objets dont l’attribut passe un test. |
| Sortie | Ce qui se tient devant la caméra : l’unique résultat du graphe. |
Les nœuds du monde — Terrain, Brins, Feuillage, Eau, Nuages, Ciel, Vent, Rayons de lumière, Heures du jour et Blocs — sont dans le même menu Ajouter ; voir Mondes. Les nœuds de valeur (un nombre, un activé/désactivé, un angle, des mots et l’arithmétique entre eux) alimentent les propriétés.
Un nœud de disposition s’exécute une fois par copie reçue. Un anneau de lignes, c’est une ligne par copie de l’anneau. C’est tout ce qu’il y a à savoir sur l’imbrication — il n’y a pas de seconde règle.
La variation vient du numéro de la copie et de la graine du graphe, jamais d’autre chose : le même graphe donne la même foule à chaque fois, sur n’importe quelle machine et avec les deux moteurs de rendu.
Seize chevaliers
Ajoutez Anneau, réglez Nombre sur 16 et Rayon sur 3, désactivez Faire face au centre, puis ajoutez Regarder avec Vers sur la statue. Ajoutez Varier et donnez 1 à Phase du clip pour qu’ils soient tous à des moments différents de leur marche. Le nombre en bas du canevas indique combien de copies produit le graphe, et le sprite à côté les montre.
Une statue à côté d’eux est un nœud Élément : un autre modèle, tiré de son fichier, qui se tient là où on le place. Comme tout nœud d’objet, il transmet ce qu’on lui donne et ajoute une copie de lui-même : sa place dans la chaîne indique donc ce qui le répète. Un Élément après l’Anneau donne une statue parmi seize chevaliers, un Élément avant lui donnerait seize statues. Dans l’application, + › Un élément › À partir d’un fichier de modèle… dans l’Arborescence le place au bout de la chaîne, après l’anneau.
Depuis un script, un nœud à la fois :
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 et pxr project scene ajoutent un nœud au bout de la chaîne. Un nœud qui crée ses propres copies et ne prend rien en entrée (un Objet, un Import) commence la chaîne à la place de l’import seul, et après quoi que ce soit d’autre, il se place à côté de la chaîne, fusionné avec elle, si bien que rien de ce qui était rendu n’est perdu. --alone ajoute un nœud relié à rien, et --in relie un autre nœud à l’une de ses entrées.
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
Un Élément isolé, relié à rien (--alone), commence sa propre liste, que reçoit un Fusionner, une Dispersion ou un Vu par. Un Objet ne désigne que le modèle : un élément, une forme et une image sont des nœuds à part entière, et en désigner un avec un Objet est une erreur.
Ce que voit chaque caméra
Une caméra cadre tout ce que le graphe place devant elle. Vu par donne à une caméra des copies qu’aucune autre caméra ne voit : un projet avec une caméra principale et une caméra de portrait peut ainsi montrer tout l’anneau dans une planche et la statue dans l’autre : reliez l’Élément de la statue, seul, via un Vu par portrait, au reste avec Fusionner. Le portrait cadre la statue avec tout ce que voient toutes les caméras ; la caméra principale ne voit jamais la statue.
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
Ici, l’Élément de la statue est ajouté avec --alone, il n’est donc pas au bout de la chaîne de l’anneau (pxr graph list affiche les numéros) ; le Fusionner va au bout de la chaîne, donc l’anneau arrive dans sa première entrée. pxr render écrit game.png, l’anneau seul, et game_portrait.png, l’anneau autour de la statue.
Un graphe utilisé comme un seul nœud
Un anneau de chevaliers autour d’une statue, une rangée d’étals de marché, une foule avec ses variations : un graphe de scène peut être enregistré comme un seul groupe et utilisé dans un autre projet. Enregistrer le kit… dans la barre, sans groupe choisi, écrit tout le graphe sous forme de kit (Enregistrer le graphe de scène comme kit ; son nœud Sortie devient la sortie du groupe), et avec un groupe choisi, ce groupe (Enregistrer le groupe comme kit) ; Utiliser un kit… (Ajouter un kit comme groupe) dans le menu Ajouter du canevas en insère un sous forme de groupe. C’est un seul bloc, appelé par son propre nom, et la flèche dessus (ou un double-clic) l’ouvre sur place pour voir ou modifier ce qui le compose ; la flèche le replie. Un nœud Entrée à l’intérieur représente une entrée, si bien qu’on peut donner des copies à disposer en anneau à un anneau enregistré.
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
Un groupe est une donnée, pas du code : il ne peut faire que ce que font les nœuds qu’il contient, et son rendu est exactement le leur.
Plusieurs planches à partir d’un seul rendu
Ce qui est écrit ne regarde pas ce graphe. Le nœud Sortie au bout de la chaîne est ce qui se tient devant la caméra, et c’est le seul ; un second fichier — un jeu d’icônes, une image promotionnelle, une planche des seuls traits — est une sortie du graphe d’asset, qui prend les images dans lesquelles les copies de ce graphe ont été rendues.
Une scène de plusieurs modèles, animée
Un élément prend aussi un clip, et une phase pour le faire avancer :
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
Un élément avec un clip apporte son rig et le joue ; un élément sans clip est figé là où il se tient, ce qui coûte moins cher. Le clip vient du fichier propre au modèle ou de ses fichiers voisins name@clip, comme partout ailleurs dans Pixor.
Placer, remodeler et choisir
Les nœuds du graphe de scène ne se contentent pas de disposer. Déplacer décale, fait tourner et redimensionne chaque copie ; Miroir ajoute le reflet de chaque copie par rapport à un plan.
Attribut écrit un nombre sur chaque copie — son numéro dans la liste, sa position, son orientation, sa distance au centre, ou un bruit à graine — et Sélectionner garde les copies dont l’attribut passe un test et écarte le reste. Ensemble, ils permettent de dire seulement celles du fond, à moitié de leur taille sans nommer lesquelles sont au fond (z pointe vers la caméra, donc le fond est l’extrémité basse) :
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
Subdiviser et Déplacer remodèlent les surfaces des copies elles-mêmes : un cube devient un rocher, une falaise lisse une falaise rugueuse. Ce sont des réglages que portent les copies et avec lesquels leurs parties sont construites, pas des triangles modifiés à la main, si bien que le même graphe donne les mêmes rochers partout :
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
Poser au sol, Sur la surface et Sur des points lisent la scène dans laquelle le graphe place les éléments. Une dispersion dans une boîte devient une dispersion sur une colline quand un Poser au sol la suit et que le terrain est dans sa liste :
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
et des bougies se dressent à chaque coin d’une couronne avec le nœud Forme de la bougie et Sur des points de la couronne. Le canevas compte les copies de Sur la surface avant que quoi que ce soit ne soit construit ; le nombre de Sur des points n’est connu qu’une fois la scène construite.
Différence découpe avec ce qu’on lui donne en second, là où cela se trouve : une petite boîte, dans une Ligne de trois, à travers un long mur donne un mur percé de trois fenêtres. L’intérieur d’un trou est revêtu de la couleur dans laquelle est dessinée la majeure partie de la partie. Une partie liée à un rig (un modèle skinné, une forme sur un os ou une forme animée par clés) n’est pas découpée, puisqu’une découpe modifie des sommets confiés au rig, pas plus qu’une partie de plus de 5,000 triangles.
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
Une forme est centrée sur son at : la première fenêtre est donc à 1.2 m à gauche du milieu du mur, et la Ligne place les deux autres à 1.2 m d’écart à partir d’elle, toutes trois à l’intérieur du mur de 4 m.
Les formes que construit Pixor ont leurs propres réglages, et Définir la forme les pilote depuis le graphe : une rangée de caisses, chacune plus haute que la précédente et un peu plus loin sur la roue chromatique, c’est le nœud Forme de la caisse, une Ligne, un Attribut indiquant où chaque copie se trouve dans la rangée, et deux Définir la forme.
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
Les caisses sont placées de 0 à 4.4 m : elles grandissent donc de 0.5 m à environ 1.2 m et passent de l’orange au sarcelle en passant par le jaune et le vert. La teinte fait tourner une couleur : elle se voit donc sur une forme colorée ; une forme grise reste grise.
Les réglages d’une forme s’appliquent avant tout Subdiviser ou Déplacer, quel que soit l’ordre des nœuds, car une forme reconstruite à partir de ses réglages part de sa propre surface. Seules les formes indépendantes les prennent ; une forme accrochée à un os fait partie du modèle.
Une partie liée à une peau ou portant des morph targets est déplacée mais pas subdivisée, car un nouveau point au milieu d’une arête n’a pas de poids honnêtes ; il en va de même d’une partie qui se balance au vent.
Une copie se distingue de ses voisines par son numéro, ses attributs et une graine, ou pas du tout — jamais par un nom, car nommer une copie ferait du graphe un fichier de scène.
Plans de projet
Un projet pointe vers ce modèle-ci. Un plan de projet est la même chose, avec les chemins retirés et dotés de noms et de types — le look, le graphe ci-dessus, les clips et les exports —, si bien qu’une seule recette s’applique à un dossier de modèles au lieu d’être copiée vingt fois et modifiée à chaque fois.
Projet › Enregistrer comme plan de projet… écrit un .pixorblueprint. En ouvrir un (Projet › Ouvrir un projet…) demande ses entrées, puis il se comporte comme n’importe quel projet ; le résultat est sans titre, si bien que l’enregistrer ne peut pas écraser la recette.
En ligne de commande :
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 modifie un réglage d’un nœud : dans le graphe de scène s’il contient ce nœud, sinon dans chaque pipeline d’asset et chaque Style qui l’ont (--set hold.times=4 : le nœud Tenue de chaque pipeline d’asset). --set PIPELINE/NODE.SETTING=VALUE le modifie dans ce seul pipeline. Un nœud se désigne par son libellé anglais en minuscules, avec des traits d’union entre les mots (ring pour un Anneau, look-at pour un Regarder : pxr project scene les affiche) ; le libellé lui-même ("Look at") fonctionne aussi. Le fichier de palette de chaque Style est un emplacement à part : palette pour le premier Style, palette:NAME pour un autre. Un emplacement manquant ou mal typé est signalé avec le type attendu, avant que quoi que ce soit ne soit chargé.
Pixor en fournit quelques-uns dans assets/blueprints/ : une planche de personnage sur quatre côtés, une icône d’inventaire et une image promotionnelle.
Ce qui a changé depuis la dernière version
Chaque export contient une recette (la façon dont la planche a été faite), si bien que deux builds peuvent être comparés sans base de données de builds :
pxr diff out-yesterday/ out-today/
Il indique quels fichiers sont nouveaux, lesquels ont disparu, lesquels diffèrent et de combien de pixels — et quel réglage, quelle entrée ou quel plan de projet en est la cause :
changed ring.png 36598 of 82944 pixels (44.12%)
scene.nodes[3].settings.count: 16 -> 12
--exact quitte avec 1 au moindre changement, pour un build qui doit être reproductible.
Les calques qu’écrit un export
Les pièces de paper doll, la planche d’ombre et les calques de parallaxe sont des fichiers séparés. Dans la Vue 2D de l’étape Asset, Tous, empilés dans le sélecteur Calque empile les calques d’une planche de l’arrière vers l’avant, comme le fera un moteur : une bascule par calque, et une ligne qui dit si chaque calque a la taille de la base. Rien n’a besoin d’être exporté d’abord : les calques sont dessinés à partir des images déjà rendues, par le code qui les écrit, disposés comme la sortie de planche de sprites choisie les dispose — le sprite fini (base), son ombre, ses traits, ses couleurs unies, ses normales, sa profondeur, son émission et les sorties supplémentaires du graphe de Style. Le sprite et son ombre sont activés au départ ; une carte de normales par-dessus le sprite le cacherait. D’après les fichiers relit plutôt ce qu’un export a réellement écrit — les mêmes fichiers que chargera un moteur, pièces de paper doll et calques de parallaxe compris.
Ce que décrit cette page se trouve dans la version complète ; la démo gratuite dans le navigateur se limite au look par défaut et à la planche PNG.
Essayer dans le navigateur Obtenir Pixor