Co-authored-by: Reifonas <211114984+Reifonas@users.noreply.github.com>
3.5 KiB
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'nouseModelStore(default'ortho', persistido em localStorage junto com as demais prefs visuais). - Em
ModelViewer.tsx, condicionar<PerspectiveCamera>/<OrthographicCamera>(drei) comomakeDefault, compartilhando posição/target com oOrbitControls. Ao trocar de modo, copiarposition,targete calcularzoomortográfico a partir da distância atual para evitar "pulo" visual. OrbitControlspermanece, apenas comenableRotateigual; em ortho mantemos rotação livre (estilo CAD). Pan/zoom continuam funcionando.- Botão de alternância adicionado em
ViewerControls.tsxao lado dos controles de render (Sólido / Bordas), com ícones (ex.:Boxpara perspectiva,Squarepara ortho) e tooltip. Atalho de teclado opcionalO/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
cameraModesalvo globalmente (preferência do app, não por peça).calibrationQuatpor peça continua como já está.
Arquivos afetados
src/stores/useModelStore.ts— campocameraMode+ 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?