WebAR FácilAbrir ejemploEnglish

WebAREngine

Referencia práctica. Las firmas completas y tipos de opciones están en API generada.

Esta es la API programática avanzada. Para aplicaciones básicas empieza con HTML declarativo. Una escena HTML expone su motor como scene.engine tras ar-ready, sin que debas construirlo. Recuerda que el motor se reemplaza al parar/reiniciar la escena declarativa.

const engine=new WebAREngine({
  opencvURL:new URL('./vision/opencv.js',document.baseURI),
  imageLossGraceMs:500,
  keepContentOnLost:false,
  imageSmoothingMs:65,
  camera:{width:1280,height:720,fps:60,maxFrameWidth:640},
});

Opciones principales

Opción Valor inicial / contrato
opencvURL ./vision/opencv.js, relativo a document.baseURI; configurar si el HTML está en subcarpeta
camera Opciones de CameraManager salvo callbacks onFrame y onError
tracker Opciones de Tracker
imageLossGraceMs 500 ms; entre 0 y 10000; 0 confirma pérdida inmediatamente
keepContentOnLost false; permite conservar visualmente la última transformación
imageSmoothingMs 65 ms; entre 0 y 500; 0 desactiva filtrado temporal
calibration Intrínsecos opcionales; no se exigen para uso normal
fallback Opciones de odometría o false; por defecto se usa el backend incluido
keyframeCorrection false; corrección local experimental, no cierre de bucle global
attachXRSession, getXRContext, overlayRoot Hooks para integrar XR con un renderer propio

ThreeARScene conecta los hooks XR automáticamente. El núcleo sin renderer requiere que la aplicación los suministre para WebXR. Si proporcionas opciones explícitas de fallback respeta el contrato OpticalFlowOptions, incluidos intrinsics y floorROI; no son simples flags de calidad.

Ciclo de vida y targets

Método Resultado y comportamiento
startCamera() Promise<void>; abre la cámara
loadImageTarget(source, options?) Compila JPG/PNG y reemplaza todos los targets por default
addImageTarget(id, source, options?) Compila y añade/reemplaza solo ese ID
loadTarget(url) Carga .dat y reemplaza todos por default
addTarget(id, url) Añade/reemplaza un .dat por ID
removeTarget(id) Elimina tracking y visibilidad de ese target
setKeepContentOnLost(enabled, targetId?) Cambia política global o de un target existente
setFocus(mode, distance?) Promise<boolean>; false si no existe soporte
stop() Promise<void>; cierra sesión y elimina targets; instancia reutilizable
dispose() void; liberación definitiva

source acepta Blob/File, string URL o URL. ImageTargetOptions tiene physicalWidthMeters (por defecto 0.2) y maxDimension (por defecto 1024). Los métodos de imagen devuelven {buffer, metadata}. El JSON no es un argumento requerido del tracker.

Los IDs deben cumplir ^[a-zA-Z0-9_-]{1,64}$. Se admiten hasta 8. Espera las operaciones de configuración en orden; si ejecutas startCamera(), carga, retirada o transición simultáneamente, el motor puede rechazar la operación concurrente.

await engine.startCamera();
const result=await engine.addImageTarget('producto','./producto.jpg',{
  physicalWidthMeters:0.15,
});
console.log(result.metadata.quality);
// No usar Promise.all para estas operaciones de configuración del motor.

Propiedades de consulta

state, videoElement, cameraSettings, calibration y targetIds son de lectura. targetIds permite comprobar qué IDs están registrados; no es una lista de marcadores visibles. cameraSettings puede ser null sin captura activa.

Observación y eventos

const unsubscribe=engine.onPose((matrix,pose)=>{
  // matrix === pose.matrix; usar el contrato completo si la cámara se mueve.
  console.log(pose.targetId,pose.backend,pose.scale);
});
const unsubscribeError=engine.onError(error=>console.error(error));
// Al abandonar esta pantalla:
unsubscribe();unsubscribeError();

onStatus(listener), onSurface(listener) y onMetrics(listener) también devuelven una función de retirada. onSurface recibe una matriz de la superficie propuesta; no implica que un objeto ya esté colocado.

on(name,listener) acepta únicamente targetFound, targetLost, trackingQuality y targetVisibility; existen los atajos onTargetFound, onTargetLost, onTrackingQuality y onTargetVisibility. No existe un evento genérico pose en on: usa onPose. Las cadenas de onStatus son diagnósticos abiertos; no sustituyen los eventos tipados de detección.

Seguimiento espacial

enableSLAM(options?) devuelve Promise<SurfaceTransitionResult>. Opciones: targetId, backend: 'auto' | 'webxr' | 'optical-flow', placement: 'auto' | 'preserve' | 'hit-test', initializationTimeoutMs (12000 por defecto, >0 y <=120000).

Resultados backend: 'webxr' | 'optical-flow' y placement: 'preserved' | 'scan-marker' | 'select-surface' | 'scan-floor'. Solo preserved confirma continuidad ya conseguida. Lee transiciones y límites antes de conectar el botón.

exportSLAMMap() e importSLAMMap(snapshot) operan sobre la odometría activa; consulta persistencia. No existe un método público del motor llamado switchToSLAM: esa función pertenece a la clase avanzada SLAMManager, con otro contrato.

Apoya WebAR Fácil