Cómo modificar contenido 3D en una escena AR durante runtime de XRFame mini program
Este artículo ofrece una guía práctica para el control de estrategia de visibilidad bajo AR tracking, cambios de Transform en runtime y actualización dinámica de materiales GLTF.
Antes de empezar
- Familiarícese con carga de contenido 3D xr-frame en runtime
Cómo configurar la estrategia de control de visibilidad del Block en runtime
La estrategia de control de visibilidad visibleStrategy del componente BlockController tiene tres opciones:
| Estrategia | Descripción |
|---|---|
| VisibleWhileTracked | Valor predeterminado. Se muestra solo cuando el Block se rastrea correctamente, y se oculta cuando se pierde tracking. |
| VisibleAfterFirstTracked | Mientras el Block haya sido rastreado correctamente una vez, seguirá mostrándose aunque después se pierda tracking. |
| None | La visibilidad no la controla el motor; la mantiene el desarrollador. |
Después de que BlockHolder llame a holdBlock() para crear un nodo Block bajo ShadowRoot, puede modificar su estrategia de visibilidad.
Para saber cómo encontrar el BlockID, consulte Montar contenido directamente sin usar anotaciones.
const blockInfo: easyar.BlockInfo = { id: blockId };
blockHolder.holdBlock(blockInfo);
const block = blockHolder.getBlockById(blockInfo.id);
// cambia la estrategia a: mostrar permanentemente una vez que se haga tracking
block.visibleStrategy = BlockVisibleStrategy.VisibleAfterFirstTracked;
La VisibleStrategy predeterminada es VisibleWhileTracked, es decir, el contenido del Block (incluidos los nodos hijos) se muestra si y solo si el Block está bajo tracking de MegaTracker.
Métodos de edición y modificación de contenido
Modificar el Transform de un objeto
Para un
Elementen la escena, 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); /** 拷贝原本的四元数 */ let originalQuaternion = modelTF.quaternion.clone(); /** 绕Y旋转 180 度 */ 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 luego modifica la posición alineada y el ángulo de rotación.Reemplazar texture
Antes de reemplazar una texture, debe cargar manualmente el propio recurso de texture llamando a loadAsset mediante el sistema de gestión de recursos de la escena xr-frame.
Después, obtenga la propiedad
GLTFdel modelo y llame 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 usa primero el gestor de recursos de la escena para cargar un
textureAssety luego lo usa para reemplazar la texture del modelo GLTF.Reemplazar material registrado
Para reemplazar un material registrado, primero use el sistema de gestión de recursos de la escena xr-frame para llamar a getAsset() y obtener el recurso de material.
Después, obtenga la propiedad
GLTFdel modelo y llame asetDataen cadameshpara cambiar la propiedadmaterialal material objetivo.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 usa primero el gestor de recursos de la escena para cargar el material de occlusion
easyar-occlusionregistrado por EasyAR, y luego lo establece como material del modelo GLTF.