Os tempos
Cada momento tem duração fixa e acontece independente de a pessoa interagir. Há uma janela para ela agir; passada a janela, a narrativa segue. Quem interage conduz, quem não interage é conduzido — e ninguém trava a fila.
| de | o quê | dura |
|---|---|---|
| 0:00 | a sala real; o céu estrelado já está lá | 0:05 |
| 0:05 | as estrelas começam a cair | 0:10 |
| 0:15 | o nascimento: grama → cogumelo → a árvore | 1:35 |
| 1:50 | janela — andar, os cogumelos, o casulo | 1:00 |
| 2:50 | a borboleta sobe e o mundo se desintegra | 0:10 |
| 3:00 | as estrelas acendem, da mais distante até o Sol | 0:40 |
| 3:40 | os planetas surgem e vêm orbitar a pessoa | 0:30 |
| 4:10 | eles se dispersam pelo céu e ficam à espera | 0:30 |
| 4:40 | os buracos negros aparecem | 0:20 |
| 5:00 | o balé — sugar e cuspir os planetas não escolhidos | 0:30 |
| 5:30 | janela — pegar e dimensionar um planeta | 0:50 |
| 6:20 | entrar no planeta | 0:10 |
| 6:30 | o planeta rosa se monta; a água sobe até a cintura | 0:35 |
| 7:05 | a deusa vermelha aparece na margem, com reflexo | 0:25 |
| 7:30 | janela — os seres, as pedras, achar a concha | 0:55 |
| 8:25 | a mão gigante vem, e puxa | 0:20 |
| 8:45 | o mundo de papel sobe, de baixo para cima | 0:35 |
| 9:20 | a deusa que integra tudo surge entre as camadas | 0:25 |
| 9:45 | tudo se desmancha; sobra o quarto real | 0:15 |
Os números do áudio não cabiam nos dez minutos como estavam. Trinta segundos de espera mais vinte para os buracos negros aparecerem já passavam dos 2:30 que o sistema solar tinha. Ele cresceu para 3:30, e a floresta e o planeta rosa cederam o que faltava.
São três janelas de interação, de 50 a 60 segundos cada. É pouco para quem trava e sobra para quem entende rápido — medir com gente de verdade é a única forma de acertar isto.
A floresta cósmica
0:00 — 3:00A pessoa põe o óculos na marca do chão e olha em volta. Embaixo, só o ambiente real. Ao olhar para cima, o céu estrelado já está lá — não surge, já estava. Cada pessoa leva o seu tempo para notar, e esse tempo é dela.
Uns vinte segundos depois começam a cair partículas. Não é neve — é como se as estrelas estivessem caindo, ou se aproximando. Elas caem dentro do polígono de chão que o aparelho leu, e onde tocam, ficam.
De cada grão pousado nasce a vegetação, uma coisa após a outra: grama → cogumelo → uma única árvore. Não é o tempo que dispara isso, é a poeira. A camada da Crisia causa a do Plinio.
Ao mesmo tempo, em cima, a pintura preenche a cúpula.
Entre o céu e o chão entra a nuvem cósmica marmorizada — a camada da Crisia, feita da marmorização em ebru assada por quadro. Ela não é objeto nem cenário: é o que ambienta, o ar entre as coisas.
Já foi construída e testada, e funcionou. É a única peça deste cenário que já existe pronta, junto com o céu.
Ela fica perto da parede, na região infinita — não no centro. O que vem até você é um galho que se inclina, e dele pende o casulo, dentro do alcance da mão.
É a árvore-mãe do Plinio, com a textura da Crisia. A estrutura dele fica: tronco curvo, três galhos abaixo de dois metros, copa acima do forro. O que muda é a pele.
E a copa deixa de ser folha: vira poeira cósmica aglomerada. Folha de polígono mostra a aresta de perto; poeira não tem aresta para mostrar. Assim a árvore passa a ser feita da mesma matéria que o mundo em volta, em vez de ser um objeto colado nele.
As raízes são orgânicas — nunca geométricas.
Os cogumelos acendem quando a mão se aproxima, antes do toque. É o que ensina, sem instrução, que se pode tocar nas coisas. Depois disso o casulo é óbvio — e a saudação já estava escrita no código:
"Só um casulo pendurado num fio. Toque nele."A borboleta sai do casulo e voa em direção ao céu, com rastro. O olhar sobe atrás dela, e enquanto sobe, tudo se desintegra — como quem puxa um lençol para cima. O cenário seguinte se monta de cima para baixo.
A borboleta em 3D do Plinio serve como está. O que muda é a
textura: entra a da t_005, a borboleta 88, com os dois
anéis concêntricos nas asas. Recorta-se a asa da imagem e aplica-se na
geometria que já existe — não é preciso remodelar nada.
O sistema solar
3:00 — 6:30É um zoom para fora do primeiro cenário — como olhar o mapa. Você vai junto com a borboleta para o espaço. A floresta ressoa o universo.
Estrela a estrela: acendem primeiro as mais distantes, depois mais perto, mais perto, até acender o Sol. Só então surgem os planetas circulando ele, acima da cabeça. E então, um a um, eles descem e vêm girar em volta da pessoa.
A montagem não tem frente. Ela acontece em volta, e a pessoa vê os planetas girando e se montando virando para qualquer lado. Prender o espetáculo a uma direção restringiria demais onde ela pode estar — a marca no chão serve para posicionar e para o aparelho se orientar, não para obrigar ninguém a olhar para um lado.
Rosa — mais ar, nuvens e furacões; ao segurá-lo, as nuvens começam a girar em volta de você. Azul-bebê — ondas, espuma, superfície líquida que se move. Vermelho-fogo — chão de vulcão, crostas pretas, lava nas rachaduras. Verde — continentes e polos, parecido com a Terra, mas não é a Terra.
Nem todos precisam ser esferas. Outros universos podem não respeitar a gravidade que arredonda tudo — mas o rosa fica esférico por enquanto, e os outros é que experimentam forma.
Eles se aproximam e dão a volta na pessoa — mas não ficam aglomerados em volta dela. Depois da volta eles se dispersam pelo céu, cada um com espaço em torno. Amontoados, ela não consegue lidar com nenhum.
E o planeta que aceita interação fica mais perto. É assim que se sabe qual é, sem nenhum aviso: a distância é o convite. O que está ao alcance é o que responde.
Depois de se montarem, eles ficam parados no espaço à espera — uns trinta segundos — e só então voltam a se movimentar.
Asteroides passam ao acaso; um pode ser desviado pelo seu campo gravitacional, dar uma volta em você e seguir.
A estrela irradia luz e projeta sombra em tudo. Iridescente, com
as cores se alterando sem pisca-pisca — dominante branca. Emite bolhas
de energia pulsando, parecidas com as bolhas luminosas do
chave_03.
Os buracos negros não estão lá desde o começo. Eles só aparecem depois — quando os planetas já se montaram e o cenário já respirou. Aí os que não foram escolhidos voltam ao Sol ou vão para eles, que ora sugam, ora cospem de volta: um balé, que recomeça a cada escolha.
Você pega um planeta. Ele fica do tamanho da mão aberta. Abrindo muito, ele cresce além de você — e você entra nele. O cenário desce; o seguinte se monta de baixo para cima.
O planeta rosa
6:30 — 8:45Faz-se um planeta só. Por ora, qualquer um que se abra leva a este. Os outros vêm depois, mudando cor e detalhe sobre a mesma estrutura.
Dentro da água, com ela na altura da cintura. Pedras com textura em volta. Sem árvores. As partículas continuam. No lugar da grama, algas.
Isso já existe no código do Plinio — a lâmina de água na cintura, com as suas pernas reais aparecendo por baixo. Em realidade mista é o melhor tipo de efeito: metade da imagem é você.
Céu rosa profundo, não claro. Embaixo, verde com azul e amarelos leves. O rosa não pode ser pálido: ele é o fundo da deusa, e se clarear demais ela some por falta de contraste.
Ela vem em vídeo, recortada com orla clara, num plano que sempre encara a pessoa. Fica no chão, perto da água, com reflexo.
É o único quadro da animação que tem chão — e o chão dela, segundo o próprio código, é de vitórias-régias. O chão dela já era água. É por isso que ela pertence a este cenário e a nenhum outro.
Peixes e seres marinhos voando, de formas estranhas.
Uma concha grande, com um buraco negro dentro — grande de propósito, para ser achada sem procura. Dele surge uma mão gigante que vem na sua direção; você toca, e ela te puxa.
O mundo de papel
8:45 — 10:00Ele não aparece: vai surgindo de baixo para cima, lentamente, enquanto a experiência se encaminha para o fim.
As formas circulares da animação, recortadas em camadas de papel, uma atrás da outra. Ao mover a cabeça elas se deslocam entre si e o espaço aparece — paralaxe de verdade, não desenho de perspectiva.
Elas flutuam no cosmos, sem caixa que as limite.
Onde haveria chão, aparece o céu do primeiro cenário, invertido — o lugar de onde ela partiu, agora sob os pés. Custa zero: a panorâmica já existe, é só inverter a direção.
A deusa que integra tudo, surgindo no meio das camadas, em dimensão muito grande.
Só ela. A borboleta-mandala ao fundo fica para depois — este cenário já tem coisa demais junta, e ela seria a terceira presença num trecho de setenta e cinco segundos.
A borboleta circunda a pessoa, e a obra se desmancha. Sobra o quarto real, com a luz rasante no chão — a mesma imagem do primeiro minuto.
As regras que valem em todos
Não são preferências: cada uma corrige um defeito que já apareceu.
| regra | por quê |
|---|---|
| Nenhum corte duro | A animação de origem não tem um único corte em três minutos. Toda passagem é metamorfose, e tem direção — sobe ou desce. |
| A cúpula é infinita | Sempre céu em volta, sem topo de parede à vista. A obra não se encaixa na geometria da sala: ela vive no infinito, e só o chão é real. Assim andar não descola nada, e as medidas do estande deixam de importar. |
| A transição é longa | Cheia em cima, cedendo ao descer, com degradê macio até o chão. O defeito a evitar é o corte na linha do horizonte, que lê como rachadura no teto em vez de abóbada. |
| Tocável em 1,2 m | O limite de segurança fica a 1,5 m do centro. Objeto tocável mais longe faz a pessoa esbarrar na grade — e a grade encerra a obra na hora. |
| Nada de serrilhado | Três causas, sempre as mesmas: geometria fina vista de raspão, borda de recorte com corte duro, e transparência escrevendo profundidade — esta última faz o que está atrás desaparecer. |
| Tempo limite por cenário | Se a pessoa não tocar em nada, a passagem acontece sozinha. Quem interage conduz; quem não interage é conduzido. Ninguém trava a fila. |
| Reinício automático | Ao fim da sessão a obra volta ao começo, sem ninguém da produção mexer em nada. |
| As ramificações atravessam tudo | Linhas vermelhas orgânicas, sutis, que aparecem e somem. Não é um cenário — é o traço. Nos 62 quadros da animação não existe um só sem elas. |
O espaço e a luz
Dado de cenografia vira implicação, não descrição.
| o que é | o que implica |
|---|---|
| 3 × 3 m caminhável | Dentro de uma sala maior. Escaneia-se a sala inteira (dá paredes, chão e móveis ao app) e desenha-se o limite em 3 × 3. São coisas separadas no aparelho, e é essa separação que permite o mundo existir além de onde se alcança. |
| Duas paredes, dois lados abertos | Sem painel físico: a mesma graduação vertical resolve — embaixo o real, em cima a obra. Se as pessoas dos lados abertos aparecerem por baixo dela, sobe-se o ponto em que ela começa a sumir. |
| Marca no chão | Física e visível pelas câmeras — um círculo, um tapete com textura. Posiciona a pessoa, serve ao mediador, e dá ao aparelho um ponto fixo e contrastado para reconhecer o espaço no escuro. |
| Ambiente escuro | Medido em 06/09: o rastreamento de mão funciona nesta luz. As duas mãos foram rastreadas como mao-nua na sala escura. O teste anterior falhou porque a obra não pedia hand-tracking — não por escuridão. A luz continua sendo cenografia (rasante, de chão, sem cintilação), e a lâmpada segue o cenário e sobe nas três janelas. |
| Luz rasante de chão | É a solução técnica e é a própria abertura da obra: chão real aceso, céu escuro em cima. Medida sem aparelho: dá para ler uma página impressa em pé no meio do 3 × 3. |
| Sem cintilação | LED com dimmer barato tremula rápido demais para o olho e devagar demais para as câmeras — e isso vira tremor no rastreamento. Driver sem cintilação, ou brilho pleno. |
| Nada na altura dos olhos | Luminária de frente entra nas câmeras, estoura a imagem e atrapalha a localização. Tudo rasante. |
De onde vem cada peça
Os quadros da Odara não são referência solta: cada um tem destino.
| quadro | vira | onde |
|---|---|---|
| chave_01 | ornamentos e filigrana | superfícies longas, casca |
| chave_03 | ambiente e bolhas | planeta rosa |
| chave_05 | o ser galáctico, em vídeo ao longe | sistema solar |
| chave_12 | texturas e galáxias | referência do céu cósmico |
| chave_13 | a forma do Sol · texturas | sistema solar · planeta rosa |
| chave_14 | as ramificações vermelhas | todos |
| chave_23 | a deusa vermelha, em vídeo | planeta rosa |
| chave_25 | mármore — forma dos planetas | sistema solar |
| chave_27 | a água | planeta rosa |
| chave_28 · 29 | a borboleta-mandala | mundo de papel |
| chave_31 · 32 | as camadas de papel | mundo de papel |
| t_005 | a borboleta 88 — textura da nossa | floresta |
| t_008 | a subida da borboleta | passagem 1 → 2 |
| t_013 | montanhas ao longe | na região infinita |
| t_037 → t_040 | a transição da semente — a mandorla que abre | passagem |
| t_069 | fluido marmorizado orgânico | textura |
| t_072 | a deusa que integra tudo | mundo de papel |
| t_089 | textura de planeta | sistema solar |
A semente e o olho são a mesma forma. Os quadros
t_037 a t_040 são uma sequência de abertura: uma
mandorla de anéis marmorizados que se alarga até virar disco cheio, com uma
coluna de luz atravessando. É o gesto do olho que se abre — e lê como semente.
A semente que faltava e o olho que atravessa a animação nunca foram duas coisas. Já existem, já são animados, e já estão na fonte.
Decidido
Saíram da lista de pendências.
Repositório novo, nem o do Plinio nem uma cópia dele. Publicado em GitHub Pages.
A do Plinio, com a textura da Crisia — e a copa em poeira, não em folha.
É traço, não cenário. Ramificação sutil atravessando os quatro, aceita pelos dois.
Cada momento tem duração fixa e segue independente de interação.
O que ainda está aberto
Nada aqui é dúvida minha: são decisões que pertencem a vocês.
Onde as partículas caem. Só dentro do polígono de chão, ou por todo o volume, virando vegetação apenas onde tocam o piso?
Os asteroides são cinzas? Foi dito no áudio, mas não deu para saber a que se referia.
Os controles de mão. Confusos hoje, na visualidade e no uso. E falta um sinal que diga às pessoas o que pode ser tocado.
O prazo. Tudo se dimensiona a partir dele — inclusive quanto de ambição eu corto.
O teste mais barato do projeto. Montar 3 × 3 na luz que vocês pretendem, pôr o capacete e testar só o rastreamento de mão por dois minutos.
Vinte minutos, sem programação, sem mim. E derruba ou confirma metade do que está escrito aqui.
Guardado
Decidido, mas fora do que está construído hoje. Fica aqui para não se perder e para não voltar como pergunta.
É a 88, e é a única com textura. As outras da animação são outra coisa — podem entrar quase invisíveis, como presença e não como figura. Por enquanto trabalha-se com uma só.
Um por cenário, nunca simultâneo. Os cenários não se sobrepõem no tempo, então o decodificador nunca vê dois. O cuidado é carregar antes e pausar, não criar na hora.
Giro cilíndrico. Giram para a pessoa em torno do eixo vertical, e o centro fica onde foi posto. Nunca deitam, nunca passeiam.
Seis do Midjourney, uma por corpo, escolhidas pela cor de quem veste: o coral que sai de um ponto vira o Sol, a nebulosa rosa vira o planeta rosa, as veias de lava o planeta fogo, a samambaia magenta e ciano o verde, o azul profundo com o olho a água, e o mármore violeta tira o cinza dos asteroides. A cor de cada planeta recuou para perto do branco — tingir forte apagaria o que se foi buscar.
Nenhum começa sozinho. Vão tocar só ao toque da pessoa. Um por cenário, e os cenários não se sobrepõem no tempo.
A trilha da Crisia por enquanto. Toca em loop, e no build de teste entra desligada.
Referências
Guardadas para analisar depois. Não estão analisadas — estão anotadas para não se perderem.
newart.city — galerias 3D que rodam no navegador, com caminhada livre em primeira pessoa, livro de visitas, conversa entre quem está dentro ao mesmo tempo e catálogo das peças. A espera mostra a contagem dos objetos carregando, em vez de uma barra.
Ruins of Tomorrow, de Sophia zichen Lyu. Museu sobre crise climática. A área segura é pequena de propósito, e convive-se com a última árvore do planeta — a mesma decisão de escala que a nossa área de 3 × 3 impõe, mas assumida como sentido.
GATEWAY-ÄL, de Fabian x Cristian x Terdegibh. Cavernas maias sagradas como portal para os ancestrais, ligando o xamanismo Häch Winik da selva Lacandona ao ciberespaço.
Erros
O que já quebrou e foi corrigido, e o que ainda pode quebrar. Não é lista de boas intenções: cada linha da primeira tabela é um defeito que estava mesmo no código.
Teste no Quest, 06/09. Puseram o capacete e não aconteceu nada — não havia cúpula. A causa foi encontrada e é a primeira linha da tabela: um defeito que só existe em realidade mista e que nenhuma revisão no computador poderia mostrar, porque lá o fundo é opaco e o canal que quebrou nem é usado.
É o achado mais importante do dia, e veio de pôr o capacete. Nenhuma auditoria de código substitui isso.
Já corrigidos
Todos tinham a mesma característica: nenhum dá erro visível. Ou a página morre inteira, ou a coisa simplesmente não aparece — e o console fica em silêncio.
| o defeito | como apareceria | |
|---|---|---|
| Atributos vazando entre programas | Ligar um atributo no WebGL vale para sempre, não para o desenho. Com cinco ligados e o programa seguinte usando um, os quatro restantes seguiam apontando para outro buffer, com outra contagem de vértices — leitura fora do intervalo. Em algumas placas sai geometria lixo; em outras o objeto some. | corrigido |
| O alfa elevado ao quadrado no headset | Era isto que apagava a obra no Quest. A mistura tratava os quatro canais igual, então no alfa fazia srcA × srcA — e como o quadro do headset começa com alfa zero (é esse alfa que deixa a câmera aparecer), o resultado era o alfa ao quadrado. Uma cúpula a 30% compunha a 9%; uma nuvem a 15% compunha a 2%. Tudo o que não fosse quase opaco sumia, e sobrava a sala real. No computador não aparece, porque lá o fundo é opaco e só a cor conta — por isso passou por tantas revisões minhas. |
corrigido |
| A obra começava sozinha | O relógio partia no instante em que a página abria. No headset isso quer dizer que os primeiros minutos correm enquanto a pessoa ainda ajeita a tira na cabeça e procura o botão — e quem entrava chegava no meio. Agora há um portão: nada anda até alguém mandar, e Iniciar em RM só zera o relógio quando a sessão realmente abre. | corrigido |
| Começar antes das imagens chegarem | São onze imagens embutidas, quase seis megabytes. No computador decodificam num piscar; no headset demoram. Começando antes, os primeiros segundos rodavam com cor chapada no lugar da pintura — e quem está dentro conclui que não funcionou. O botão agora só libera com as onze prontas, e uma que falhe aparece escrito. | corrigido |
| O reflexo não caía junto com o céu | A cúpula não é opaca do teto ao chão: cai por um smoothstep e chega a zero antes do piso, para a sala real aparecer por baixo. O reflexo na água lia a imagem crua, sem essa queda. Dava contradição no mesmo quadro: olhando de raspão, em cima já se via a parede de verdade através do céu quase apagado, e na lâmina o mesmo pedaço de céu chegava inteiro. Perto do horizonte, no planeta rosa, a cúpula está em ~30% e a água estava em 100% — refletindo uma coisa que ali não estava. |
corrigido |
| Os dois polos do céu misturados | As imagens de céu repetiam nos dois eixos. No horizontal está certo — é a longitude, e ela dá a volta. No vertical não: é a latitude, e os extremos dela não são vizinhos, um é o zênite e o outro é o nadir. Repetindo, o filtro mistura os dois: o que está em cima da cabeça recebe uma parte do que está debaixo dos pés. Com mipmap piora, porque no nível reduzido cada texel cobre uma faixa larga de latitude. Saía um halo pálido bem no alto da cúpula. | corrigido |
| A água refletindo outro céu | A água lia direto o céu de destino. Fora da travessia dá no mesmo. Mas durante os seis segundos de passagem o espelho ia na frente: em cima o céu cósmico ainda cedia, e na lâmina o rosa já estava inteiro. Um reflexo que discorda do que reflete é o tipo de erro que ninguém sabe nomear e todo mundo sente — e caía exatamente na entrada do planeta rosa, que é onde a água existe. | corrigido |
| Recorte nascendo opaco | As quatro figuras nasciam de um pixel RGB — e RGB não tem alfa, então o shader lia alfa 1. Enquanto a imagem não decodificava, a figura desenhava como um quadrado opaco no lugar dela. Milissegundos no computador, mas o arquivo tem quase seis megabytes e no headset a decodificação demora. Agora nascem transparentes: antes de carregar, a figura não existe em vez de existir errada. | corrigido |
| Unidade de textura solta no carregamento | bindTexture liga na unidade ativa no momento, e o carregamento termina quando a imagem decodifica — que pode ser no meio de um quadro, com a unidade onde o laço de desenho deixou. Ligar ali substitui a textura que o desenho estava usando, e sai um quadro com a pele errada no planeta. |
corrigido |
| Textura que falha em silêncio | Não havia tratamento de erro: uma imagem que não carregasse ficava como cor chapada, sem uma palavra em lugar nenhum — e cor chapada num cenário escuro passa despercebida até alguém reparar que falta uma coisa. | corrigido |
| Tempo contado em quadros | relogio += 1/60 supõe 60 quadros por segundo. Numa máquina a 30 a obra rodava na metade da velocidade; no Quest, a 72, mais rápido. Os dez minutos deixariam de ser dez minutos. |
corrigido |
| Suavização por quadro | A travessia entre cenários ficava mais lenta em máquina lenta — o oposto do que se quer. A conta certa é 1 − e^(−k·dt). |
corrigido |
| Relógio sem limite | Num dia de exposição chega às dezenas de milhares. O float do shader perde as casas que fazem o movimento ser suave e as animações começam a tremer. Agora zera junto com a volta da obra. |
corrigido |
| Texturas sem mipmap | Uma imagem de 2048×1024 vista de raspão faz a placa buscar texels distantes a cada pixel: o cache nunca acerta. E cintila, porque cada pixel pega um texel sorteado em vez da média da região que cobre — a mesma causa do serrilhado. | corrigido |
| Precisão de uniforme diferente entre os dois estágios | No shader de vértice float é highp por padrão; no de fragmento é a precisão declarada no topo. Não batendo, o programa não linka — e não linkar não aparece como erro de shader: o desenho simplesmente não acontece. |
corrigido |
| Constante usada antes de existir | Um bloco que roda ao carregar usando um const declarado mais abaixo. O console diz apenas "Cannot access before initialization", e a página inteira morre. |
corrigido |
| Constante de shader não declarada | PI usado num shader onde só existia PI2. O GLSL não herda nada entre shaders: cada um é um programa fechado. |
corrigido |
| Nome declarado duas vezes | Aconteceu três vezes — tocando, suave, locA. Mata a página com "already been declared" antes de qualquer coisa rodar. |
corrigido |
| Crase perdida num comentário | Aconteceu quatro vezes. Uma crase num comentário fecha o template literal do JavaScript no meio e quebra o arquivo inteiro, com o erro aparecendo longe dali. | corrigido |
Todos esses agora são achados antes de montar. O
fontes/verificar.py roda em um segundo e procura cada um
deles no código. Os quatro últimos da tabela ele já pegou sozinho,
antes de irem ao navegador.
Não é zelo abstrato: são exatamente os erros que esta obra produz, aprendidos um a um enquanto ela era feita.
O que ainda pode quebrar
Em ordem de gravidade. Os dois primeiros derrubam a obra.
A lição do dia 06/09: o passthrough é um ambiente diferente, não uma janela para o mesmo. Ali o alfa deixa de ser um detalhe e passa a ser o canal que decide se a obra existe. Nada visto no computador prova coisa alguma sobre o headset — e o contrário também vale.
| o risco | por quê, e o que fazer | |
|---|---|---|
| Rastreamento de mão no escuro | O Quest se localiza por visão, e a mão nua é a primeira coisa a falhar com pouca luz. Toda a interação depende dela. Teste de vinte minutos, sem programação: montar 3 × 3 na luz pretendida, pôr o capacete, mexer as mãos por dois minutos. | derruba |
| Preenchimento de tela | A nuvem pinta a tela várias vezes, a água cobre metade da vista, e as camadas de papel são sete planos sobrepostos. No Quest são dois olhos e nove milhões de pixels. O alvo é 72, pedido explicitamente ao aparelho. Cair disso não faz mal a ninguém — o timewarp segura o mundo no lugar mesmo a 36 — mas faz a animação andar aos trancos e deixa rastro em volta do que se move. É o número que decide quanto ainda cabe. | medir |
| Vídeo no headset | Um vídeo por cenário, nunca dois ao mesmo tempo — e os cenários são separados no tempo, então isso vem de graça. O decodificador do Quest aguenta isso sem esforço. O que sobra de risco não é o número: é o instante da troca. Vídeo criado na hora engasga; vídeo já carregado e pausado, só recebendo play, não. | resolvido no projeto |
| O capacete perder o espaço | Ele reconhece o lugar por visão. Estande escuro, banner trocado, luz do dia virando noite — e ele pede Space Setup no meio da fila. Marcas fixas e acesas reduzem; e há a rede de segurança de apontar para o chão. | montagem |
| LED com cintilação | Dimmer barato pisca rápido demais para o olho e devagar demais para as câmeras: vira tremor no rastreamento. Driver sem cintilação, ou brilho pleno. | montagem |
| As figuras são chapas | Passaram a girar só em torno do próprio eixo vertical. Antes encaravam a câmera inteira: ao olhar para cima elas deitavam junto, e chapa deitada atravessa o chão e corta o que estiver ao lado. Agora se comportam como recorte de teatro em pé — e giram para a posição da pessoa, não para o plano da tela, então quem está de lado vê a figura virada para si. O centro nunca sai do lugar; só a face muda. | corrigido |
| Recorte por luminância perde o escuro | A borboleta quase sumiu: as asas dela são pretas com anel branco, e recorte por luz apaga preto. Foi ajustada à mão. Qualquer figura nova com parte escura terá o mesmo problema. | saber |
| Memória de textura | Três céus de 2048×1024, oito peles, quatro figuras, a folha de papel — com mipmap, um terço a mais. As seis peles novas levaram o arquivo de 5,9 para 7,2 MB. Cabe num Quest 3, mas a folga encolheu. | medir |
| A volta dos dez minutos | No fim tudo se desmancha e o relógio zera. A descontinuidade cai exatamente aí, que é onde não aparece — mas só se ninguém estiver olhando uma coisa que atravesse esse instante. | conferir |
Travamento e serrilhado
As duas famílias que mais aparecem em 3D em tempo real, com o que causa cada uma e o que fazer.
O número no canto da tela é um orçamento, não um enfeite. Cada coisa nova consome uma parte dele.
Mas 60 não é o número, e enjoo não é o risco. O Quest 3 não tem modo de 60: ele roda a 72 quadros por segundo. Chegar a 72 quer dizer que nenhum quadro precisou ser remendado.
E há uma rede de segurança embaixo disso. O compositor do headset guarda o último quadro desenhado e o reposiciona para onde a cabeça está agora, no instante de mostrar. Chama-se timewarp, é sempre ligado e não depende do nosso código. Por isso, se a obra cair para 36, o mundo não escorrega junto com a cabeça: o que fica pesado é a animação — a nuvem anda aos trancos, as partículas saltam, e coisa em movimento ganha rastro. Fica feio, não fica enjoativo.
O que dá enjoo mesmo é outra coisa: mover a câmera sem a pessoa ter se movido. É o descompasso entre o que o ouvido interno sente e o que o olho vê — e é de longe a maior causa de mal-estar em realidade virtual. Esta obra não faz isso em lugar nenhum. Quem anda é a pessoa, com as próprias pernas, dentro dos 3 × 3. A causa principal está fora do projeto por construção, não por cuidado.
Sobra um risco real de mal-estar, e não é de quadros: se o rastreamento perder a sala, o mundo desliza sozinho por baixo dos pés. Aí sim passa mal. Por isso a luz do estande decide mais do que qualquer otimização de código.
Decidido: 72 é o alvo, e agora é pedido. O Quest sabe rodar a 72, 90 e 120, e sem pedir nada o navegador escolhe. Se ele escolher 90, a obra passa a ter 11 ms por quadro em vez de 13,9 — 25% a mais de trabalho para uma peça que não ganha nada com isso: aqui ninguém corre, ninguém mira, não há nada rápido o bastante para 90 mostrar e 72 esconder. Pedindo 72, esses 25% viram folga, que é exatamente o que falta para a nuvem, a água e as sete camadas de papel.
O medidor passou a mostrar o número contra o alvo — 68 / 72
em vez de 68 fps — e fica laranja abaixo de metade do alvo.
Metade é a linha certa e não é arbitrária: abaixo dela o compositor mostra
o mesmo quadro duas vezes seguidas, o timewarp deixa de disfarçar, e o
que se move ganha rastro visível. É onde a obra deixa de parecer inteira —
não onde alguém passa mal.
| travamento — a causa | como resolver | |
|---|---|---|
| Preenchimento de tela | A nuvem, a água e as camadas pintam a tela inteira, várias vezes por quadro. É a causa número um, e a que mais cresce no headset — lá são dois olhos e nove milhões de pixels. Menos camadas, menos alcance, ou desenhar em resolução menor quando os quadros caem. | medir |
| Coleta de lixo | Alocar memória a cada quadro faz o JavaScript juntar e recolher tudo de uma vez, e essa parada aparece como engasgo periódico — o travamento mais difícil de diagnosticar, porque não tem relação com o que está na tela. Eram nove alocações por quadro só para a matriz. | corrigido |
| Textura sem mipmap | Imagem grande vista de raspão faz a placa buscar texels distantes a cada pixel, e o cache nunca acerta. Custa caro e cintila. | corrigido |
| A troca de vídeo | Nunca há dois tocando: é um por cenário, e os cenários não se sobrepõem. O engasgo mora na troca — criar o elemento na hora custa; tê-lo carregado e pausado, esperando o play, não custa nada. | ao construir |
| Engasgo virando salto | Se a máquina travar meio segundo, o relógio não pode avançar meio segundo de narrativa de uma vez. Há um teto de 0,1 s por quadro: a peça pausa em vez de pular. | corrigido |
| Trocar de programa demais | Cada troca custa. Hoje são oito por quadro, o que é pouco — mas cada objeto novo com shader próprio soma aqui. | observar |
| serrilhado — a causa | como resolver | |
|---|---|---|
| Geometria fina vista de raspão | Uma fita ou folha vista quase de lado comprime um trecho enorme do desenho em poucos pixels: o que aparece não é desenho, é ruído. Nenhum ajuste de frequência resolve — a saída é sumir com a coisa justamente ali, ou não ter superfície nenhuma. Foi por isso que a nuvem deixou de ser fita e virou maço. | corrigido |
| Borda de recorte com corte duro | Alfa que salta de 0 para 1 num pixel dá serra. Todas as bordas da obra caem por smoothstep, que chega e sai com inclinação zero — não há onde o olho engatar. |
corrigido |
| Textura sem mipmap | Cada pixel pega um texel sorteado em vez da média da região que cobre. É a mesma causa do custo alto, e some com a mesma correção. | corrigido |
| Transparência escrevendo profundidade | Um objeto semitransparente que escreve profundidade apaga o que está atrás dele — e o que aparece é um recorte duro no meio da imagem. Na obra, só quem é corpo escreve, e só quando já está opaco. | corrigido |
| Mipmap em imagem com alfa | Reduzir uma imagem recortada borra a cor para dentro do transparente e deixa halo escuro em volta da figura — o defeito mais comum de recorte em 3D. Por isso as figuras carregam sem mipmap e sem pré-multiplicação. | corrigido |
| Suavização do headset | A camada do Quest agora pede suavização explicitamente. É o remédio direto para as bordas finas que sobrarem. | corrigido |
| Sorteio quebrado por precisão | Já aconteceu: a função que sorteia o ruído fazia fract() de multiplicações na casa dos milhares, e float não guarda casas suficientes ali. O resultado deixava de ser aleatório e virava degrau — chuvisco em blocos que nenhum ajuste de frequência corrigia. |
corrigido |
Possibilidades
O que faria a obra melhor, com o custo ao lado. Nenhuma é necessária para ela funcionar.
| a melhoria | o que muda | custo |
|---|---|---|
| Céu do planeta rosa só no hemisfério de cima | Fui medir com o degradê real de cada cenário, e o número certo não é metade. O céu começa a existir a 0,84 m no planeta rosa, então a parte da imagem que nunca é lida ali é de 39% — e nos outros três fica entre 29% e 32%. Ainda é bastante, mas é menos do que eu tinha dito. E eu errei ao dizer que a resolução dobraria — fui conferir os arquivos de origem e eles têm 1536 × 768, menores que os 2048 × 1024 do céu montado. Não há detalhe escondido para recuperar; remapear só esticaria os mesmos pixels. O ganho existe, mas depende de material novo, não de código: quando o céu marmorizado e estrelado sair do Midjourney, aí sim vale mapear só na metade que se vê — e aí a nitidez dobra de verdade. | depende do MJ |
| As deusas em vídeo | Hoje são imagens paradas com balanço. Em vídeo, em bumerangue, elas respiram — e o roteiro pede isso. Um por cenário, carregado antes e só recebendo play na hora. | ~3 h |
| Filtragem anisotrópica | Feita. O mipmap resolve o cintilar borrando: de raspão os dois eixos da imagem se comprimem de forma muito diferente, e obrigado a um nível único o hardware escolhe pelo eixo pior e borra também o eixo que estava bom. É por isso que o céu, já com mipmap, fica nítido em cima e lavado na linha do horizonte. Com anisotropia a placa tira várias amostras ao longo do eixo comprimido: o cintilar continua resolvido e a nitidez volta — na cúpula perto do horizonte e na água vista rasante. | feito · 4× |
| Resolução que cede sozinha | Quando os quadros caem, reduzir a resolução de desenho em vez de engasgar. Troca nitidez por fluidez — e é mais barato baixar a resolução do que cortar uma camada da obra. | ~2 h |
| A mão gigante | O roteiro pede uma mão que vem e puxa para o buraco negro. Não existe quadro dela na Odara — precisa de imagem, ou de outra ideia para a passagem. | falta imagem |
| A oclusão do app do Plinio | A malha do cômodo desenhada só em profundidade faz uma árvore atrás do sofá ficar atrás do sofá. É o maior ganho de integração possível em realidade mista. | ~4 h |
| Som por cenário | O cenas.js do Plinio tem um tom por cenário. Somado à trilha, daria a cada lugar uma cor de som própria. |
~2 h |
| As interações | O casulo está vivo: respira enquanto pode ser tocado, e encostar nele adianta a partitura até a borboleta. Mão nua e controle Touch chegam pelo mesmo caminho. Faltam a segunda janela (pegar um planeta) e a terceira (os seres do mar). | 1 de 3 feita |