Come caricare contenuti 3D in scenari AR a runtime in xr-frame
Questo articolo descrive in dettaglio il meccanismo di separazione tra resource loading e node mounting in xr-frame. Tramite script dinamici, i contenuti 3D possono essere montati in modo flessibile sotto nodi Block per realizzare AR.
Materiali ufficiali
- Guida allo sviluppo xr-frame: documentazione ufficiale del XR engine di WeChat.
- Esempi ufficiali xr-frame: include vari esempi di uso base e avanzato.
I materiali ufficiali spiegano già in modo sufficiente come caricare contenuti 3D a runtime. Questo articolo descrive brevemente solo alcuni contenuti e metodi di caricamento comuni negli scenari AR.
Resource loading vs node mounting
In xr-frame, visualizzare un modello 3D si divide in due fasi:
Resource loading: download di file modello (come
.glb) da rete o locale e parsing in memoria. A questo punto il modello è pronto, ma non visibile nella scene.Node mounting: creazione di un node nel scene tree e associazione della resource caricata a quel node. Solo allora il modello appare ufficialmente nel rendering canvas.
Come caricare dinamicamente contenuti 3D usando codice
Resource loading
Caricare manualmente resources chiamando loadAsset tramite il sistema di gestione resources della scene xr-frame.
Il parametro
typeindica il tipo di resource,assetIdindica l'id della resource dopo il caricamento, esrcindica la url della resource, di solito l'indirizzo del resource hosting server.Registrare
assetIdper il successivo mounting e rilascio della resource.try { await scene.assets.loadAsset({type: 'gltf', assetId: 'panda', src: 'url/EasyARPanda.glb'}); } catch (err) { console.error(`Failed to load assets: ${err.message}`); }Node mounting
Usare
element.addChild()per posizionare il modello caricato sotto ShadowRoot.const root = scene.getElementById("shadow-root"); let panda = scene.createElement(xrFrameSystem.XRGLTF, { "model": "panda", "anim-autoplay": "" } ); root.addChild(panda);L'elemento ShadowRoot è il root node usato appositamente da xr-frame per impedire la creazione e rimozione dinamica di nodes. Per dettagli vedere Shadow node.
Il metodo createXRNodeFromNodeAnnotation fornito dal plugin object può creare child nodes di Block in base ai dati EMA, assicurando che i contenuti 3D vengano mostrati nella corretta posizione spaziale.
const nodeAnnotation = annotation as easyar.ema.v0_5.Node; const xrNode: xrfs.XRNode = easyarPlugin.createXRNodeFromNodeAnnotation(nodeAnnotation, blockHolder); let panda = scene.createElement(xrFrameSystem.XRGLTF, { "model": "panda", "anim-autoplay": "" } ); xrNode.addChild(panda);
Come montare contenuti direttamente sotto Block senza usare annotation
Avvertenza
Il prerequisito per usare questo metodo è aver verificato che il valore LocalTransform possa ottenere l'effetto di rendering previsto nel sistema di coordinate xr-frame.
Per altri casi, usare la funzione annotation dell'Unity Editor.
Ottenere il block node object nel scene tree tramite getBlockById(id). Se il block node corrispondente non esiste, significa che la localization di questo Block non è ancora riuscita (il node viene creato automaticamente alla prima localization riuscita del Block). È possibile usare holdBlock(blockInfo, blockTransformInput) per creare un node per questo Block, oppure verificare nel localization callback che la localization del Block sia riuscita prima di montare il contenuto.
Consiglio
Selezionare node Block nel scene tree di Unity Editor e registrare l'ID mostrato nel pannello Inspector

È possibile trovare Block ID anche nella pagina della cloud localization library

const blockID = "aaaa1234-bbbb-cccc-dddd-eeeeee123456"
if (!blockHolder.getBlockById(blockParent.id)) {
// non esiste alcun nodo Block; creane uno
blockHolder.holdBlock({
id: blockID
})
}
let blockElement = blockHolder.getBlockById(blockParent.id).el;
Montare il model node sotto il Block specificato e usare position.setArray(), quaternion.set() e scale.setArray() per modificare il LocalTransform del model node.
export interface LocalTransform {
/** @description posizione */
position: xrfs.Vector3;
/** @description rotazione */
rotation: xrfs.Quaternion;
/** @description Scale */
scale: xrfs.Vector3;
}
// supponi che esista un LocalTransform noto sotto Block
const targetTransform: LocalTransform;
blockElement.addChild(modelNode);
let modelTransform = modelNode.getComponent(xrFrameSystem.Transform);
modelTransform.position.setArray([
targetTransform.position.x,
targetTransform.position.y,
targetTransform.position.z
]);
let annoRotation = new xrFrameSystem.Quaternion().setValue(
targetTransform.rotation.x,
targetTransform.rotation.y,
targetTransform.rotation.z,
targetTransform.rotation.w
);
modelTransform.quaternion.set(annoRotation);
modelTransform.scale.setArray([
targetTransform.scale.x,
targetTransform.scale.y,
targetTransform.scale.z
]);
Tipi di resource supportati da xr-frame
- Texture, texture e immagini
- CubeTexture, texture cubiche
- VideoTexture, texture video
- EnvData, environment
- GLTF models
- Keyframe, frame animation
- Atlas
I metodi dettagliati di caricamento per ogni resource si trovano nella documentazione ufficiale WeChat e negli esempi ufficiali xr-frame
Nota
Per formati ed extensions GLTF supportati, fare riferimento alle istruzioni ufficiali xr-frame per l'uso di GLTF