Imagens e palavras

Dois tipos de conteúdo não vêm de um modelo 3D: imagens que você já tem e palavras. Ambos entram no pipeline no início, como partes da cena, e não como uma pintura por cima no final — então traços, contornos, oclusão, sombras e a paleta funcionam neles sem uma única passada nova.

Uma imagem na cena

Na etapa Cena, o menu + da Estrutura, Uma imagem › De um arquivo de imagem…, coloca a imagem num plano: folhagem em billboard, uma árvore distante, uma placa, uma janela acesa, um cenário pintado. É uma parte como qualquer outra, com uma linha na Estrutura, um bloco Transformar e seus próprios ajustes no Inspetor, e é um nó Imagem do grafo de Cena: a linha e o nó são uma coisa só, os ajustes também ficam no nó, e uma Linha ou um Anel depois dele o repete.

Ajuste O que ele faz
Orientação Em pé, Plano no chão, Sprite (no espaço do sprite) ou Decalque (ambos abaixo).
Espelhado Espelhado da esquerda para a direita. Não custa nada e não precisa de um segundo arquivo.
Inclinar Inclinado para trás, em graus.
Quartos de volta Girado em torno do eixo vertical. Só quartos de volta: qualquer coisa entre eles exigiria filtragem, e a filtragem borra a pixel art.
Metros por pixel Quanto do mundo um pixel da imagem cobre.
Usar a luz da cena Desligado por padrão: uma imagem normalmente já foi sombreada por quem a desenhou, e sombreá-la de novo lhe dá duas direções de luz.
Traços em volta Como em volta de qualquer outra parte.
Recortar por baixo Pixels transparentes assim são buracos, então folhagem recortada funciona.
Conta para o enquadramento Desligado para um rótulo: uma faixa “GAME OVER” sobre um cavaleiro não deve encolher o cavaleiro.
Camada de paralaxe A que camada pertence, contada a partir do fundo, para que arte desenhada e 3D compartilhem uma só pilha de camadas.

Dois botões o deixam nítido, e ambos usam a câmera exibida:

  • Pixels inteiros o dimensiona para que um pixel da imagem cubra um número inteiro de pixels do sprite. Qualquer outra coisa reamostra.
  • Virar para a câmera o inclina pela inclinação daquela câmera. Uma câmera que olha para baixo encurta um cartão em pé, o que perde linhas e transforma as letras numa papa.

Pela linha de comando:

pxr project set game.pixor --add-picture bush.png:-1.1,0,-0.3:0.05
pxr project set game.pixor --add-picture bush.png:1,0,0.2:0.035 --mirror
pxr project set game.pixor --add-picture sky.png:0,0,-8:0.2 --layer 0 --unframed

No espaço do sprite, uma imagem nem é um cartão. Depois que a cena é desenhada, a imagem dela é colocada nos próprios pixels do sprite onde cai a sua posição: assim ela fica de frente para todas as câmeras — um billboard, o mesmo arbusto de todos os lados da folha — e cada pixel da imagem é um número inteiro de pixels do sprite (Pixels de sprite, 1 por padrão), seja qual for a câmera, que é o que letras exatas precisam. Ela mantém a profundidade da sua posição, então o que fica na frente dessa posição continua a escondendo, e ela é uma parte como um cartão é, então os traços, a limpeza e a paleta a tratam como tal. Ela fica sobre a sua posição, o meio da borda inferior, como um cartão em pé; sua posição conta para o enquadramento quando Conta para o enquadramento está ligado.

pxr project set game.pixor --add-picture bush.png:-0.8,0,1.1 --facing sprite
pxr project set game.pixor --add-text "+12" --text-at 0.25,0.35,0.9 \
  --facing sprite --picture-pixels 2 --font pixor-5

Um decalque é pintado sobre as superfícies que estiverem onde um cartão em pé ficaria, dentro do Alcance do seu plano (em metros, para os dois lados): uma placa numa parede, uma rachadura, uma marca de queimado; inclinado um quarto de volta para trás, uma poça ou um tapete no chão. Ele não tem geometria nem parte própria: onde uma superfície desenhada no quadro cai dentro da sua caixa, a superfície assume a cor da imagem ali e mantém sua própria luz, traços e contorno, então uma placa numa parede é sombreada como a parede.

pxr project set game.pixor --add-text "OPEN" --text-at 0,0.3,0.45 \
  --text-size 0.03 --facing decal --decal-reach 0.25 --font pixor-5

Na paleta. Uma imagem é levada à paleta do projeto na importação quando o projeto tem uma paleta fixa, e a renderização diz quantos dos seus pixels mudaram:

picture  bush: 330 of 330 pixels moved to the palette (100.0%)

--keep-colours os deixa como estão. Um projeto com paleta automática ainda não tem para onde ajustá-las — a paleta dele é montada a partir do que está na cena, cartões incluídos — então o pipeline faz isso mais adiante.

PNG ou JPEG: um recorte quer a transparência de um PNG; uma fotografia para fundo, na maioria das vezes, é um JPEG.

Uma imagem de vários quadros. Uma imagem de quadros lado a lado — uma tocha tremulando em quatro, uma bandeira tremulando em seis — é uma imagem com Quadros definido (--picture-frames 4). O cartão tem a largura de um quadro e mostra o primeiro; um clipe feito no Pixor define por chaves qual ele mostra (picture:NAME, frame), então um tremular pintado toca na folha como qualquer outra coisa. Espelhado espelha cada quadro no lugar, mantendo a ordem.

Os quadros podem ser arquivos próprios em vez de uma tira — Um arquivo por quadro, --picture-sequence: o arquivo nomeado é o primeiro, flame_0001.png, e os números depois dele seguem, preenchidos do mesmo jeito; todo quadro tem o tamanho do primeiro. E eles podem tocar sozinhos — Toca sozinho, --picture-plays: um por quadro, sem parar, por baixo do que a folha mostrar, a menos que um clipe defina com chaves qual aparece. Sem mais nada se movendo, eles são a animação, um loop chamado picture.

pxr project set game.pixor --add-picture flame_0001.png:0.7,0,0.8 \
  --picture-frames 4 --picture-sequence --picture-plays --facing sprite

Um céu

Um céu fica atrás de tudo, nos pixels em que nada foi desenhado — então o modelo mantém o contorno que tem sem céu. Ele é feito de faixas, uma cor de cima e uma de baixo e um número inteiro de degraus entre elas, nunca uma mesclagem; ou de uma imagem pintada, ancorada no topo do quadro e centralizada, com um número inteiro de pixels do sprite por pixel da imagem, e as bordas prolongadas além das laterais. As cores dele estão exatamente na paleta, então as faixas são as cores que você pediu. Ele faz parte do mundo: o menu + da Estrutura, O mundo › Céu, ou pxr project set game.pixor --sky '#2c3e6b,#9dbcd9,4' (ou --sky dusk.png:2), e --no-sky.

Palavras na cena

Um cartão de texto é um cartão cuja imagem é desenhada em vez de lida, então as palavras ganham de graça a orientação, os giros, a escala, o recorte e os traços de um cartão. No app, o menu + da Estrutura, Uma imagem › Texto, põe um acima do modelo — um nó Texto do Grafo de cena —, um pixel da fonte para um pixel do sprite; o Inspetor dele traz o Texto, a Fonte, a Escala do texto, a Tinta e um Contorno, e os ajustes do próprio cartão abaixo deles. Palavras são um rótulo, no app como num script: não decidem como a tomada é enquadrada, então o app as põe logo dentro do topo do quadro; ligue Conta para o enquadramento para enquadrar em volta delas. Por um script:

pxr project set game.pixor --size 128
pxr project set game.pixor --add-text "GAME OVER" \
  --text-at 0,2.3,0 --text-size 0.033 --tilt -45 \
  --text-colour '#f4ecf2' --text-outline '#1a1620'

--text-size é em metros por pixel de fonte, então as palavras ficam legíveis quando isso dá um pixel de sprite ou mais: a renderização mostra os pixels por metro da folha (cerca de 40 para um projeto de cavaleiro com --size 128, 0.033 × 40 ≈ 1.3; 37 com os arbustos e as imagens desta página, ainda acima de 1). A 64 px fica em cerca de 24, menos de um pixel por pixel de fonte, e as letras se desfazem.

Opção O que ele faz
--font NAME|FILE pixor-11, pixor-5, ou um arquivo de fonte seu: o formato próprio do Pixor ou um .bdf.
--align left|middle|right Onde fica cada traço.
--wrap PIXELS Quebrar a linha nesta largura. Uma palavra longa demais fica inteira: uma palavra partida é mais difícil de ler do que uma linha que sobra.
--letter-spacing N, --line-spacing N Pixels inteiros extras.
--text-colour, --text-outline, --text-shadow Tinta, um contorno de um pixel, uma sombra de pixel.
--text-scale N Cada pixel vira N por N. Só passos inteiros.
--facing sprite, --picture-pixels N No espaço do sprite, N pixels de sprite por pixel de fonte, em todas as câmeras.

O layout é só com inteiros em todo lugar: larguras de avanço e alturas de linha são pixels inteiros, não há shaping nem posicionamento de subpixel, então um texto dá os mesmos pixels em qualquer máquina. Um caractere que a fonte não tem vira um espaço em vez de uma caixa, porque uma caixa num sprite é pior que um espaço.

As palavras são, por padrão, um rótulo: elas não decidem como a tomada é enquadrada. No espaço do sprite, ficam exatas de todos os lados, sem inclinação e sem dimensionamento pela câmera: --facing sprite.

Palavras como geometria

Uma forma de letras escreve as suas palavras e extruda cada pixel da fonte num bloco, então as letras recebem iluminação, faixas, contornos e a paleta como qualquer outra geometria — uma placa, uma faixa, uma lápide:

pxr shapes -o sign.glb --shape letters:2,0.5,0.25
pxr project set game.pixor --add-shape letters:1.2,0.3,0.1:0,3,0 --words HELLO

A 3 m de altura, a palavra fica livre do elmo do cavaleiro; como qualquer forma, ela precisa de um pixel de sprite ou mais por pixel de fonte para ser lida, o que o cavaleiro em --size 128 dá.

Só as faces que nenhum vizinho esconde são construídas, então uma palavra tem algumas centenas de triângulos, e as letras ficam de pé sobre a tinta delas, e não sobre o espaço vazio que uma descendente precisa.

Fontes

O Pixor traz duas fontes, ambas desenhadas para ele: pixor-11, a fonte em que a interface é desenhada, e pixor-5, com cinco pixels por maiúscula e três para a maioria das letras, para números sobre um sprite, rótulos e um HUD, onde a maior pesaria mais do que aquilo que nomeia. Uma forma letters escolhe entre elas com Fonte no Inspetor. Uma fonte sua é um arquivo de texto com o mesmo formato, tão simples quanto parece:

== A
.###.
#...#
#####
#...#
#...#

Uma linha == C indica o caractere (ou == U+00E9 para um que você não consegue digitar), depois as linhas dele: # é tinta, . é vazio. É legível, funciona com diff e não precisa de biblioteca de fontes.

Um arquivo BDF funciona como está: é o formato em que a maioria das fontes pixeladas é compartilhada. Os glifos dele ficam numa célula da ascendente e descendente da fonte, e cada um é tão largo quanto a fonte diz que ele avança, então o espaçamento que o designer escolheu é mantido e o Pixor não acrescenta nenhum.

Uma paleta a partir de uma imagem

Um arquivo de paleta pode ser uma imagem: uma imagem de referência, uma captura de tela de um jogo cujo visual você quer, ou uma faixa de amostras.

pxr render hero.glb --palette reference.png

Uma imagem com dezesseis cores ou menos dá exatamente essas, numa ordem estável; uma com mais dá até dezesseis das suas cores mais representativas (cores próximas demais para distinguir viram uma). A mesma imagem dá a mesma paleta em todas as máquinas.

O que esta página descreve está na versão completa; a demo grátis no navegador fica no visual padrão e na folha PNG.

Testar no navegador Obter o Pixor