El grafo de Escena y las plantillas de proyecto
Dieciséis caballeros en círculo alrededor de una estatua, cada uno apuntándola con una espada, no son dieciséis importaciones colocadas a mano. Es un grafo: una importación, un anillo de ellas, un mirar hacia, y un poco de variación para que no haya dos iguales. Pasar de dieciséis a veinticuatro cuesta un número.
El panel Grafo de Escena del paso Escena contiene ese grafo. Es el mismo lienzo que el grafo de Estilo del paso Estilo (cajas, conexiones, ajustes en el cuerpo), con su propio tipo de conexión, de modo que un nodo de aspecto no se puede soltar en él ni al revés. Nota pone una nota en él, como en el grafo de Estilo: tus palabras en una caja detrás de los nodos que mueve los nodos que tiene dentro.
Un proyecto que nunca lo abre, y no añade nada a la escena, no guarda ningún grafo y renderiza lo que importó.
Todo lo que añades a la escena es un nodo de este grafo: otro modelo (un objeto), un accesorio en un hueso, un muelle, una forma, una imagen, texto, un volumen, una lámpara, un efecto, y el terreno, la hierba, el agua y el cielo del mundo (D49). El + del Esquema añade el nodo, al final de la cadena; el Esquema lista las cosas del grafo, y una fila y su nodo son una sola cosa: elegir uno elige el otro, el Inspector lo muestra con todos sus controles, y eliminar uno elimina ambos. Un nodo añadido desde el propio menú Añadir del grafo es al instante una fila del Esquema. Una cosa dentro de un grupo (el farol de un kit) aparece bajo una fila para el grupo; elegirla abre el grupo en su sitio y elige el nodo de dentro.
Cada ajuste de estos nodos es una propiedad (consulta Nodos): una fila con un puerto a su izquierda, que se fija en el nodo o se conecta desde un valor. Un Valor numérico conectado al Cuántos de un Anillo y al de una Fila hace que ambos crezcan a la vez. Los nodos del mundo (terreno, agua, cielo, nubes, viento…) también tienen los suyos; lo que no es un solo número o palabra (si una zona tiene su propio color, qué más mueve el viento, las horas del día) sigue siendo un control en el nodo.
Los nodos
| Nodo | Qué hace |
|---|---|
| Importar | Lo que importó el proyecto, donde está: el modelo con sus accesorios. |
| Objeto | El modelo con sus accesorios, donde está. Lo que ningún nodo nombra no se renderiza. |
| Objeto | Otro modelo junto a la importación, desde su archivo: dónde se sitúa, su giro y escala, un clip propio. Se añade como una forma: pasa su lista adelante y añade una copia de sí mismo (--item). |
| Accesorio | Un modelo que sostiene un hueso de la importación —una espada, una antorcha— con su posición, giro y escala en el hueso y el nodo del modelo que agarra el hueso (--add-prop). Forma parte del modelo: cada copia de la importación lo lleva, así que no añade ninguna copia propia y pasa su lista adelante. |
| Muelle | Un hueso y todo lo que cuelga de él balanceándose con el movimiento —pelo, una capa, una cola—, con su rigidez, amortiguación y gravedad (--spring). Como un accesorio, forma parte del modelo en cada uno de sus objetos. |
| Forma | Una de las formas propias de Pixor (una caja, un cilindro, letras), con su posición, tamaño, giro, color y bisel en el nodo. Pasa su lista y añade un objeto de sí misma; sin nada conectado, empieza una lista, así que una Forma conectada a un Anillo es un anillo de esa forma. |
| Imagen, Texto | Una imagen en un plano, o texto en una fuente pixelada sobre una tarjeta (Imágenes y palabras), añadida igual que una forma. |
| Volumen | Humo, fuego o un líquido (Volúmenes): uno por cada objeto del nodo que llega a la Salida, colocado por él. |
| Lámpara | Una luz con una posición: una por cada objeto que llega a la Salida, así que una Fila después de una lámpara es una fila de lámparas. Una lámpara sin conectar a nada no ilumina nada. |
| Efecto | Partículas —una explosión, chispas, lluvia, luciérnagas—, una por cada objeto que llega a la Salida. |
| Anillo | Objetos alrededor de un círculo: cuántos, a qué distancia, dónde está el primero y si miran hacia el centro. |
| Fila | Objetos en línea, separados un paso. |
| Cuadrícula | Objetos en una cuadrícula, tantos a lo ancho y tantos a lo hondo. |
| Dispersar | Objetos dispersos en una caja, con semilla, con una distancia mínima entre dos cualesquiera. |
| Mirar a | Gira cada objeto para que mire a un punto. Girar más apunta un modelo cuya arma no está en su eje frontal. |
| Variar | Da a cada objeto su propia fase de clip, giro y tamaño, a partir de su número y una semilla. |
| Reproducir | El clip que reproducen estos objetos, reproduzca lo que reproduzca el resto de la hoja: un árbol que se mece junto a un caballero que ataca. Lo reproducen en cada acción, sobre los fotogramas de la acción: un molino que gira junto a una casa quieta es una nueva acción en el paso Acción y un nodo Reproducir sobre el molino. Las acciones se hacen allí, no aquí. |
| Visto por | Los objetos que solo ve una cámara, y los fotogramas (abajo). |
| Fusionar | Dos listas de objetos como una sola. |
| Mover, Reflejar | Desplaza, gira y redimensiona cada objeto; añade el reflejo de cada objeto respecto a un plano. |
| Subdividir | Divide cada triángulo de cada objeto en cuatro, una vez o hasta cuatro veces, para que un Desplazar tenga puntos que mover. |
| Desplazar | Empuja la superficie de cada objeto hacia dentro y hacia fuera con ruido con semilla, hasta una cantidad en metros, con bultos separados por un tamaño. Cada copia tiene sus propios bultos, así que una fila de cajas es una fila de rocas distintas. |
| Campo de alturas | Eleva la superficie de cada objeto en vertical según un campo de alturas con semilla visto desde arriba: después de un Subdividir, un plano liso se convierte en un terreno ondulado. El suelo solo sube. |
| Bisel | Corta los bordes de las cajas de cada objeto a 45 grados. |
| Bajar al suelo | Deja caer cada objeto en vertical sobre la superficie más alta que tenga debajo: las demás cosas de la escena (o una de ellas) y cualquier terreno anterior en la cadena, con una elevación por encima, inclinándose con la pendiente tanto como pidas. |
| En la superficie | Reparte objetos de lo que recibe sobre la superficie de una cosa, según el área y con semilla: solo en sus caras superiores, o en todas partes. |
| En puntos | Pone un objeto de lo que recibe en cada esquina de una cosa. |
| Diferencia | Los objetos de su primera entrada con los objetos de la segunda recortados de ellos donde están: ventanas en un muro, una muesca en una caja. La segunda entrada es solo la forma del hueco y no se renderiza. |
| Unir | Dos listas de objetos dibujadas como una sola parte, así que no se dibuja línea donde se tocan: una torre de cajas que se lee como un solo edificio. |
| Fijar forma | Fija un ajuste de las formas de cada objeto (tamaño (un múltiplo), ancho, altura, profundidad, segmentos, bisel o tono) a partir de un atributo multiplicado por un número más un número. |
| Atributo | Escribe un número en cada objeto, para que lo use un nodo posterior (abajo). |
| Seleccionar | Conserva los objetos cuyo atributo pasa una prueba. |
| Salida | Lo que se pone delante de la cámara: el único resultado del grafo. |
Los nodos de mundo (Terreno, Ramitas, Follaje, Agua, Nubes, Cielo, Viento, Haces de luz, Horas del día y Trozos) están en el mismo menú Añadir; consulta Mundos. Los nodos de valor (un número, un activado/desactivado, un ángulo, palabras y la aritmética entre ellos) alimentan las propiedades.
Un nodo de disposición se ejecuta una vez por cada copia que recibe. Un anillo de filas es una fila por cada copia del anillo. Eso es todo lo que hay que saber del anidamiento: no hay una segunda regla.
La variación sale del número de la copia y de la semilla del grafo, nunca de otra cosa, así que el mismo grafo da la misma multitud cada vez, en cualquier máquina y con ambos backends.
Dieciséis caballeros
Añade Anillo, pon Cuántos en 16 y Radio en 3, desactiva Mirar al centro y luego añade Mirar a con Hacia en la estatua. Añade Variar y da a Fase del clip 1 para que todos estén en puntos distintos de su ciclo de caminar. El número de la parte inferior del lienzo indica cuántas copias genera el grafo, y el sprite de al lado las muestra.
Una estatua a su lado es un nodo Objeto: otro modelo, de su archivo, situado donde se ponga. Como todo nodo de cosa, pasa lo que recibe y añade una copia de sí mismo, así que su posición en la cadena dice qué lo repite: un Objeto después del Anillo es una estatua entre dieciséis caballeros; un Objeto antes serían dieciséis estatuas. En la aplicación, + › Un objeto › Desde un archivo de modelo… del Esquema lo pone al final de la cadena, después del anillo.
Desde un script, nodo a nodo:
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 y pxr project scene ponen un nodo al final de la cadena. Uno que hace sus propias copias y no recibe nada (un Objeto, un Importar) empieza la cadena en lugar de la importación sola, y después de cualquier otro va junto a la cadena, fusionado con ella, para que no se pierda nada de lo que se renderizaba. --alone añade un nodo sin conectar a nada, y --in conecta otro nodo a una de sus entradas.
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 Objeto independiente, sin conectar a nada (--alone), empieza una lista propia, que recibe un Fusionar, un Dispersar o un Visto por. Un nodo Objeto de modelo nombra solo el modelo: un objeto, una forma y una imagen son nodos propios, y nombrar uno con ese nodo es un error.
Lo que ve cada cámara
Una cámara encuadra todo lo que el grafo pone delante de ella. Visto por da a una cámara copias que ninguna otra cámara ve, así que un proyecto con una cámara principal y una cámara de retrato puede mostrar todo el anillo en una hoja y la estatua en la otra: une el Objeto de la estatua, por separado, mediante un Visto por portrait, al resto con Fusionar. El retrato encuadra la estatua con lo que ven todas las cámaras; la cámara principal nunca ve la estatua.
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
Aquí el Objeto de la estatua se añade con --alone, así que no queda al final de la cadena del anillo (pxr graph list imprime los números); el Fusionar va al final de la cadena, así que el anillo entra por su primera entrada. pxr render escribe game.png, el anillo solo, y game_portrait.png, el anillo alrededor de la estatua.
Un grafo usado como un solo nodo
Un anillo de caballeros alrededor de una estatua, una fila de puestos de mercado, una multitud con su variación: un grafo de Escena se puede guardar como un grupo y usar en otro proyecto. Guardar kit… en la barra, sin ningún grupo elegido, escribe todo el grafo como kit (Guardar el grafo de Escena como kit; su nodo Salida pasa a ser la salida del grupo), y con un grupo elegido, ese grupo (Guardar el grupo como kit); Usar kit… (Añadir un kit como grupo) en el menú Añadir del lienzo inserta uno como grupo. Es una sola caja, con su propio nombre, y la flecha que tiene (o un doble clic) lo abre en el sitio para ver o cambiar de qué está hecho; la flecha lo vuelve a plegar. Un nodo Entrada dentro de él representa una entrada, así que a un anillo guardado se le pueden pasar copias que disponer en anillo.
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 grupo son datos, no código: solo puede hacer lo que hacen los nodos que contiene, y renderiza exactamente como lo harían ellos.
Varias hojas de un mismo render
Lo que se escribe no es asunto de este grafo. El nodo Salida al final de la cadena es lo que se pone delante de la cámara, y es el único; un segundo archivo (un conjunto de iconos, una imagen promocional, una hoja solo con las líneas) es una salida del grafo de Asset, que toma los fotogramas en los que se renderizaron las copias de este grafo.
Una escena de varios modelos, animada
Un objeto también recibe un clip, y una fase para desplazarlo:
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 objeto con un clip trae su rig y lo reproduce; uno sin clip se hornea donde está, lo que sale más barato. El clip viene del propio archivo del modelo o de sus archivos hermanos name@clip, como en el resto de Pixor.
Colocar, remodelar y elegir
Los nodos del grafo de Escena hacen más que disponer. Mover desplaza, gira y redimensiona cada copia; Reflejar añade el reflejo de cada copia respecto a un plano.
Atributo escribe un número en cada copia (su número en la lista, dónde está, cómo está girada, a qué distancia está del centro, o ruido con semilla) y Seleccionar conserva las copias cuyo atributo supera una prueba y descarta el resto. Juntos son la forma de decir solo las de atrás, a la mitad de tamaño sin nombrar cuáles están atrás (z apunta hacia la cámara, así que atrás es el extremo bajo):
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
Subdividir y Desplazar remodelan las propias superficies de las copias: una caja se convierte en una roca, un acantilado liso en uno rugoso. Son ajustes que llevan las copias y con los que se construyen sus partes, no triángulos editados a mano, así que el mismo grafo da las mismas rocas en todas partes:
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
Bajar al suelo, En la superficie y En puntos leen la escena en la que el grafo coloca las cosas. Una dispersión en una caja se convierte en una dispersión sobre una colina cuando le sigue un Bajar al suelo y el terreno está en su lista:
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
y se ponen velas en cada esquina de una corona con el nodo Forma de la vela y En puntos de la corona. El lienzo cuenta las copias de En la superficie antes de construir nada; el número de En puntos se conoce una vez construida la escena.
Diferencia corta con lo que reciba en segundo lugar, donde esté: una caja pequeña, en una Fila de tres, atravesando un muro largo es un muro con tres ventanas. El interior de un hueco se reviste del color con el que se dibuja la mayor parte de la parte. Una parte ligada a un rig (un modelo con skinning, una forma sobre un hueso o una forma con claves) no se corta, ya que un corte cambia vértices que se dieron al rig, y tampoco una de más de 5,000 triángulos.
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
Una forma se coloca centrada en su at, así que la primera ventana está 1.2 m a la izquierda del centro de la pared y la Fila pone las otras dos a 1.2 m entre sí, las tres dentro de la pared de 4 m.
Las formas que construye Pixor tienen ajustes propios, y Fijar forma los controla desde el grafo: una fila de cajas, cada una más alta que la anterior y un poco más allá en la rueda de color, es el nodo Forma de la caja, una Fila, un Atributo de dónde está cada copia a lo largo de la fila y dos Fijar forma.
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
Las cajas están entre 0 y 4.4 m, así que crecen de 0.5 m a unos 1.2 m y pasan de naranja a amarillo, verde y verde azulado. El tono cambia un color, así que se nota en una forma con color; una gris sigue siendo gris.
Los ajustes de una forma se aplican antes de cualquier Subdividir o Desplazar, sea cual sea el orden de los nodos, porque una forma reconstruida a partir de sus ajustes parte de su propia superficie. Solo los reciben las formas independientes; una forma colgada de un hueso es parte del modelo.
Una parte ligada a una piel o con morph targets se desplaza pero no se subdivide, porque un punto nuevo en mitad de una arista no tiene pesos fiables; tampoco una parte que se mece con el viento.
Una copia se diferencia de sus vecinas por su número, sus atributos y una semilla, o en nada; nunca por tener nombre, porque nombrar una convertiría el grafo en un archivo de escena.
Plantillas de proyecto
Un proyecto apunta a este modelo. Una plantilla de proyecto es lo mismo con las rutas extraídas y con nombres y tipos —el aspecto, el grafo de arriba, los clips y las exportaciones—, así que una sola receta se ejecuta sobre una carpeta de modelos en lugar de copiarse veinte veces y editarse cada vez.
Proyecto › Guardar como plantilla de proyecto… escribe un .pixorblueprint. Al abrir uno (Proyecto › Abrir proyecto…) pide sus entradas y luego se comporta como cualquier proyecto; lo que sale no tiene título, así que guardarlo no puede sobrescribir la receta.
Desde la línea de comandos:
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 cambia un ajuste de un nodo: en el grafo de escena si tiene ese nodo, si no en cada pipeline de Asset y Estilo que lo tenga (--set hold.times=4: el nodo Mantener de cada pipeline de Asset). --set PIPELINE/NODE.SETTING=VALUE lo cambia solo en ese pipeline. Un nodo se nombra por su etiqueta en minúsculas, con guiones entre las palabras (ring para un Anillo, look-at para un Mirar a: pxr project scene los muestra); la propia etiqueta ("Look at") también funciona. El archivo de paleta de cada Estilo es una ranura propia: palette para el primer Estilo, palette:NAME para otro. Una ranura que falta o tiene un tipo incorrecto indica la ranura y el tipo que esperaba, antes de cargar nada.
Pixor trae unas cuantas en assets/blueprints/: una hoja de personaje de cuatro lados, un icono de inventario y una imagen promocional.
Qué ha cambiado desde la última compilación
Cada exportación lleva una receta (cómo se hizo la hoja), así que dos compilaciones se pueden comparar sin una base de datos de compilaciones:
pxr diff out-yesterday/ out-today/
Dice qué archivos son nuevos, cuáles han desaparecido, cuáles difieren y en cuántos píxeles, y qué ajuste, qué entrada o qué plantilla de proyecto lo causó:
changed ring.png 36598 of 82944 pixels (44.12%)
scene.nodes[3].settings.count: 16 -> 12
--exact termina con 1 ante cualquier cambio, para una compilación que deba ser reproducible.
Las capas que escribe una exportación
Las piezas de paper doll, la hoja de sombras y las capas de parallax son archivos separados. En la Vista 2D del paso Asset, Todos, apilados en el selector Capa apila las capas de una hoja de atrás hacia delante, como lo hará un motor: un interruptor por capa, y una línea que dice si todas las capas tienen el tamaño de la base. No hace falta exportar nada antes: las capas se dibujan a partir de los fotogramas ya renderizados, con el código que las escribe, dispuestas como las coloca la salida de hoja de sprites elegida: el sprite terminado (base), su sombra, líneas, colores planos, normales, profundidad, emisión y las salidas extra del grafo de Estilo. El sprite y su sombra están activados al principio; un mapa de normales sobre el sprite lo ocultaría. De los archivos lee en cambio lo que una exportación escribió realmente: los mismos archivos que cargará un motor, incluidas las piezas de paper doll y las capas de parallax.
Lo que describe esta página está en la versión completa; la demo gratuita del navegador se limita al aspecto predeterminado y a la hoja PNG.
Probar en el navegador Obtener Pixor