Designer 3D Local e uma plataforma Windows local-first para reconstruir ambientes 3D a partir de fotos. O foco atual do produto e interior amplo: captura guiada, validacao geometrica, reconstrucao por Meshroom/AliceVision, publicacao de OBJ/MTL texturizado e visualizacao web com orbit, pan, zoom, reset, tela cheia e download.
O sistema foi desenvolvido para rodar na propria maquina, sem cloud e sem Funnel publico. A interface abre em http://127.0.0.1:8000; o Tailscale Serve pode apontar para essa mesma porta para acesso privado pela tailnet.
O pipeline ja cobre o fluxo completo:
- upload ou captura direta pela camera;
- tutorial visual de captura em loop;
- pre-processamento de fotos com normalizacao, classificacao e descarte de frames ruins;
- validacao geometrica por
pycolmap; - reconstrucao e texturizacao local por Meshroom/AliceVision;
- publicacao de manifesto, relatorios, ZIP e viewer web;
- acesso local e, quando configurado, pela URL Tailscale;
- recuperacao de artefato texturizado a partir de cache Meshroom quando a publicacao anterior foi incompleta.
O ultimo ajuste tecnico importante corrige a perda de partes internas. O Meshroom pode gerar uma malha texturizada com milhares de ilhas UV desconectadas; se a limpeza tratar cada ilha como ruido, ela corta piso, pilares e moveis. A regra atual preserva componentes internos em interiores altamente fragmentados por textura e neutraliza apenas o lado externo.
Resultado esperado no viewer:
Reconstrucao fiel: OBJ/MTL texturizado, priorizado quando hamap_Kdvalido e cobertura interna suficiente.Reconstrucao real: malha Meshroom sem neutralizacao seletiva, usada como diagnostico.Layout limpo: cena estruturada secundaria, publicada somente quando piso/teto/referencia espacial passam nos gates.
flowchart LR
UI["React/Vite UI"] --> API["Fastify API local"]
API --> PRE["Photo analysis"]
PRE --> COLMAP["pycolmap localize"]
COLMAP --> GATE["Geometry gate"]
GATE --> MESHROOM["Meshroom/AliceVision reconstruct"]
MESHROOM --> CLEAN["Backend mesh cleaner"]
CLEAN --> CAND["Artifact candidate evaluator"]
CAND --> MANIFEST["model-manifest.json"]
MANIFEST --> VIEWER["three.js viewer"]
API --> TS["Tailscale Serve proxy"]
Separacao de responsabilidades:
Localize:pycolmapregistra cameras, chunks, loops e metricas geometricas antes de liberar processamento pesado.Reconstruct: Meshroom/AliceVision executa SfM, depth maps, meshing, filtering e texturing.Understand: o backend extrai referencia espacial, layout limpo e relatorios de qualidade quando ha confianca suficiente.Publish: o backend escolhe o melhor candidato seguro. Ele nao deve publicarReconstrucao fielsem textura fotografica.View: o frontend apenas carrega artefatos publicados. Limpeza pesada fica no backend.
Detalhes adicionais estao em docs/ARCHITECTURE.md.
POST /api/jobsrecebename,sceneTypeeimages[].- O backend salva as imagens em
jobs/<id>/inputs. photo-analysiscalcula nitidez, brilho, contraste, duplicidade, orientacao de captura e score de continuidade.- A entrada filtrada e copiada para
processing-inputs. run_colmap_capture.pyexecuta chunks sequenciais com overlap e retorna metricas de registro.pipeline-policydecide entrefinal,best-effortourejected.- Meshroom roda em serie com preset do tipo de cena.
prepareFaithfulMeshArtifactgera a malha fiel limpa, preservando geometria interna valida.createWebTextureAssetgera OBJ/MTL web-safe com atlas ate 8192.evaluateArtifactCandidatesescolhefaithful-web,faithful-cleanou baseline.- O job publica
model-manifest.json,quality-report.json,texture-report.json,visual-report.jsoneoriginal.zip.
Cada job aceito deve publicar:
model-manifest.json: contrato consumido pelo viewer.quality-report.json: diagnostico de fotos, COLMAP, budget e publicacao.texture-report.json: cobertura texturizada, atlas, faces internas/externas e candidato selecionado.visual-report.json: renderabilidade e comparacao contra baseline.original.zip: OBJ, MTL, texturas e cena estruturada quando disponivel.
Campos tecnicos do relatorio de textura:
selectedCandidate: candidato publicado no viewer.textureCount: quantidade de mapas de textura encontrados no MTL.interiorFaceCoverage: razao de faces internas texturizadas.exteriorNeutralizedFaces: faces externas convertidas para material neutro.webAtlasCount: atlas gerados para uso web.maxTextureSide: maior dimensao de textura permitida para o viewer.
- Frontend: React, TypeScript, Vite, three.js.
- Backend: Node.js, TypeScript, Fastify.
- Reconstrucao: Meshroom/AliceVision.
- Validacao geometrica: Python + pycolmap.
- Viewer: OBJ/MTL, GLB quando viavel, OrbitControls.
- Acesso remoto privado: Tailscale Serve apontando para
127.0.0.1:<porta>.
- Windows 10/11.
- Node.js 24+.
- Python 3.14+.
pycolmapinstalado no Python local.- Meshroom 2025.1.0 ou compativel.
- Tailscale instalado e autenticado, opcional.
Instalacao base:
npm install
python -m pip install pycolmap
npm run build.\Start-Designer3D.ps1O script valida Node, Python, pycolmap, builda o projeto e abre a interface. O backend escuta somente em 127.0.0.1.
Execucao manual:
npm run build
npm startO app procura o Meshroom em caminhos locais padrao e tambem permite salvar o caminho pela API/UI.
Endpoint:
POST /api/settings/enginePayload:
{
"meshroomExecutable": "E:\\Designer_3d\\Meshroom\\Meshroom-2025.1.0\\meshroom_batch.exe"
}Nao existe backend separado para Tailscale. A URL da tailnet deve encaminhar para a mesma aplicacao local.
Exemplo:
tailscale serve --bg http://127.0.0.1:8000A UI consulta:
GET /api/settings/routespara listar localhost e a URL Tailscale quando disponivel.
| Metodo | Rota | Uso |
|---|---|---|
GET |
/api/system/status |
Hardware, Meshroom, Tailscale, rotas e disco |
GET |
/api/settings/routes |
URLs locais e Tailscale |
POST |
/api/settings/engine |
Salvar e validar Meshroom |
POST |
/api/jobs |
Criar reconstrucao com fotos |
GET |
/api/jobs |
Historico |
GET |
/api/jobs/:id |
Estado completo do job |
GET |
/api/jobs/:id/events |
SSE de progresso |
POST |
/api/jobs/:id/cancel |
Cancelamento forte |
GET |
/api/jobs/:id/model |
Manifesto do viewer |
GET |
/api/jobs/:id/download/original |
ZIP com artefatos |
Padrao oficial usado nos testes:
- celular na horizontal;
- lente fixa
1x; - altura aproximada do peito;
- deslocamento real pelo ambiente, sem girar parado;
- revisitar marcos visuais a cada 3 a 5 fotos;
- 70% frames neutros com chao, parede/moveis e linha superior;
- 15% frames altos com teto e encontro parede/teto;
- 15% frames baixos com chao e encontro parede/chao.
O app penaliza frames com chao ou teto dominando demais, blur, duplicidade, oclusao por parede/pilar proximo e reflexos dominantes.
npm run check
npm run test
npm run build
npm run test:e2eCobertura atual do servidor:
- pre-checagem e acceptance gates;
- COLMAP parser e fallback;
- migracao de jobs legados;
- limpeza de malha;
- textura web;
- Tailscale;
- budget de hardware;
- cena estruturada;
- integracao Fastify.
- O sistema nao inventa geometria ausente. Se nenhuma foto cobriu um movel, pilar ou canto com paralaxe suficiente, a malha pode continuar incompleta.
- GLB fiel pode ser omitido quando texturas 8192 tornam o arquivo grande demais para conversao segura. O viewer usa OBJ/MTL como caminho principal.
- Gaussian Splatting esta preparado como camada opcional, mas a publicacao robusta atual usa mesh texturizada.
- O modo
best-efforte intencional: quando a geometria e reconhecivel, mas nao fecha todos os gates finais, o app publica o melhor resultado limpo com confianca explicita.
apps/
server/ Fastify, jobs, Meshroom, COLMAP, publicacao de artefatos
web/ React, upload, captura, historico e viewer 3D
docs/
ARCHITECTURE.md detalhes da arquitetura local
VALIDATION.md criterios e metricas de validacao
pipelines/ presets Meshroom por cena/perfil
tests/e2e/ fluxo browser Playwright
Start-Designer3D.ps1
Diretorios locais ignorados pelo Git:
jobs/capture-sessions/Meshroom/analysis/prepared-sets/output/logs/node_modules/
Isso evita subir fotos privadas, caches pesados e binarios de terceiros.