Files
SteelXR2/.lovable/plan.md
T
gpt-engineer-app[bot] 82624995d8 Changes
Co-authored-by: Reifonas <211114984+Reifonas@users.noreply.github.com>
2026-05-21 13:04:13 +00:00

2.6 KiB

Correções no modo Medir

Problemas

  1. Ao ativar Medir, o OrbitControls é desabilitado (enabled={!positionMode && !measureMode}), bloqueando rotação/zoom/pan naturais com o mouse.
  2. O label da medida usa useLabelDistanceFactor que recalcula distanceFactor por frame para manter tamanho constante na tela. Resultado: ao aproximar a peça o texto não cresce e fica ilegível.

Mudanças em src/components/three/ModelViewer.tsx

1. Reabilitar controles de câmera no modo Medir

No <OrbitControls> (linha ~792), trocar:

enabled={!positionMode && !measureMode}

por:

enabled={!positionMode}

O MeasureClickHandler já tem drag gate de 4 px (pointerdown + pointerup só conta como clique se o mouse moveu menos que 4 px e foi botão esquerdo). Isso significa:

  • Botão esquerdo arrastando → OrbitControls rotaciona, nenhum ponto é adicionado.
  • Botão direito → pan do OrbitControls (handler ignora e.button !== 0).
  • Roda → zoom do OrbitControls (handler ignora).
  • Clique curto esquerdo → adiciona ponto de medida (com snap).

2. Label da medida escala com o zoom e fica ~4x maior

Substituir MeasurementLabel para usar distanceFactor fixo (em vez de calculado por frame). Com <Html distanceFactor={N}>, o tamanho na tela é proporcional a N / distance — ou seja, cresce naturalmente ao aproximar a câmera.

  • Remover o uso de useLabelDistanceFactor no label de medida (manter, se desejado, apenas no hoverInfo).
  • Definir distanceFactor fixo calibrado para 1:1 mm (valor inicial ~8, ajustável).
  • Aumentar o tamanho base do texto de text-[11px] para text-[16px] e px-2 py-0.5px-3 py-1 para acompanhar a proporção (~4x área visual final somando o aumento do distanceFactor + texto).
function MeasurementLabel({ position, text, variant }: { ... }) {
  const borderClass = variant === 'success' ? 'border-success/60' : 'border-primary/60';
  const textClass   = variant === 'success' ? 'text-success'      : 'text-primary';
  return (
    <Html position={position} center distanceFactor={8} zIndexRange={[100, 0]} style={{ pointerEvents: 'none' }}>
      <div className={`rounded bg-card/95 border ${borderClass} px-3 py-1 shadow-lg backdrop-blur-sm`}>
        <span className={`font-mono text-[16px] font-bold ${textClass} whitespace-nowrap`}>
          {text}
        </span>
      </div>
    </Html>
  );
}

O hoverInfo (auto-detect) pode manter o comportamento atual de tamanho constante para não poluir a cena ao passar o mouse.

Sem mudanças em outros arquivos

Store, AR, snap e PointMarker permanecem intocados.