44 lines
2.2 KiB
Markdown
44 lines
2.2 KiB
Markdown
|
|
|
|
## Plano: Corrigir entrada XR no Meta Quest 3
|
|
|
|
### Problema raiz
|
|
O codigo atual cria **duas sessoes XR em sequencia**: primeiro manualmente via `navigator.xr.requestSession('immersive-ar', ...)` (linha 242), depois via `xrStore.enterAR()` (linha 271). O Quest 3 rejeita a segunda porque ja existe uma sessao ativa. Alem disso, a primeira sessao nao esta conectada ao renderer do Three.js, entao mesmo se funcionasse, nao renderizaria nada.
|
|
|
|
### Correcoes
|
|
|
|
**1. Remover a chamada manual a `navigator.xr.requestSession`**
|
|
- Eliminar todo o bloco `try` das linhas 239-268 que tenta criar uma sessao manualmente
|
|
- A lib `@react-three/xr` gerencia a sessao internamente via `xrStore.enterAR()`
|
|
|
|
**2. Usar `customSessionInit` no `createXRStore` para image tracking**
|
|
- A lib suporta `customSessionInit` em `XRSessionInitOptions` que permite injetar opcoes extras na sessao
|
|
- Passar `optionalFeatures: ['image-tracking']` e `trackedImages` via `customSessionInit`
|
|
- O `createXRStore` ja adiciona `local-floor`, `hand-tracking`, `anchors`, `plane-detection` automaticamente
|
|
|
|
**3. Condicionar o emulador**
|
|
- `emulate: 'metaQuest3'` ativa o emulador IWER em localhost, o que pode interferir no Quest real
|
|
- Condicionar: so emular se nao estiver em dispositivo XR real (checar `navigator.xr?.isSessionSupported`)
|
|
- Ou mais simples: so emular em `location.hostname === 'localhost'` E quando `!navigator.xr`
|
|
|
|
**4. Arquivo: `src/pages/XRSession.tsx`**
|
|
|
|
Mudancas:
|
|
- Mover criacao do store para dentro do componente (ou lazy init) para poder passar o bitmap como `customSessionInit`
|
|
- `handleEnterAR`: simplificar para apenas `await xrStore.enterAR()` com listener de `end`
|
|
- Manter `ImageTrackingAnchor`, `ControllerFineTuning`, `XRModel` sem alteracoes
|
|
|
|
```text
|
|
ANTES (bugado):
|
|
1. navigator.xr.requestSession('immersive-ar') ← cria sessao A
|
|
2. xrStore.enterAR() ← tenta sessao B → REJEITADA
|
|
|
|
DEPOIS (correto):
|
|
1. createXRStore({ customSessionInit: { optionalFeatures: ['image-tracking'], trackedImages: [...] } })
|
|
2. xrStore.enterAR() ← unica sessao, com image tracking
|
|
```
|
|
|
|
### Sem alteracoes em
|
|
- ModelViewer, ViewerControls, SmartMeasure, checklist, medicoes, screenshots, PDF, IFC import
|
|
|