Como modificar conteúdo 3D em uma cena AR durante o runtime do XRFame mini program
Este artigo fornece orientação prática sobre controle de estratégia de visibilidade sob AR tracking, alterações de Transform em runtime e atualização dinâmica de material GLTF.
Antes de começar
- Familiarize-se com carregamento de conteúdo 3D xr-frame em runtime
Como configurar a estratégia de controle de visibilidade do Block em runtime
A estratégia de controle de visibilidade visibleStrategy do componente BlockController tem três opções:
| Estratégia | Descrição |
|---|---|
| VisibleWhileTracked | Valor padrão. Exibe apenas quando o Block é rastreado com sucesso, e oculta quando o tracking é perdido. |
| VisibleAfterFirstTracked | Assim que o Block tiver sido rastreado com sucesso uma vez, ele continua exibido mesmo que o tracking seja perdido depois. |
| None | A visibilidade não é controlada pelo engine e é mantida pelo desenvolvedor. |
Depois que BlockHolder chama holdBlock() para criar um node Block sob ShadowRoot, você pode modificar sua estratégia de visibilidade.
Para saber como encontrar o BlockID, consulte Montar conteúdo diretamente sem usar anotações.
const blockInfo: easyar.BlockInfo = { id: blockId };
blockHolder.holdBlock(blockInfo);
const block = blockHolder.getBlockById(blockInfo.id);
// altera a estrategia para: mostrar permanentemente apos o tracking
block.visibleStrategy = BlockVisibleStrategy.VisibleAfterFirstTracked;
A VisibleStrategy padrão é VisibleWhileTracked, ou seja, o conteúdo do Block (incluindo child nodes) é exibido se e somente se o Block estiver sob tracking do MegaTracker.
Métodos de edição e modificação de conteúdo
Modificar o Transform de um objeto
Para um
Elementna cena, é necessário chamar seu método getComponent() para obter oComponentcorrespondente antes de modificá-lo.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);Neste exemplo, o programa obtém o
xrFrameSystem.Transformdemodele então modifica a posição alinhada e o ângulo de rotação.Substituir texture
Antes de substituir uma texture, é necessário carregar manualmente o próprio recurso de texture chamando loadAsset pelo sistema de gerenciamento de recursos da cena xr-frame.
Depois, obtenha a propriedade
GLTFdo modelo e chame o métodosetTexture()nomaterialde 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); });Neste exemplo, o programa primeiro usa o gerenciador de recursos da cena para carregar um
textureAsset, e depois o usa para substituir a texture do modelo GLTF.Substituir material registrado
Para substituir um material registrado, primeiro use o sistema de gerenciamento de recursos da cena xr-frame para chamar getAsset() e obter o recurso material.
Depois, obtenha a propriedade
GLTFdo modelo e chamesetDataem cadameshpara modificar a propriedadematerialpara o material alvo.let occlusionMaterial = scene.assets.getAsset("material", "easyar-occlusion"); model.getComponent(xrFrameSystem.GLTF).meshes.forEach((m: any) => { m.setData({ material: occlusionMaterial }); });Neste exemplo, o programa primeiro usa o gerenciador de recursos da cena para carregar o material de occlusion
easyar-occlusionregistrado pelo EasyAR e depois o define como material do modelo GLTF.