flowchart TD
A["Um sistema qualquer,<br/>de um fabricante qualquer"] --> B{"Pergunta de categoria:<br/>isso é virtual ou aumentada?"}
A --> C{"Pergunta de decisão:<br/>o que o programa pede<br/>e o que ele recebe?"}
B --> B1["Resposta rápida"]
B1 --> B2["Nenhum campo preenchido<br/>Nenhuma linha de código"]
C --> C1["Que espaço de referência<br/>o sistema adota?"]
C --> C2["O que ele rastreia?"]
C --> C3["Contra o que a cena<br/>é registrada?"]
C1 --> D["Sistema descrito,<br/>sem citar o nome do produto"]
C2 --> D
C3 --> D
1 O contínuo entre o sintético e o real — Resumo
Versão de revisão. As cinco palavras deste módulo estão aqui comprimidas ao osso. As definições, as ressalvas e o código vêm inteiros. O que encolheu foi o número de exemplos. O tratamento longo está na versão completa deste capítulo e no capítulo correspondente do livro.
Duas pessoas usaram a mesma demonstração, uma depois da outra. A primeira conta que esteve dentro de uma oficina, com chão, paredes e uma bancada à frente. A segunda conta que viu uma bancada pousada sobre a mesa da sala, ao lado do abajur e da caneca. Nenhuma das duas mentiu. O programa era o mesmo, e a diferença entre as duas experiências cabia em duas linhas de configuração.
Guarde essas duas linhas. Elas voltam no fim, com nome.
O reflexo é dar um nome a cada relato: realidade virtual para a primeira, aumentada para a segunda. Os nomes funcionam enquanto ninguém precisa decidir nada com eles. Na hora de decidir, quebram. Um visor opaco que retransmite a sala por câmeras entrega ao olho uma imagem inteiramente sintética de um ambiente inteiramente real. Qual das duas etiquetas cabe ali? Nenhuma, e o sorteio entre elas não seria honesto.
O que substitui as etiquetas são cinco palavras: contínuo, imersão, presença, registro e espaço de referência. Nenhuma delas exige um polígono desenhado. As cinco decidem coisas que nenhuma escolha de material conserta depois.
1.1 A pergunta que não decide nada
A resposta é imediata, consensual e imprestável.
Diante de um aparelho novo, quase todo mundo faz a mesma pergunta: isso aí é virtual ou aumentada? Ela pede uma caixa antes de qualquer outra coisa. A resposta chega rápido e todo mundo concorda com ela. Depois, ninguém consegue fazer nada com ela. Tente respondê-la no caso das duas pessoas da abertura: mesmo programa, mesmo aparelho, dois relatos incompatíveis.
A tentativa de salvar a pergunta olha para o equipamento. Ela dura uns dez segundos diante do parque real. Um visor opaco tapa a sala e desenha uma oficina no lugar dela. O mesmo visor retransmite a sala e deposita uma bancada sobre a mesa. Mesmo hardware, mesmo minuto, mesma cadeira. O celular é o caso simétrico: câmera traseira atrás, e uma cena que você gira com o dedo.
O terceiro caso fecha a porta. No visor de retransmissão cada pixel que chega ao olho é sintético, porque nenhuma luz da sala atravessa coisa alguma. Para quem está usando, aquilo é a sala, com a caneca no lugar certo. O caso mais sintético possível é também um dos mais reais possíveis. Veja bem: a etiqueta muda quando o programa muda, logo ela nunca foi propriedade do aparelho.
O que sobra quando o nome sai é o software, e ele responde a três perguntas observáveis de fora, sem consultar manual de fabricante. Que espaço de referência o sistema adota, isto é, onde fica a origem do mundo que ele desenha? O que ele rastreia — a cabeça, as mãos, o aparelho, nada? Contra o que a cena é registrada, ou seja, a que coisa do mundo físico a posição dos objetos virtuais está presa?
Há um teste rápido para saber se uma resposta serve: tente escrever código a partir dela. De “isso é realidade aumentada” não sai uma linha. De “o programa pede um espaço ancorado no chão e mantém a sala visível” sai a abertura de sessão inteira. O tratamento de falha vem junto. O mercado, enquanto isso, foi somando etiquetas — virtual, aumentada, mista, estendida. Nenhuma acrescentou um campo que se pudesse preencher. Vocabulário que se renova a cada dois anos informa alguma coisa sobre si mesmo, e não é nada técnica.
1.2 Um eixo, e as quatro coisas que ele se recusa a medir
Em 1994, dois engenheiros trocaram a pergunta da área, e a troca ainda organiza o vocabulário.
Paul Milgram e Fumio Kishino publicaram, na Universidade de Toronto, uma taxonomia de sistemas de exibição. O gesto parece modesto. Eles pararam de perguntar se um visor de ver-através “era” realidade virtual, e passaram a perguntar quanto de cada lado o sistema exibia. A modéstia é aparente, porque a troca mexe na estrutura da pergunta. Pergunta de fronteira admite duas respostas e obriga a escolher; pergunta de grau admite infinitas posições e obriga a medir.
Chame de c a fração da imagem apresentada que tem origem sintética. O eixo é o intervalo percorrido por ela:
c \in [0,\,1]
Um sistema de exibição visual apresenta a quem observa uma composição de duas origens: o ambiente físico em que a pessoa está e o ambiente sintético produzido pela máquina. O contínuo entre ambiente real e ambiente sintético é o intervalo fechado percorrido pela fração de origem sintética. O extremo inferior marca a apresentação exclusivamente física; o superior, a exclusivamente sintética.
Todo sistema que apresenta as duas origens ao mesmo tempo ocupa uma posição interna. Essa posição pertence ao que o aparelho está executando naquele momento, e viaja com a sessão.
Um mesmo programa cobre, portanto, um conjunto de posições, e nunca um ponto só: na primeira descrição da abertura a fração é máxima, e na segunda fica perto de zero. Repare no que a definição não exige: imagem bonita, aparelho caro, crença. O eixo mede proporção de origem, e para por aí.
Conforto. Duas sessões na mesma posição podem diferir em enjoo, peso no pescoço e cansaço visual.
Custo. Um aparelho de mil reais e um de vinte mil executam o mesmo regime e ocupam a mesma posição.
Nitidez. Resolução, contraste e qualidade do material são independentes da proporção de origem.
Crença. Quanto a pessoa se comporta como se aquilo fosse real é assunto de outra grandeza, e é a omissão mais séria das quatro.
A quarta é a mais séria por um motivo específico. Ninguém confunde a etiqueta do produto com a do preço, e por isso as três primeiras não fazem estrago. Só que quase todo mundo diz “esse é mais imersivo” querendo dizer que a pessoa acreditou mais. Aí duas grandezas passam a dividir uma palavra só, e nenhuma delas pode mais ser discutida em separado.
A consequência que mais rende cabe numa frase: a posição no eixo é atributo do que está executando. “Qual dos dois é mais imersivo?” tem resposta, porque é pergunta sobre equipamento. “Qual dos dois está mais para o lado sintético?” fica sem resposta enquanto ninguém disser o que cada um roda. E a outra metade é a que pesa: o que o sistema mantém idêntico entre as posições que cobre? Se cada regime tiver o seu próprio programa, a comparação entre eles fala das implementações, e nada dos regimes.
flowchart LR
R["c = 0<br/>só o ambiente físico"] --- M["0 < c < 1<br/>as duas origens<br/>ao mesmo tempo"] --- S["c = 1<br/>só o ambiente sintético"]
T1["exibe:<br/>a cena numa janela,<br/>o mundo intocado em volta"] -.-> R
T2["preserva:<br/>o mundo continua visível,<br/>a cena pousa sobre ele"] -.-> M
T3["substitui:<br/>o mundo some,<br/>a cena ocupa tudo"] -.-> S
Para virar instrumento de projeto, o eixo precisa de forma que um programa carregue. O contínuo inteiro cabe num tipo de dado com três valores, e o que os distingue é o que cada um faz com o ambiente de quem observa. Um o substitui inteiro. Outro o preserva visível e deposita a cena sobre ele. O terceiro o exibe por uma janela, sem tocá-lo.
os três tratamentos, em modes/regimes.ts
/**
* O que o regime faz com o ambiente de quem observa — a distinção que separa os
* três antes de qualquer detalhe técnico.
*/
export type TratamentoDoMundo =
| 'substitui' // o ambiente sintético toma o lugar do ambiente real
| 'preserva' // o ambiente real permanece visível e recebe o sintético sobre si
| 'exibe'; // o ambiente sintético é mostrado por uma janela, sem tocar o real
Três valores num tipo só, e toda seleção sobre ele precisa cobrir três ramos — o verificador reclama quando falta um. A alternativa preguiçosa seria um campo imersivo: true, que funciona até o dia em que aparece o terceiro caso, com quarenta lugares do programa já perguntando. Um detalhe contraria o que a maioria faria: os três valores são cadeias de texto, e não números. Comparar texto é mais lento, e isso acontece uma vez por sessão. Quem lê preserva entende na hora; quem lê 1 vai procurar a tabela.
1.3 Imersão é do aparelho, presença é sua, registro é da geometria
Uma cena feia pode convencer o corpo; uma cena linda pode não convencer ninguém.
Três palavras costumam ser usadas como sinônimos, e as três descrevem coisas diferentes. A confusão sai cara: é ela que faz um grupo inteiro concluir que o caminho para um ambiente convincente passa por comprar uma placa de vídeo melhor.
Imersão é propriedade do sistema, e se mede sem que ninguém vista coisa alguma. As quatro grandezas objetivas que a descrevem cabem numa tupla:
I = (\phi,\; \ell,\; g,\; f)
Imersão é a extensão em que um sistema apresenta estímulos sensoriais que substituem os do ambiente físico. É propriedade do sistema, mensurável independentemente de quem o usa, e descrita pelo campo de visão coberto pela imagem, pela latência entre o movimento do corpo e a atualização correspondente da imagem, pelo número de graus de liberdade rastreados e pela cadência com que as imagens são apresentadas.
Um monitor cobre poucos graus do campo de visão. Ele rastreia zero graus de liberdade. Um visor cobre a maior parte do campo e rastreia seis. Os dois se medem. A comparação não depende da opinião de ninguém. Repare no que a definição não pede: resolução, material, contagem de triângulos, realismo da iluminação. Um sistema pode ter imersão alta e exibir cubos cinzentos.
Presença é a resposta de quem usa o sistema a esse sistema: a disposição a se comportar, dentro do ambiente apresentado, como se comportaria num ambiente físico com as mesmas propriedades. É atributo da pessoa, e se observa por comportamento — desviar de um obstáculo que não existe, hesitar diante de uma queda desenhada, estender a mão até a distância certa de um objeto que não está lá. A definição não faz referência alguma à fidelidade visual do que é apresentado.
Presença é o palco acertando escala e tempo; fidelidade é a pintura do cenário, e cenário pintado não segura ninguém no lugar. A evidência cabe em dois programas na mesma máquina. Arestas de arame sem material nenhum, respondendo à cabeça sem atraso perceptível, seguram quem as usa. Do outro lado, uma cena caprichada responde meio segundo depois. Ela produz desconforto em minutos.
O que sustenta a crença é o acordo entre o que o corpo faz e o que a cena responde. Imagem atrasada entrega uma contradição, e contradição entre canais sensoriais é a receita conhecida do mal-estar. A separação é assimétrica. Alta imersão não garante presença, porque ficha técnica em ordem não salva um chão posto na altura errada. Presença sem alguma imersão é difícil, porque a resposta do corpo depende de que os estímulos cheguem.
Registro é a relação geométrica entre o que o sistema desenha e o mundo físico visível: o grau em que um objeto sintético aparece na posição, na orientação e na escala que ele ocuparia se estivesse fisicamente ali.
Registro só está definido onde há mundo físico visível. Num regime que substitui o ambiente por inteiro, não existe contra o que registrar, e a palavra não se aplica.
Uma xícara sobre uma mesa real dá o menor exemplo: com bom registro ela fica no lugar quando você anda em volta, e com registro ruim desliza ou flutua acima da madeira. Duas famílias de erro se distinguem aí, e confundi-las manda o conserto para o lugar errado. O estático persiste com todo mundo parado, por calibração ou origem. O dinâmico só aparece no movimento: o objeto nada e volta ao lugar quando a pessoa para.
No regime que tapou a sala, o registro fica indefinido — indefinido, e não ruim, porque a grandeza ficou sem objeto. Já onde o mundo continua visível, a fronteira entre palco e pintura afrouxa: sombra e oclusão viram evidência de posição. Um objeto sem sombra sobre a mesa real parece flutuar mesmo com geometria impecável, porque tudo em volta dele tem sombra e ele não tem.
flowchart TD
subgraph EQ["No equipamento"]
I["Imersão<br/>campo de visão, latência,<br/>graus rastreados, cadência"]
end
subgraph PE["Na pessoa"]
P["Presença<br/>comportamento observado<br/>diante da cena"]
end
subgraph GE["Na geometria entre cena e mundo"]
G["Registro<br/>erro de posição e orientação,<br/>em centímetros e graus"]
end
I -->|"não garante"| P
P -->|"precisa de alguma"| I
G -->|"indefinido quando<br/>o mundo é substituído"| X["sem objeto<br/>contra o que medir"]
| Grandeza | Onde ela mora | Como se mede | O que a medida não prova |
|---|---|---|---|
| Imersão | no equipamento | ficha técnica e bancada: campo de visão, latência, graus rastreados, cadência | que alguém vá se comportar como se estivesse lá |
| Presença | na pessoa | comportamento observado e relato de quem usou | que a imagem seja bonita, nem que o aparelho seja caro |
| Registro | na geometria entre cena e mundo | erro de posição e de orientação, em centímetros e graus | que o ambiente seja confortável ou convincente |
A coluna da direita é a que costuma faltar em relatório técnico. Número sem o seu alcance acaba respondendo à pergunta errada. Daí cai a consequência que contraria o reflexo: escala correta antes de material bonito, quadro estável antes de sombra suave. Trocar o material de um objeto leva minutos. Descobrir no fim que a bancada tem o dobro do tamanho real significa refazer alturas, alcances e tolerâncias com a cena cheia.
1.4 Esconder o mundo, ou somar luz a ele
Um regime que substitui o ambiente precisa de uma imagem opaca: cada pixel entregue ao olho vem da cena sintética. Um regime que preserva o ambiente precisa do contrário. São modos de composição óptica, e a interface que governa essas sessões os nomeia diretamente. O fundo opaco esconde o mundo. O aditivo soma a luz sintética à luz que já chega ao olho. A mistura por transparência combina as duas segundo um valor de opacidade que a própria cena controla, pixel a pixel.
a composição do fundo, em modes/regimes.ts
/**
* Modo de composição do fundo, tal como a API XR o nomeia. É o ponto em que o
* contínuo entre o real e o sintético deixa de ser desenho de livro e vira um
* valor que a sessão informa: fundo opaco esconde o mundo, os outros dois o
* deixam passar. Só é legível com uma sessão ativa, e por isso aqui ele é o
* valor ESPERADO — a leitura do valor real chega quando houver sessão.
*/
export type ModoDeComposicao = 'opaque' | 'additive' | 'alpha-blend';
O comentário desse arquivo diz o que a definição não dizia: o valor só é legível com uma sessão aberta. Antes disso o programa tem uma expectativa, e o aparelho pode desmenti-la quando a sessão começa. Daí a regra que poupa uma tarde de depuração: o modo de composição é resposta, e nunca configuração. Guarde separados o esperado e o obtido — um campo só obriga a sobrescrever um pelo outro, e o que se perde é a informação de que houve divergência.
No modo opaco o preto é uma cor como outra qualquer. No aditivo, a operação é uma soma, e não existe subtração disponível: nenhum pixel consegue retirar luz que já estava chegando ao olho. Desenhar preto ali significa somar zero, e somar zero é não desenhar. A sombra desaparece, o objeto fica translúcido nas regiões escuras, e um material preto se torna literalmente invisível.
Na prática, contorno, aresta e região de sombra precisam ser desenhados com luz. Uma borda clara sobrevive à soma; uma preta não. Um material feito para o regime opaco e reaproveitado no aditivo não fica pior — ele some. Vale para tudo o que informa dentro da cena, e texto escuro sobre fundo claro vira mancha luminosa ilegível pairando no ar. A inversão tem ressalva: texto claro depende do que estiver fisicamente atrás, e uma parede branca ensolarada apaga qualquer letra.
Nada disso se ajusta por configuração no fim do trabalho: é restrição da óptica, e ela decide como cada material será construído quando a paleta da cena for escolhida. A mistura por transparência desmonta a leitura binária, porque ali a opacidade vive num valor por pixel que a cena escreve enquanto desenha. Metade do campo coberta com material opaco, e metade do que se vê é sintético; uma moldura num canto, e quase tudo o que se vê é o quarto. A fronteira entre substituir e sobrepor mora nesse valor, e um mesmo programa a atravessa várias vezes por segundo.
1.5 Onde nasce o zero do mundo
Três degraus separam o caso mais livre do caso mais preso.
Espaço de referência é o sistema de coordenadas em que as poses do ambiente são expressas, junto com a regra que fixa a sua origem e a sua orientação em relação ao mundo físico.
Um espaço de referência se caracteriza por três coisas: onde fica a origem, quem a determina, e o que acontece com ela quando quem usa o sistema se desloca. Duas cenas com a mesma geometria e espaços de referência diferentes produzem experiências distintas.
Uma coordenada dá o menor exemplo. Se a origem é um ponto arbitrário de quem modelou, dois metros à frente dela são dois metros de mundo virtual, sem relação com nada. Se a origem é o chão do espaço físico, os mesmos dois metros são dois metros do chão da sala. A coordenada não mudou uma vírgula, e a frase que ela exprime mudou inteira. E a definição não exige precisão nem estabilidade: espaço mal rastreado continua sendo espaço de referência.
flowchart TD
D1["Degrau 1<br/>origem: ponto arbitrário da cena<br/>quem decide: quem modelou"] --> G1["ganha: liberdade total<br/>perde: escala corporal"]
D1 --> D2["Degrau 2<br/>origem: o chão do espaço físico<br/>quem decide: o rastreamento"]
D2 --> G2["ganha: altura e alcance de braço<br/>arrisca: piso estimado fora do lugar"]
D2 --> D3["Degrau 3<br/>origem: superfície real detectada<br/>quem decide: o ambiente, medido"]
D3 --> G3["ganha: registro conferível a olho nu<br/>arrisca: a superfície muda de lugar"]
No primeiro degrau a origem é um ponto arbitrário da cena. Ninguém tem argumento para discordar, porque não há nada físico contra o que conferi-la. É a cena numa janela, com a câmera orbitando o conteúdo: liberdade total, escala corporal nenhuma. No segundo, a origem é o chão estimado pelo rastreamento. Uma bancada declarada a noventa centímetros nasce na altura de uma bancada. No terceiro, a origem é uma superfície real detectada, e o que se obtém é o registro no sentido estrito.
A face desagradável cresce junto. No primeiro degrau nada pode dar errado com a origem, porque não há nada contra o que ela erre. No segundo, o aparelho pode estimar o piso acima ou abaixo do real, e a cena inteira nasce deslocada. No terceiro, a superfície detectada muda de lugar quando o aparelho revisa o que acha do ambiente, e o objeto que estava sobre a mesa passa a estar atravessado nela. Cada degrau troca liberdade por informação do mundo, e informação do mundo vem com incerteza embutida.
| Degrau | Origem do mundo virtual | Quem a decide | O que se ganha |
|---|---|---|---|
| 1 | ponto arbitrário da cena | quem modelou | liberdade total de composição |
| 2 | chão do espaço físico | o rastreamento do aparelho | escala corporal e alcance de braço |
| 3 | superfície real detectada | o ambiente, medido pelo aparelho | registro conferível a olho nu |
O vocabulário se repete em qualquer interface desse tipo. Um espaço ancorado em quem observa viaja junto da cabeça. Um espaço local fixa a origem onde a sessão começou, sem prometer saber onde está o chão. O local com chão acrescenta essa promessa, e a altura passa a significar altura. O espaço sem limites cobre área maior que a sala, e em troca a origem pode ser corrigida durante o uso. Quanto mais o espaço promete sobre o mundo físico, mais coisas ele pode errar — e escolher o que promete mais é reflexo comum e quase sempre errado.
Os três regimes diferem em quatro perguntas: o que se faz com o mundo, que espaço de referência se pretende, o que se rastreia e contra o que se registra. A forma natural de escrevê-los é uma lista de registros com os mesmos campos.
o regime declarado campo a campo, em modes/regimes.ts
export interface Regime {
readonly id: RegimeId;
readonly nome: string;
readonly tratamentoDoMundo: TratamentoDoMundo;
/** Espaço de referência pretendido, no vocabulário da API XR. */
readonly espacoDeReferencia: 'viewer' | 'local' | 'local-floor' | 'unbounded';
/** O que o sistema rastreia neste regime, em uma frase. */
readonly rastreia: string;
/** Contra o que a cena é registrada — a origem do mundo virtual. */
readonly registroContra: string;
readonly composicaoEsperada: ModoDeComposicao;
/** Por que este regime existe no projeto, e não como enfeite comparativo. */
readonly papel: string;
}
Um regime que precisasse de campo próprio, ausente nos outros dois, avisaria que o contínuo voltou a ser tratado como caixas separadas. Campo exclusivo é categoria com outra roupa. Daí o erro previsível, cometido sem má-fé: declarar os três regimes com o mesmo espaço de referência, o mesmo rastreamento e o mesmo registro. O texto fica bonito, o código compila, e o que existe é uma cena só com três rótulos trocados. A conferência que desmascara isso é mecânica — compare as três entradas, e se duas forem idênticas nesses campos, uma delas não existe.
Essa declaração campo a campo tem um gêmeo em prosa, na especificação do projeto.
os três regimes lado a lado, em docs/especificacao.md
| Aspecto | Na janela | No visor | Pela câmera |
| --- | --- | --- | --- |
| Como se olha | câmera em órbita, mouse | pose da cabeça, seis graus | pose do aparelho na mão |
| Como se aponta e age | raio do cursor, clique | raio do controle, gatilho | toque na tela sobre o objeto |
| Escala da cena | 1:1 | 1:1, corpo de pé | 1:2 sobre a mesa |
| Origem do mundo virtual | ponto arbitrário da cena | chão do espaço físico | superfície real detectada |
| O que a cena faz de diferente | nada além do essencial | alcance de braço passa a existir | o suporte fica preso à mesa real |
| O que não existe aqui | escala corporal, alcance de braço | o mundo real | o cenário em volta, e o chão virtual |
Seis linhas, três colunas, e cada célula é uma afirmação que pode ser desmentida por observação. A escala não é a mesma nos três: na janela e no visor a cena aparece em tamanho real, e pela câmera do celular vem reduzida à metade, porque bancada em tamanho real não cabe na mesa de ninguém. A última linha é a mais valiosa e a menos comum, porque diz o que não existe em cada regime. Só que declaração escrita envelhece de um jeito perverso: continua parecendo correta meses depois de ter deixado de ser. Duas fontes que descrevem a mesma coisa não se mantêm sincronizadas por boa vontade — ou uma deriva da outra por procedimento, ou as duas divergem.
1.6 Tudo isto antes do primeiro polígono
O que se faz ali dentro? A pergunta parece simples demais para merecer uma seção.
Quem começa um ambiente tridimensional tende a responder pelo assunto — uma oficina, um museu, uma estação espacial —, e assunto não é tarefa. Um museu é um lugar, e lugar nenhum tem estado final, critério de conclusão ou possibilidade de estar errado. A tentativa ingênua escolhe a cena primeiro e descobre a tarefa depois, seduzida por um motivo honesto: no começo nada custa nada. A conta chega quando alguém precisa dizer o que acontece ao soltar um objeto em algum lugar.
A ordem que sobra é a inversa: a tarefa primeiro, a cena depois. A restrição de forma é o que a torna útil — ela cabe em uma frase. E serve de diagnóstico: tarefa que precisa de um parágrafo é mais de uma tarefa. “Montar um mecanismo encaixando as peças na ordem correta” cabe. “Explorar um ambiente industrial e aprender sobre processos de manufatura” também caberia, e não diz o que a pessoa faz com as mãos.
A segunda pergunta é o inventário: os objetos que a tarefa toca, e apenas eles. Uma bancada tem tampo, pés e talvez uma luminária, e nada disso participa de encaixar peça nenhuma. Confundir cenário com inventário é o caminho mais curto para modelar quarenta objetos e descobrir que cinco bastavam. A terceira é o estado final, escrito de modo que alguém possa olhar e decidir. “As cinco peças estão nos encaixes correspondentes e o mecanismo gira” passa no teste. “O usuário compreendeu o funcionamento do mecanismo” não passa: não existe pixel que mostre compreensão.
Há uma quarta pergunta que fica de fora, e a ausência é decisão. Não se pergunta ainda como a pessoa faz aquilo, com o dedo, com o mouse ou com um controle. A forma de agir depende do regime, e o domínio precisa sobreviver aos três. Escrever “arrastar com o dedo” na delimitação amarra o modelo ao celular antes de o modelo existir.
a tarefa e o estado final, em dominio/dominio.ts
/**
* A tarefa que o ambiente suporta, enunciada em uma frase, mais o estado que a
* caracteriza concluída. Os dois campos andam juntos de propósito: tarefa sem
* estado final é intenção, e é o que produz a cena bonita e vazia.
*/
export interface TarefaDoAmbiente {
readonly enunciado: string;
readonly estadoFinal: string;
}
Quatro linhas, e a decisão que elas tomam é manter os dois campos juntos. Tarefa e estado final costumam morar longe um do outro: a tarefa vira uma frase no documento, e o estado final, uma condição perdida no código de validação. Lado a lado, um cobra o outro. Repare que os dois são texto, e não estrutura — frase em português não é verificável pela máquina, e em troca é verificável por gente, agora.
flowchart TD
T["A tarefa em uma frase"] --> N["O inventário:<br/>só os objetos que a tarefa toca"]
N --> E["O estado final,<br/>observável na cena"]
E --> V["Conferência do modelo:<br/>peça órfã, encaixe órfão,<br/>encaixe citado que não existe"]
V --> Q["Duas frases em português,<br/>antes de qualquer polígono"]
E --> D["A especificação:<br/>14 seções em quatro blocos"]
D --> F["Toda frase admite<br/>ser contrariada por medida"]
Escritas a tarefa, o inventário e o estado final, aparece uma classe de erro que não é de digitação nem de lógica: a inconsistência do modelo. Uma peça que não encaixa em lugar nenhum. Um encaixe declarado que nenhuma peça usa. Uma peça que cita um encaixe que o suporte não declara. Nenhum dos três impede o programa de rodar, e todos produzem um ambiente em que a pessoa tenta concluir a tarefa e não consegue, sem erro nenhum na tela.
Execute um deles até o fim. Cinco peças, cinco encaixes, e alguém chamou o mesmo encaixe de topo na lista do suporte e de tampa na lista da peça. Duas palavras razoáveis para a mesma coisa. O programa carrega o modelo sem reclamar e monta a cena. A peça que fecharia o mecanismo nunca encaixa, e o encaixe que existe não recebe peça alguma. Dois defeitos, uma origem, zero mensagens.
a conferência do modelo, em dominio/dominio.ts
export function inconsistenciasDoDominio(dominio: Dominio): string[] {
const declarados: ReadonlySet<SocketId> = new Set(dominio.sockets);
const usados: Set<SocketId> = new Set();
const problemas: string[] = [];
for (const peca of dominio.pecas) {
if (peca.sockets.length === 0) {
problemas.push(`A peça "${peca.nome}" não encaixa em socket nenhum.`);
}
for (const socket of peca.sockets) {
if (!declarados.has(socket)) {
problemas.push(
`A peça "${peca.nome}" cita o socket "${socket}", que o suporte não declara.`,
);
}
usados.add(socket);
}
}
for (const socket of dominio.sockets) {
if (!usados.has(socket)) {
problemas.push(`O socket "${socket}" não recebe peça alguma.`);
}
}
return problemas;
}
Repare no que a função devolve: uma lista de frases em português, e não um valor booleano. Um false informa que há defeito e obriga quem lê a caçar qual; a frase diz o nome da peça e o do encaixe, e é isso que permite consertar sem abrir o depurador. O que ela não verifica também informa — ordem dos passos, razoabilidade das folgas, interesse da tarefa, nada disso. A pobreza da verificação é o que a torna executável antes de existir cena.
Antes de seguir. Rode essa conferência sempre, na abertura do ambiente, e não apenas num teste automatizado. São alguns milissegundos por execução, com um resultado que quase sempre é uma lista vazia. O teste que roda em outro lugar é o teste que alguém desliga na semana em que ele atrapalha.
1.7 A frase que pode estar errada
Especificação sem número é intenção com formatação melhor. Uma especificação de projeto é um documento em que toda frase pode estar errada. É o critério inteiro, aplicado frase a frase, com o dedo na tela: aquela afirmação admite ser contrariada por observação futura? “A peça encaixa com folga de dois centímetros” admite, porque basta medir e dar três. “A experiência será fluida e envolvente” não admite coisa alguma. A segunda é uma não-frase com formatação de frase, e a diferença cobra caro: frase ruim se conserta, não-frase se apaga.
A forma que um documento desses assume se repete de projeto para projeto: quatorze seções em quatro blocos, que respondem pela cena, pelas regras, pela máquina e pelo trabalho. A cena diz o que existe, em quantos exemplares e com que tamanho em metros. As regras dizem o que a pessoa faz, quando a tarefa está concluída e com que tolerância. A máquina diz o que acontece nos regimes e o que sai primeiro quando não couber. O trabalho diz de onde vem cada ativo e o que ainda está em aberto.
A ordem dos blocos vem da mesma aritmética do custo de correção: cena e regras se reescrevem enquanto não houver geometria, e a máquina só se decide depois de haver o que medir. O bloco da cena guarda o item que mais se esquece, e ele é uma coluna de números — o tamanho de cada objeto em metros. Sem isso o inventário é uma lista de nomes, e listas de nomes atravessam projetos inteiros sem que ninguém compare a peça de cinco centímetros com a bancada de dois metros.
as tolerâncias de encaixe, em docs/especificacao.md
| Encaixe | Folga de posição | Folga de ângulo | Por quê |
| --- | --- | --- | --- |
| Corpo na base | 3,0 cm | 15° | peça grande, encaixe único, sem vizinho para confundir |
| Eixo no furo | 1,5 cm | 10° | furo estreito; folga maior faria o eixo saltar sozinho |
| Engrenagens nos dentes | 2,0 cm | 8° | os dois encaixes são vizinhos, e folga grande troca um pelo outro |
| Tampa no topo | 3,0 cm | 20° | último passo; apertar aqui só produz irritação |
Todos os valores são **provisórios** e serão medidos no aparelho. O que se sabe
antes de medir é a forma do erro nos dois extremos: folga grande demais faz a peça
saltar para o lugar sem que a pessoa tenha acertado, e a montagem perde sentido;
folga pequena demais transforma o encaixe em tortura de precisão. O valor final é
o que sobreviver a esse intervalo, e o registro do que foi testado antes de
escolhê-lo vale tanto quanto o número escolhido.
Nenhum desses valores foi medido. Estão escritos como provisórios, com a razão de cada um ao lado, e serão conferidos no aparelho. Poderia parecer que número não medido é pior que número nenhum, e é o contrário: o provisório é falseável, e a medição futura pode contradizê-lo. A ausência de número não pode ser contrariada por medição nenhuma.
O que se sabe antes de medir é a forma do erro nos dois extremos. Folga grande demais faz a peça saltar para o lugar sem que a pessoa tenha acertado, e a montagem perde o sentido. Folga pequena demais transforma o encaixe numa prova de pontaria. O valor final é o que sobreviver a esse intervalo. Repare na coluna da direita: ela diz por que aquele valor e não outro, e é essa razão que sobrevive quando o número mudar.
1.8 Doze retas penduradas no teto
O contraexemplo mais antigo, e o mais barato, de tudo o que veio acima.
O visor que Ivan Sutherland montou em 1968 precisava ficar suspenso do teto do laboratório por um braço mecânico articulado. O braço não estava ali apenas para segurar peso: ele também media a posição da cabeça de quem vestia o aparelho, lendo os ângulos das próprias juntas. O apelido pelo qual o equipamento ficou conhecido, espada de Dâmocles, descreve a imagem de quem entrava embaixo dele, e veio depois, dado por outras pessoas.
O que aquele aparelho exibia eram arestas de arame. Um cubo era doze segmentos de reta flutuando no ar, e o ar era a sala do laboratório, visível através da óptica semitransparente das duas pequenas telas. A pessoa move a cabeça. Os segmentos giram na direção certa, na hora certa, e ela relata ter visto um cubo. Sem textura, sem sombra, sem cor. Geometria coerente com o corpo, e nada mais que isso, bastou.
flowchart LR
B["Braço mecânico<br/>preso ao teto"] -->|"sustenta o peso"| V["Visor na cabeça"]
B -->|"lê os ângulos<br/>das próprias juntas"| C["Computador"]
C -->|"doze segmentos de reta"| V
V -->|"óptica semitransparente"| O["Olho"]
L["A sala do laboratório"] -->|"a luz atravessa o vidro"| O
A escolha do braço merece um olhar menos reverente do que costuma receber. Ele não foi adotado por ser a melhor forma concebível de medir uma cabeça. Já estava ali, sustentando um peso que nenhum pescoço aguentaria, e ler os ângulos das juntas de uma estrutura rígida era a informação mais barata disponível. A distância entre o anunciado e o entregue também já estava naquele laboratório: o aparelho se apresentava como visor tridimensional acoplado à cabeça, e punha ali doze retas.
Uma ressalva, e ela é sobre o que estas páginas não afirmam. Os números do equipamento — peso, campo de visão, resolução do traçado — circulam em versões que não batem entre si, e nenhuma delas é repetida aqui. O que se afirma é o que a descrição original sustenta: o braço, a suspensão, a leitura dos ângulos, as duas telas com óptica semitransparente e as arestas de arame. E é essa óptica que desfaz uma cronologia contada ao contrário. Quem usava aquele visor via as arestas e via a sala ao mesmo tempo, somadas pelo vidro. Pela definição do contínuo, o sistema estava numa posição intermediária: o ancestral do campo nasceu do lado que hoje se chama de aumentado.
Trinta e um anos depois, Frederick Brooks publicou um balanço da área. Em Chapel Hill, ele havia posto químicos — gente com trabalho de bancada a fazer — para encaixar moléculas com um braço mecânico de retorno de força. O que escreveu em 1999 foi que a realidade virtual havia passado de “quase funciona” a “mal e mal funciona”. Dizia isso de sistemas cuja imagem já era melhor que a de qualquer feira dez anos antes. O critério dele era o comportamento dos químicos, que preferiam usar o sistema a não usá-lo.
A pergunta mais barata que existe. Diante de qualquer demonstração que impressione — a sua, a de outra pessoa, a de um fabricante numa feira —, pergunte como o sistema descobriu onde estava o chão. Quem responde tem um sistema. Quem não responde tem uma demonstração.
Volte às duas pessoas da abertura. Elas nunca estiveram em categorias diferentes: descreviam duas posições no mesmo eixo, produzidas por duas escolhas de espaço de referência e duas escolhas de composição do fundo. As duas linhas de configuração agora têm nome. Uma escolhia entre a origem arbitrária da cena e o chão do espaço físico; a outra, entre esconder o mundo e deixá-lo passar. Nenhuma das duas desenha um polígono, e as duas decidem o que o resto vai poder fazer. O que vem agora tira essas decisões do papel: escolher a cena e delimitar o domínio, declarar o que cada regime faz com o mundo, e escrever a especificação onde toda frase possa estar errada.