82624995d8
Co-authored-by: Reifonas <211114984+Reifonas@users.noreply.github.com>
51 lines
2.6 KiB
Markdown
51 lines
2.6 KiB
Markdown
# 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:
|
|
```tsx
|
|
enabled={!positionMode && !measureMode}
|
|
```
|
|
por:
|
|
```tsx
|
|
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.5` → `px-3 py-1` para acompanhar a proporção (~4x área visual final somando o aumento do distanceFactor + texto).
|
|
|
|
```tsx
|
|
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.
|