Files
SteelXR/.lovable/plan.md
T
gpt-engineer-app[bot] 3bf90dafd7 Changes
Co-authored-by: Reifonas <211114984+Reifonas@users.noreply.github.com>
2026-05-24 20:23:29 +00:00

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' no useModelStore (default 'ortho', persistido em localStorage junto com as demais prefs visuais).
  • Em ModelViewer.tsx, condicionar <PerspectiveCamera> / <OrthographicCamera> (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?