E57, explicado: o "PDF das nuvens de pontos"
Imagine fotografar uma sala — mas, em vez de capturar uma imagem plana, você registra a posição exata de um milhão de pequenos pontos que cobrem cada parede, cadeira e caneca. Faça um laser girar rápido o bastante e meça a distância até tudo ao redor: o resultado é uma nuvem de pontos, uma "fotografia" 3D formada por pontos medidos. Este é um guia acessível e sem jargão sobre o que realmente existe dentro de um arquivo E57 — e um truque interessante que nosso próprio software faz com ele.
Por que um formato especial, afinal?
Uma foto comum é apenas uma grade de pixels coloridos — simples. Um escaneamento 3D é mais complexo. Para cada um de seus milhões de pontos, é preciso armazenar onde ele está no espaço (três números: X, Y, Z), qual é sua cor, com que intensidade o feixe de laser retornou (sua intensidade — pense em uma "foto a laser" em preto e branco) e, muitas vezes, as fotos panorâmicas capturadas pelo scanner ao mesmo tempo.
Agora imagine que uma pessoa escaneie com um Faro, um colega use um Leica e o cliente abra o resultado em um software da Autodesk. São três equipamentos e três programas — e todos precisam ler o mesmo arquivo daqui a vários anos, sem depender de um fabricante para obter um decodificador secreto. Esse é o problema que o E57 resolve. Ele é um padrão aberto e independente de fabricante (publicado como ASTM E2807 e baseado na biblioteca de código aberto libE57). É conhecido como o "PDF das nuvens de pontos": um arquivo portátil que todos concordam em ler da mesma forma.
A grande ideia: um mapa de texto com força binária
Em essência, um arquivo E57 é um híbrido de dois elementos muito diferentes: uma pequena seção em XML — texto simples e legível que funciona como um índice — e grandes blocos de dados binários que contêm milhões de números brutos, armazenados de forma compacta para agilizar o acesso.
Por que colocar o mapa no final? Porque, enquanto um scanner está gravando o arquivo, ele ainda não sabe o tamanho de tudo, então grava primeiro os dados brutos em fluxo contínuo e escreve um resumo organizado quando termina. A vantagem é enorme: para extrair um escaneamento de um arquivo de 20 gigabytes, o software lê o pequeno cabeçalho, pula para o mapa XML, encontra a linha que diz "o escaneamento #3 está no byte 4.812.000.000" e vai direto até lá.
Uma proteção discreta: o arquivo inteiro é dividido em "páginas" de 1.024 bytes, e os últimos 4 bytes de cada página são reservados para uma soma de verificação — uma impressão digital que permite ao software detectar se o arquivo foi corrompido.
Tudo parte de uma única raiz
Abra esse mapa XML e você encontrará uma árvore — exatamente como as pastas no seu computador. Há um único root, e dois ramos fazem a maior parte do trabalho: data3D, uma lista numerada de escaneamentos, e images2D, uma lista numerada de fotos (normalmente os panoramas de 360° que o scanner capturou).
Duas formas de escrever um ponto
Um scanner a laser não trabalha exatamente com X, Y, Z. Ele permanece em um ponto e gira; para cada ponto, conhece três valores: distância (até onde o feixe percorreu), azimute (o ângulo horizontal, para a esquerda ou para a direita) e elevação (o ângulo para cima ou para baixo). Essas são coordenadas esféricas — a linguagem nativa do scanner. A maioria dos softwares, porém, prefere as coordenadas cartesianas X, Y, Z. O E57 armazena qualquer uma das duas, e a conversão entre elas exige apenas algumas contas rápidas de trigonometria.
Três tipos de foto incorporada
As fotos em images2D não são links para arquivos em alguma pasta — a própria imagem JPEG ou PNG está guardada dentro do E57. E há mais de um tipo de foto incorporada. O E57 envolve cada uma em uma "representação" que diz ao software o quanto ele pode confiar na imagem do ponto de vista geométrico. A diferença se resume a uma única pergunta: quão completa é a descrição da câmera?
sphericalRepresentation— um panorama completo de 360° × 180°, a conhecida imagem equirectangular alongada na proporção 2:1. Como a projeção é conhecida, cada pixel corresponde a uma direção exata, permitindo o alinhamento perfeito com a nuvem de pontos. Esse é o principal fluxo do nosso pipeline: lemos a imagem, ajustamos suas dimensões para uma proporção exata de 2:1 e a enviamos ao visualizador de panoramas.pinholeRepresentation— uma foto comum feita com uma única lente, descrita pelo clássico modelo de câmera pinhole (distância focal, tamanho do sensor e centro óptico). Isso também basta para que o software determine a direção de cada pixel, mas apenas dentro de um campo de visão mais estreito. Na prática, é principalmente assim que a Leica trabalha: ela grava diretamente no E57 um cubemap pronto — as seis faces planas de um cubo voltadas para fora — e nosso fluxo de processamento de faces do cubo combina exatamente essas imagens em um panorama completo. É um dos casos mais fáceis de converter novamente em uma imagem 360° adequada.visualReferenceRepresentation— uma foto sem nenhum modelo de câmera, descrita explicitamente como "exclusivamente para visualização humana". Não é possível fazer medições com ela nem projetá-la sobre a nuvem de pontos; trata-se apenas de uma imagem de referência. Nosso importador mantém essas imagens como comentários anexados, em vez de posicioná-las em 3D.
Aqui está o problema. sphericalRepresentation é a opção mais popular, mas é surpreendentemente fácil errar de forma sutil — e é exatamente por isso que o mesmo escaneamento pode parecer diferente de um programa para outro.
- As zonas cegas são recortadas. Todo scanner tem uma área que não consegue enxergar — geralmente logo abaixo, onde fica o próprio tripé. Alguns programas de exportação simplesmente recortam o panorama nessa região, deixando uma lacuna ou uma altura fora do padrão.
- Pixels não quadrados. Um panorama correto tem pixels quadrados (
pixelWidth=pixelHeight); alguns arquivos não têm pixels quadrados, por isso a imagem parece esticada até ser redimensionada. - A direção errada é “para a frente”. A rotação armazenada com um panorama indica qual direção fica no centro da imagem, e não há um acordo universal sobre o que “para a frente” sequer significa — alguns exportadores a apontam para o norte, outros para o leste. Um pequeno deslize aqui gira toda a vista.
- As ferramentas de edição podem perder dados. Importar e reexportar um E57 no CloudCompare, por exemplo, pode descartar a posição de captura das imagens
pinholeRepresentation— as fotos permanecem, mas já não sabem onde foram tiradas.
Em resumo, na prática, diferentes softwares costumam exibir o mesmo E57 de formas diferentes. Nosso importador tenta corrigir as peculiaridades mais comuns — redimensionando pixels não quadrados, corrigindo a orientação do panorama e padronizando as dimensões da imagem na proporção 2:1 — para que o tour tenha a aparência correta, independentemente da ferramenta usada para gerar o arquivo.
Quando o panorama é incorporado na própria nuvem de pontos
Aqui está uma das ideias mais elegantes — e menos valorizadas — de todo o formato. Além de panoramas armazenados como imagens separadas, um panorama também pode ficar escondido dentro da própria nuvem de pontos. Um scanner a laser não dispara aleatoriamente — ele percorre uma grade organizada de ângulos, linha por linha, coluna por coluna, como uma TV antiga desenhando uma tela. O E57 pode preservar essa ordem: cada ponto recebe um rowIndex e um columnIndex que indicam de qual célula da grade ele veio. Um escaneamento armazenado assim é chamado de estruturado.
A vantagem: se os pontos estiverem em uma grade, a nuvem já é uma imagem. Leia-a linha por linha e cada ponto cai em um pixel — o panorama é recuperado sem precisar fazer reprojeção alguma. O arquivo até registra o tamanho da grade em seus indexBounds (columnMaximum, rowMaximum), então o software sabe a resolução de antemão — nosso sintetizador obtém a largura de saída diretamente de columnMaximum + 1.
Mas uma grade precisa ser um retângulo perfeito, e o mundo real não é. E quanto às direções em que o feixe foi disparado para o céu aberto e nada voltou? A resposta é pragmática: preencher essas células com pontos fictícios — muitas vezes com uma distância de exatamente 0, ou seja, "feixe enviado, nada atingido". Esses pontos mantêm o retângulo completo, mas não representam geometria real, portanto um leitor atento precisa desconsiderá-los. Nosso software sinaliza todos os pontos de distância zero, posiciona-os a uma distância fictícia muito grande para que os cálculos da grade continuem funcionando e nunca trata esses pontos fantasma do céu como superfícies reais ao criar o mapa de profundidade ou exportar a nuvem.
Transformar novamente um escaneamento em uma foto na qual você pode entrar
Nem todo escaneamento chega em uma grade pronta — alguns são apenas um conjunto solto e não estruturado de pontos. A boa notícia: o panorama ainda pode ser recuperado, e é aqui que o formato se cruza com nosso próprio trabalho. Como um escaneamento é, na verdade, "uma esfera completa de pontos medidos como ângulos em torno de um único ponto", é possível desdobrá-lo em um panorama plano.
Mapeie cada ponto de acordo com o ângulo — da esquerda para a direita ao longo da largura da imagem e de cima para baixo ao longo da altura — e ele cairá em um pixel do conhecido panorama equirectangular alongado na proporção 2:1. O mapa de profundidade é o ingrediente mágico: com uma distância associada a cada pixel, um panorama aparentemente plano se torna mensurável e navegável — clique em dois pontos de uma parede e o software saberá a distância real, pois nunca perdeu os dados 3D por trás da imagem.
Então, por que o E57 é importante?
Porque é o ponto de encontro neutro. Um topógrafo escaneia uma ponte com um equipamento de uma marca, um engenheiro abre os dados em outro software e um arquiteto os arquiva pelos próximos vinte anos — e o E57 é o único arquivo no qual os três podem confiar, sem que nenhum fornecedor detenha as chaves. Ele reúne cor, intensidade, geometria, panoramas e as importantíssimas posições dos sensores em um só lugar, como um padrão aberto que qualquer pessoa pode implementar.
Uma última curiosidade: o horário de captura armazenado em um E57 é contado em tempo GPS — segundos desde 6 de janeiro de 1980, quando a contagem do tempo GPS começou — , e não a partir da época computacional usual, de 1970. Se isso for interpretado incorretamente, um escaneamento feito hoje parecerá ter sido realizado em 2013.
Quer se aprofundar?
- libE57.org — a biblioteca de código aberto de referência e o principal site do formato
- ASTM E2807 — a norma oficial
- libE57Format · Image2D — definições exatas das representações esférica, pinhole e de referência visual
- Paul Bourke’s E57 notes — uma análise técnica concisa do cabeçalho e da estrutura