Cómo modificar contenido 3D en escenas AR durante el tiempo de ejecución de la miniaplicación XRFame
Este documento proporciona una guía práctica para controlar estrategias de visibilidad en seguimiento AR, transformaciones de Transform en tiempo de ejecución y actualización dinámica de materiales GLTF.
Antes de comenzar
- Familiarízate con carga de contenido 3D en tiempo de ejecución de xr-frame
Cómo configurar estrategias de control de visibilidad para bloques en tiempo de ejecución
La estrategia de control de visibilidad del componente BlockController visibleStrategy tiene tres tipos:
| Estrategia | Descripción |
|---|---|
| VisibleWhileTracked | Valor predeterminado. Visible solo cuando el bloque es seguido con éxito, oculto cuando se pierde el seguimiento. |
| VisibleAfterFirstTracked | Visible permanentemente después de un seguimiento exitoso, incluso si se pierde el seguimiento posteriormente. |
| None | La visibilidad no es controlada por el motor, debe ser mantenida por el desarrollador. |
Puedes modificar su estrategia de visibilidad después de que BlockHolder llame a holdBlock() para crear nodos de bloque bajo ShadowRoot.
Cómo encontrar BlockID puede consultarse en montar contenido sin anotaciones.
const blockInfo: easyar.BlockInfo = { id: blockId };
blockHolder.holdBlock(blockInfo);
const block = blockHolder.getBlockById(blockInfo.id);
// Cambiar estrategia a: visible permanentemente después del primer seguimiento
block.visibleStrategy = BlockVisibleStrategy.VisibleAfterFirstTracked;
La VisibleStrategy predeterminada es VisibleWhileTracked, lo que significa que el contenido (incluidos los nodos secundarios) solo se muestra cuando el bloque está bajo seguimiento de MegaTracker.
Métodos de edición y modificación de contenido
Modificar transform de objetos
Para
Elementen la escena, se debe llamar a su método getComponent() para obtener elComponentcorrespondiente antes de modificarlo.const xrFrameSystem = wx.getXrFrameSystem(); let transform = model.getComponent(xrFrameSystem.Transform); transform.position.setValue(1.0, 0.0, -1.0); /** Copiar el cuaternión original */ let originalQuaternion = modelTF.quaternion.clone(); /** Rotar 180 grados alrededor del eje Y */ let targetQuaternion = originalQuaternion.multiply(new xrFrameSystem.Quaternion().setValue(0, 1, 0, 0)); transform.quaternion.setValue(targetQuaternion);En este ejemplo, el programa obtiene el
xrFrameSystem.Transformdemodely modifica su posición y rotación.Reemplazar textura
Antes de reemplazar una textura, se debe cargar manualmente el recurso mediante el sistema de activos de la escena xr-frame usando loadAsset.
Luego, obtén la propiedad
GLTFdel modelo y llama al métodosetTexture()en elmaterialde cadamesh.const textureAsset = await scene.assets.loadAsset({ type: 'texture', assetId: `texture01`, src: 'some-texture-url.png', }); model.getComponent(xrFrameSystem.GLTF).meshes.forEach((m: any) => { m.material.setTexture('u_baseColorMap', textureAsset.value); });En este ejemplo, el programa carga primero un
textureAssetusando el administrador de activos de la escena, luego lo usa para reemplazar la textura del modelo GLTF.Reemplazar material registrado
Para reemplazar un material registrado, primero usa el sistema de activos de la escena xr-frame llamando a getAsset() para obtener el recurso de material.
Luego, obtén la propiedad
GLTFdel modelo y modifica la propiedadmaterialde cadameshusandosetData.let occlusionMaterial = scene.assets.getAsset("material", "easyar-occlusion"); model.getComponent(xrFrameSystem.GLTF).meshes.forEach((m: any) => { m.setData({ material: occlusionMaterial }); });En este ejemplo, el programa carga el material de oclusión
easyar-occlusionregistrado por EasyAR usando el administrador de activos de la escena, luego lo establece como material del modelo GLTF.