flowchart LR
subgraph T[Translacao: onde o corpo esta]
T1[deslocamento<br/>no eixo lateral]
T2[deslocamento<br/>no eixo vertical]
T3[deslocamento<br/>no eixo frontal]
end
subgraph R[Rotacao: para onde ele aponta]
R1[giro em torno<br/>do eixo lateral]
R2[giro em torno<br/>do eixo vertical]
R3[giro em torno<br/>do eixo frontal]
end
R --> A[Aparelho de tres graus:<br/>estima so a metade de cima]
T --> B[Aparelho de seis graus:<br/>estima as duas metades]
R --> B
1 Dispositivos, rastreamento e graus de liberdade — Resumo
Versão de revisão. Esta é a passagem rápida por como um aparelho descobre onde está, na ordem em que o capítulo constrói a resposta. O desenvolvimento longo, com as demonstrações completas, está na versão integral deste capítulo e no capítulo correspondente do livro. Leia com um aparelho concreto em mente — o celular do seu bolso serve — e pergunte a cada seção o que ele responderia.
O capítulo termina com um programa que não desenha nada, e é esse o argumento dele. Antes de existir cena, existe uma pergunta de sensor.
1.1 Um passo à frente, e a imagem fica onde estava
Seis números descrevem qualquer corpo sólido no espaço, e o aparelho que acompanha só três deles produz mal-estar em minutos.
Vista um visor barato e dê um passo à frente. Seu corpo avança meio metro. O ouvido interno registra a aceleração desse avanço e avisa ao cérebro que houve deslocamento. Seus olhos, dentro do visor, veem uma cena que não se aproximou de nada. Duas informações incompatíveis sobre o mesmo evento, e nenhum árbitro para decidir qual delas mente.
Esse desconforto não se conserta com mais quadros por segundo. Também não melhora com textura caprichada nem com iluminação melhor. A causa é um sensor que não está dentro do aparelho, e software nenhum alcança isso. JERALD trata o mecanismo em detalhe, e a literatura de fatores humanos o documenta há décadas. Guarde a frase na forma estreita: o problema é de grau rastreado a menos, não de acabamento gráfico.
O caso é bem mais velho que os visores baratos. Em 1968, Ivan Sutherland montou o primeiro visor acoplado à cabeça, e ele pesava demais para ser usado como se usa um chapéu. A saída foi pendurá-lo no teto do laboratório por um braço mecânico articulado. A peça suspensa sobre quem sentava embaixo rendeu ao conjunto o apelido de espada de Dâmocles. O que aquilo exibia eram arestas de arame, sem cor e sem superfície.
Só que o braço não estava ali apenas para segurar peso. Cada junta articulada informava um ângulo, e da combinação dos ângulos saía onde a cabeça estava e para onde ela apontava. O primeiro visor da área já respondia à pergunta de posição, e respondia com engenharia mecânica. Quase sessenta anos depois, um visor de três graus não responde a ela. Em compensação, cabe na mochila.
Segure um livro à sua frente e conte de quantas maneiras dá para mexê-lo. Três deslocamentos e três giros, e não existe uma sétima. Os giros herdaram nomes da navegação: rolagem, arfagem e guinada. A pose de um corpo é o par formado por essa rotação e por essa translação. Onde a xícara está no tampo, mais para que lado a alça aponta. Note o que a definição não pede: nada sobre a precisão com que a pose é conhecida.
Por que um fabricante deixaria metade dos graus de fora? Rotação se mede com sensores inerciais pequenos e baratos, e a leitura se estabiliza em fração de segundo. Translação é outra história. Da aceleração até a posição vão duas integrações seguidas, e cada uma amplifica o erro da anterior. O aparelho passa a acreditar que desliza enquanto está parado. Medir deslocamento com confiança exige olhar para o mundo, e isso significa câmera, processamento e bateria.
1.2 Quem olha para quem
Há dois lugares possíveis para os sensores, e a escolha entre eles decide de que jeito o rastreamento quebra.
O braço de Sutherland pertence a uma família que ainda existe. Nela a sala é instrumentada: equipamentos fixos, montados em posições conhecidas, observam o aparelho e calculam onde ele está. As juntas articuladas viraram meios ópticos, e o princípio geométrico ficou intacto desde 1968. A outra família inverte tudo e põe os sensores dentro do próprio aparelho, olhando para fora.
Comece pelo que o arranjo de dentro para fora dispensa, que é instalação. Tira-se o aparelho da caixa, veste-se, e ele funciona em qualquer sala. Nada a montar. Nenhum alinhamento a conferir, nenhum cabo atravessando o chão. Para um produto vendido a quem não é técnico, isso decide entre existir mercado e não existir.
A conta chega na palavra qualquer. Ele funciona em qualquer sala que ofereça o que ele precisa, e o que ele precisa é textura visual. Parede branca e lisa não tem canto algum a reconhecer, e luz fraca não dá contraste para separar um elemento do outro. Há ainda uma dependência fácil de esquecer: o arranjo pressupõe que o ambiente fique parado.
Uma cortina balançando. Uma televisão ligada. Um grupo de pessoas circulando pela sala. O aparelho reconhece elementos que se movem sozinhos. E conclui que quem se moveu foi ele. Então corrige uma posição que estava certa, guiado por uma referência que trocou de lugar sem avisar. O sintoma é a imagem deslizando sozinha, e a causa está num lugar onde nenhuma linha de código do ambiente alcança.
O arranjo de fora para dentro compra uma propriedade que a outra família não tem. A medida não é incremental: cada leitura é feita contra a referência fixa, e não contra a leitura anterior, então os erros não se acumulam. Um sistema desses roda horas sem derivar. Não há de que derivar. Em troca, ele é da sala, e não do aparelho.
| Aspecto | De dentro para fora | De fora para dentro |
|---|---|---|
| Instalação | nenhuma | montagem e alinhamento prévios |
| Área útil | onde houver textura e luz | onde o equipamento fixo alcança |
| Acúmulo de erro | incremental, sujeito a deriva | absoluto, sem acúmulo |
| Falha típica | ambiente liso, luz baixa, cena que se move | linha de visão obstruída |
| Portabilidade | total | nenhuma |
flowchart TD
P{De onde parte<br/>a observacao?} -- Da sala fixa --> E[Infraestrutura externa]
P -- Do proprio aparelho --> S[Sensores embarcados]
E --> E1[Medida que nao deriva]
E --> E2[Fronteira nitida:<br/>fora da area, nao existe]
S --> S1[Depende da aparencia<br/>do ambiente]
S --> S2[Sem fronteira:<br/>fora da area, funciona pior]
E1 --> C[A pose chega igual<br/>nos dois casos]
S1 --> C
C --> D[A diferenca so aparece<br/>no dia da falha]
Duas linhas dessa tabela apontam para lados opostos, e não é coincidência. A ausência de acúmulo vem de existir uma referência fixa, e referência fixa é justamente o que impede o sistema de ser portátil. Sutherland fez essa troca em 1968, e ela continua de pé. Do lado do código, porém, os dois arranjos chegam idênticos: a pose vem com o mesmo formato e o mesmo significado. Saber qual deles está em uso só ajuda no dia em que ela deixa de vir.
1.3 O cartógrafo no escuro
Uma pessoa no escuro, com uma lanterna fraca, precisa desenhar a planta da casa enquanto anda por ela — e o visor faz literalmente isso.
Imagine alguém deixado numa casa desconhecida, sem luz, com uma lanterna fraca e a incumbência de desenhar a planta baixa. Ela não pode acender as lâmpadas. Não recebeu mapa nenhum e não sabe por qual porta entrou. Precisa andar pelos cômodos e desenhar o que encontra. O desenho é a única memória de onde ela já esteve.
É o problema exato que um aparelho de rastreamento autônomo enfrenta ao ser ligado numa sala nova. A formulação é curta. O aparelho desenha a planta da sala enquanto atravessa a sala, e corrige o desenho toda vez que reconhece um canto por onde já passou.
Por que isso é difícil? Nenhuma das duas tarefas é difícil sozinha. Com a planta na mão, localizar-se seria comparar o que a lanterna ilumina com o desenho. Sabendo a posição a cada instante, desenhar a planta seria anotar o que se vê. O problema é não haver nenhuma das duas: cada informação é pré-requisito da outra.
A saída é estimar as duas juntas, aceitando que as duas fiquem aproximadas. Avança-se um passo, estima-se quanto se avançou, anota-se o que se vê da posição estimada, e repete. O mapa cresce com erro embutido, e a posição carrega o mesmo erro, porque um foi calculado a partir do outro. Daí a palavra simultâneos: as duas metades são um cálculo só, e o erro de cada passo se soma ao dos anteriores.
flowchart LR
A[Observar o ambiente<br/>no quadro atual] --> B[Reconhecer pontos<br/>distintos na imagem]
B --> C[Estimar o movimento<br/>desde o quadro anterior]
C --> D[Atualizar a posicao<br/>estimada de quem observa]
D --> E[Acrescentar ao mapa<br/>os pontos ainda nao vistos]
E --> F{Algum ponto ja<br/>estava no mapa?}
F -- nao --> A
F -- sim --> G[Redistribuir o erro<br/>acumulado no percurso]
G --> A
A correção vem de um evento específico. A pessoa reconhece uma quina que já tinha desenhado. Ela sabe onde essa quina está no desenho, e vê onde ela está agora em relação ao próprio corpo. Se as duas coisas discordam, ou o desenho está errado, ou a posição está errada — dá no mesmo, porque foram calculados juntos. Aí o sistema redistribui a discrepância por todo o percurso feito desde a última passagem por ali, como quem puxa uma corda frouxa pelas duas pontas.
Isso desarma quem espera de um sensor o comportamento de um relógio. A posição informada não tem o estatuto de uma medida de régua: é a melhor estimativa disponível ali, sujeita a revisão retroativa. É por isso que existe a âncora, e aqui ela deixa de ser item de catálogo. Ancorar não é anotar coordenadas. É pedir que o aparelho mantenha o objeto preso a um ponto do mapa e corrija as coordenadas sozinho quando o mapa mudar.
Uma figura com prazo de validade. O cartógrafo no escuro descreve bem o que acontece quando o aparelho precisa descobrir o ambiente sozinho. Ela vai deixar de valer mais adiante, no ponto em que o registro passa a se apoiar num padrão impresso conhecido de antemão. Ali não há planta a desenhar nem canto a reconhecer: há um gabarito que o sistema já sabia como era antes de a câmera ser ligada. Quando chegarmos lá, vou dizer que a figura acabou.
Se todo o edifício se apoia em reconhecer pontos distintos, o que acontece quando não há pontos distintos? São três as condições que derrubam o rastreamento. A superfície sem textura, em que uma região uniforme deslocada continua parecendo a mesma região uniforme. A iluminação pobre, e aqui vale a distinção: o que atrapalha é a falta de contraste, de modo que uma sala escura com uma janela clara ao fundo é melhor que uma sala mal iluminada por inteiro. E o movimento brusco, porque a câmera integra luz durante um intervalo e o ponto distinto se espalha pela imagem.
Nenhuma das três é visível para o código. Não existe sensor de textura a consultar nem medidor de luz da sala. O que existe é uma consequência única e observável: a cada quadro o ambiente pede a pose, e quando o aparelho perdeu a conta de onde está, ela não vem. A primeira reação de quem encontra um quadro sem pose é procurar defeito no próprio código, e essa procura consome horas.
Contar essas ausências transforma impressão em medida. Mas qual das três condições causou a perda? Daqui não se sabe: as três produzem o mesmo sintoma. Prefiro o relatório que nomeia as três causas prováveis e declara que não as distingue, e a razão é prática — ele manda a pessoa certa olhar para os três lugares certos. Quem escreve “degradado por iluminação insuficiente” inventou o laudo junto com a medida, e alguém vai acender uma lâmpada para resolver o que era a parede lisa.
1.4 Nenhuma plataforma diz quantos graus ela rastreia
A pergunta mais natural sobre um aparelho não tem resposta na interface de programação, e a ausência foi decidida em vez de esquecida.
Sabendo que graus de liberdade preveem desconforto, a pergunta se impõe sozinha. Quantos este aparelho acompanha, e onde se lê esse número? Em lugar nenhum. Nas plataformas de hoje não há propriedade, consulta nem campo que informe isso. E não foi descuido: o navegador não conversa com o sensor, não sabe que sensores existem dentro do aparelho e não tem como auditá-los.
O que a plataforma entrega no lugar são espaços de referência. Pedir um deles é pedir uma promessa específica. Que as poses venham medidas a partir do chão do ambiente. Que venham medidas a partir de onde a pessoa estava quando a sessão começou. Ou que venham medidas a partir da própria cabeça de quem observa. Conceder um espaço é afirmar que essa relação pode ser mantida coerente ao longo da sessão.
Aí mora a inferência que salva o problema. Um espaço ancorado no chão exige saber onde o chão está em relação a quem observa, e essa relação muda quando a pessoa anda. Um aparelho que apenas gira não sustenta a promessa, porque não sabe que a pessoa andou. Conceder o espaço com chão é, portanto, evidência forte de que há posição rastreada.
flowchart TD
A[Pedir espacos<br/>de referencia] --> B{Qual foi<br/>concedido?}
B -- So o que acompanha<br/>quem observa --> C[Tres graus]
B -- O ancorado<br/>no chao --> D[Seis graus]
B -- So o intermediario --> E[Indeterminado]
E --> F[Escrever nao da para saber daqui,<br/>em vez de apostar no mais provavel]
O caso do meio é genuinamente ambíguo. Origem próxima de quem observa no início da sessão é compatível com três graus e com seis, e nada mais na sessão desempata. A tentação é apostar no mais provável, já que hoje a maioria dos aparelhos que chega até aí acompanha seis. Não apostamos. Um relatório que afirma seis graus com evidência fraca vai ser citado como se fosse medida, e o engano aparece no dia da demonstração, num aparelho diferente.
E por que não ler simplesmente o nome do aparelho? O navegador expõe uma cadeia de identificação, e o caminho é usado em código de produção. Ele falha de três maneiras conhecidas: a cadeia é editável, é imitada de propósito por aparelhos que querem receber o mesmo conteúdo, e envelhece a cada modelo novo. O problema mais fundo, porém, não é de manutenção. O nome descreve o que o aparelho faz em condições de fábrica, e um visor de seis graus com a câmera obstruída continua tendo o mesmo nome.
1.5 Silêncio não é a mesma coisa que não
Três respostas chegam pelo mesmo canal, e confundir duas delas produz um relatório alinhado, completo e falso.
Além dos espaços, a plataforma expõe uma segunda família de perguntas: recursos opcionais pedidos ao abrir a sessão. Lançar raio contra superfícies reais, receber os planos reconhecidos, prender objetos a âncoras corrigidas, acompanhar a pose das mãos. O ambiente pede o que quer usar. O aparelho concede o que consegue. Um computador de mesa sem câmera não faz detecção de superfície real; já um visor capaz pode ter tido a permissão recusada.
flowchart TD
A[Recurso pedido<br/>ao abrir a sessao] --> B{A sessao declarou<br/>a lista do que ligou?}
B -- Nao ha lista --> I[Indeterminado:<br/>nao houve resposta]
B -- Ha lista --> C{O nome consta<br/>dela?}
C -- Sim --> G[Concedido]
C -- Nao --> N[Negado:<br/>houve resposta, e foi nao]
I --> X[Tratar como negado<br/>afirma o que o aparelho nunca disse]
Do lado de quem escreve o código, os dois casos chegam idênticos, e a plataforma não distingue de propósito — informar o motivo da recusa vazaria a configuração de quem usa. A distinção precisa ser construída à mão, com três estados em vez de dois.
export type EstadoDeRecurso = 'concedido' | 'negado' | 'indeterminado';
export function estadoDoRecurso(
nome: string,
concedidos: readonly string[] | undefined,
): EstadoDeRecurso {
if (concedidos === undefined) {
return 'indeterminado';
}
return concedidos.includes(nome) ? 'concedido' : 'negado';
}O terceiro estado é o que evita o erro caro. A lista de concessões é opcional na especificação, então um navegador competente pode entrar em sessão sem dizer o que ligou. Sem o estado indeterminado, ele aparece no relatório como aparelho que negou tudo: tabela preenchida, alinhada e falsa.
Falta decidir quantos recursos entram no pedido, e a tentação é pedir tudo. Informação a mais não custa nada, diz o raciocínio. Ele erra por duas razões. A primeira é tempo: cada item entra na negociação de abertura, e quem está de visor não vê barra de carregamento — vê o mundo demorando a existir. A segunda decide a questão. Alguns recursos exigem um dicionário de configuração próprio no pedido, e um pedido malformado não devolve recurso negado: derruba a sessão inteira, junto com tudo o mais que a sondagem teria descoberto.
Daí a regra conservadora. Só entra no catálogo o recurso de que algum ponto do percurso depende. O motivo de cada omissão fica escrito ao lado. A próxima pessoa a ler aquilo vai querer acrescentar o que falta, e merece saber que a ausência foi decidida. O efeito colateral convém aceitar de olhos abertos: o relatório retrata o encontro entre aquele aparelho e este ambiente, e não o aparelho por inteiro.
1.6 O relatório que ninguém consegue ler de dentro do visor
Toda essa informação é inútil se ela aparecer num lugar que quem está com o aparelho no rosto não consegue abrir.
Suponha resolvido tudo o que veio até aqui. O ambiente consulta os espaços, infere os graus com prudência, classifica cada recurso em três estados e conta os quadros sem pose. Onde esse resultado aparece? A resposta natural de quem programa para a web é o console de depuração. Ela funciona para uma pessoa só: quem está sentada diante do computador em que o código foi escrito.
A cena se repete com quase todo mundo que constrói um ambiente pela primeira vez. Alguém escreve o programa, testa no computador, envia para o visor e toca o botão. Nada acontece. O botão parece quebrado, e a busca começa pelo tratador do evento, que está correto. Houve uma recusa, informada por um canal que ninguém dentro do visor consegue consultar.
São três as recusas que acontecem de verdade, e cada uma pede uma ação diferente. O aparelho pode não sustentar o modo pedido, e aí resta usar outro regime. O pedido pode ter partido sem gesto de quem usa, ou fora de conexão cifrada, e aí a correção é de quem escreveu. E pode já haver uma sessão aberta, resquício de uma tentativa que não encerrou. Pior que exibir o erro cru é capturá-lo e não mostrar nada: de fora tudo parece bem, e de dentro do visor há um botão que não reage.
Há uma armadilha que produz relatório perfeitamente coerente e inteiramente errado. As capacidades imersivas só são expostas em conexão cifrada, e numa página servida sem cifragem a interface simplesmente não está lá. O visor mais capaz da sala, aberto no endereço errado, produz o relatório de um computador antigo. A defesa cabe numa linha, escrita antes de qualquer outra informação: o que vem abaixo é informação sobre o aparelho, ou sobre o endereço?
flowchart TD
A[Vocabulario que descreve<br/>capacidade sem citar marca] --> S[Saldo do capitulo]
B[Consulta feita de verdade<br/>no lugar de suposicao] --> S
C[Distincao entre negado<br/>e sem resposta] --> S
D[Sintoma medivel<br/>de perda de rastreamento] --> S
S --> P{O que continua<br/>sem resposta?}
P --> P1[Escala e alcance de braco]
P --> P2[Taxa de quadros sob carga]
P --> P3[Conforto em uso prolongado]
P1 --> N[Nada disso se responde<br/>sem desenhar nada:<br/>o proximo passo e a cena]
P2 --> N
P3 --> N
O inventário fecha em cinco caixas que não citam marca nem modelo, e por isso não envelhecem com o próximo lançamento. O aparelho sem a interface disponível. O que só sustenta o regime de janela, caso do computador de mesa e caso base de todo o percurso. O visor que gira e não anda, e o que acompanha o corpo pelo ambiente. E o que sustenta o regime aumentado sem o imersivo completo, que é a descrição exata do celular.
Declarar o que a classificação não promete é o que impede que ela seja usada onde não vale. Ela diz o que o aparelho faz, e nada além. Não diz se ele é confortável, se roda bem nem se a imagem é nítida. A ausência mais sentida é a qualidade do rastreamento. Dois visores que acompanham translação, um com precisão excelente e outro mal, caem na mesma caixa. A concessão do espaço é a mesma nos dois. Isso não é limitação a corrigir depois — promessa declarada não vem com métrica de cumprimento.
O que fica pronto, então, é uma consulta honesta sobre o aparelho. O que falta é qualquer coisa a desenhar nele. Cada capacidade sondada aqui deixa de ser linha de relatório e vira decisão de projeto: o espaço concedido escolhe onde nasce a origem do mundo, e os graus inferidos escolhem que movimentos podem ser pedidos. Sabendo onde o observador está, como se organiza aquilo que ele vai ver? A resposta é uma estrutura de dados, e ela é mais velha que qualquer visor citado aqui.