## Objetivo Adicionar alternância entre câmera **Perspectiva** e **Ortográfica** no viewer principal, com **Ortográfica como padrão**, e tornar a calibração mais confiável usando a vista ortogonal (sem distorção de perspectiva, normais alinhadas com os eixos da tela). ## Por que isso resolve a calibração Em perspectiva, ao clicar numa face "de frente", a normal capturada pelo raycaster é a normal real do triângulo, mas o usuário tende a clicar em faces inclinadas achando que estão alinhadas — o que gera pares de vetores ruins. Em **ortográfica + vista alinhada ao cubo (FRENTE/TOPO/DIR)**, a face que aparece "de frente" é geometricamente perpendicular à câmera, então a chance de capturar a normal certa é muito maior. Também damos uma dica visual (snap angular) para validar o clique. ## Mudanças ### 1. Toggle de câmera no viewer (`ModelViewer.tsx` + `ViewerControls.tsx`) - Estado `cameraMode: 'ortho' | 'persp'` no `useModelStore` (default `'ortho'`, persistido em localStorage junto com as demais prefs visuais). - Em `ModelViewer.tsx`, condicionar `` / `` (drei) como `makeDefault`, compartilhando posição/target com o `OrbitControls`. Ao trocar de modo, copiar `position`, `target` e calcular `zoom` ortográfico a partir da distância atual para evitar "pulo" visual. - `OrbitControls` permanece, apenas com `enableRotate` igual; em ortho mantemos rotação livre (estilo CAD). Pan/zoom continuam funcionando. - Botão de alternância adicionado em `ViewerControls.tsx` ao lado dos controles de render (Sólido / Bordas), com ícones (ex.: `Box` para perspectiva, `Square` para ortho) e tooltip. Atalho de teclado opcional `O`/`P`. ### 2. ViewCube já existente - Continua funcionando igual, mas agora ao clicar numa face em modo ortográfico o resultado é uma vista verdadeiramente axial (sem foreshortening), o que é o comportamento esperado de CAD. ### 3. Calibração refinada (`ViewCube.tsx` + `viewCubeBus.ts`) - Ao iniciar a calibração, **forçar modo ortográfico** automaticamente (salvando o modo anterior para restaurar ao concluir/cancelar). - Em cada passo "await-cube-N", após o usuário clicar a face do cubo, **animar a câmera principal** para essa vista (já temos `requestView`) — assim a próxima clique na peça é feito olhando a face de frente. - Adicionar **snap de normal**: ao capturar a normal da face da peça, se ela estiver a <10° de um eixo principal (X/Y/Z), arredondar para esse eixo. Isso elimina ruído de faces ligeiramente chanfradas. - Mostrar no hint: "olhando para FRENTE — clique na face frontal da peça" (texto dinâmico do passo). - Manter o fluxo de 4 cliques + verificação opcional já aprovado. ### 4. Persistência - `cameraMode` salvo globalmente (preferência do app, não por peça). - `calibrationQuat` por peça continua como já está. ## Arquivos afetados - `src/stores/useModelStore.ts` — campo `cameraMode` + setter. - `src/components/three/ModelViewer.tsx` — alternância de câmera, sincronização de posição/zoom. - `src/components/ViewerControls.tsx` — botão de alternância Persp/Ortho. - `src/components/ViewCube.tsx` — força ortho durante calibração, anima vista após cada cube-click. - `src/components/three/viewCubeBus.ts` — snap angular da normal capturada. ## Pergunta Te parece bom seguir com **ortográfica como default** e **forçar ortho durante calibração** com snap automático nas normais? Ou prefere deixar o usuário trocar manualmente e a calibração apenas "sugerir" o modo ortho via toast?