Integrar o plugin Mega ao seu WeChat Mini Program
Este documento orienta você a concluir a integração do plugin Mega no ambiente de Mini Program com xr-frame.
Antes de começar
- Consulte o guia de desenvolvimento do xr-frame e os exemplos oficiais do xr-frame para aprender a usar o mecanismo XR-3D oficial fornecido pelo WeChat, incluindo:
- a forma de introduzir o componente xr-frame em uma página comum do WeChat Mini Program;
- a comunicação entre o componente xr-frame e os componentes tradicionais do Mini Program;
- como obter ou criar um elemento da scene e modificar algumas propriedades, como
Transform; - carregar e liberar resources, por exemplo modelos GLTF.
Configuração global
Adicione a dependência do plugin Mega Mini Program ao arquivo de configuração global app.json no diretório raiz do Mini Program e altere o dependency loading para injeção sob demanda.
{
"lazyCodeLoading": "requiredComponents",
"plugins": {
"easyar-wechat-miniprogram": {
"version": "2.0.2", //use a versao mais recente do plugin
"provider": "wx27fa3b52b5462e8f" // id fixo do plugin de Mini Program Mega
}
}
}
Carregar o plugin
Você pode introduzir o plugin pela plugin interface e usar diretamente alguns métodos do plugin para verificar se ele foi carregado corretamente.
Por exemplo, depois de obter EasyARWechatMiniprogramPlugin por meio da interface requirePlugin(string path) fornecida pelo WeChat, use o método isMegaTrackerSupported para determinar se o dispositivo é compatível.
//se o arquivo typings ja tiver sido importado
//const easyarPlugin: easyar.EasyARWechatMiniprogramPlugin = requirePlugin("easyar-wechat-miniprogram") as easyar.EasyARWechatMiniprogramPlugin;
const easyarPlugin = requirePlugin("easyar-wechat-miniprogram") as any;
//chame isMegaTrackerSupported para determinar se o dispositivo atual e compativel; se nao for, mostre um aviso pop-up
if (!easyarPlugin.isMegaTrackerSupported()) {
const message = `当前设备不支持 VK v1 和 v2,请参考微信官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/plane.html`;
wx.showModal({
title: "设备不支持",
content: message,
showCancel: false,
});
console.error(message);
return;
}
Neste exemplo, primeiro é obtido
easyarPlugin, isto é, o objeto de interface exposto pelo plugin, por meio da interfacerequirePlugin(string path)fornecida pelo WeChat. Em seguida, é chamado o método isMegaTrackerSupported fornecido por ele para determinar se o ambiente de execução atual está disponível. Se não estiver disponível, uma janela modal será exibida.
Introduzir tipos
Recomenda-se usar Typescript para desenvolvimento.
Caminho no projeto de exemplo: /typings/types/easyar/lib.easyar.d.ts.
Copie para o mesmo diretório do projeto e referencie em /typings/types/index.d.ts com uma diretiva triple-slash:
/// <reference path="./easyar/lib.easyar.d.ts" />
Quando for necessário usar type objects, você pode obter o type system IMegaSystem do plugin EasyAR Mega WeChat Mini Program por meio de getMegaSystem.
const mega: easyar.IMegaSystem = easyarPlugin.getMegaSystem();
Depois, é possível usar os tipos expostos em IMegaSystem para comparações de tipo. Por exemplo, compare state com mega.SessionState.Running para determinar se a session foi inicializada com sucesso:
const newState: easyar.SessionState = event.detail.value;
if (newState === mega.SessionState.Running) {
console.log("EasyAR Session initialized succeeded. Start running.");
}
Configuração da scene xr-frame (WXML)
No arquivo WXML da página, o componente xr-easyar-mega deve ser um child node de xr-scene e deve vincular corretamente os id da câmera e do tracker. Se o id não for preenchido, o componente usará os primeiros componentes xr-camera e xr-ar-tracker encontrados na scene.
<xr-scene id="xr-scene" ar-system="modes:Plane; planeMode: 1" bind:ready="handleReady">
<xr-easyar-mega
id="easyar-mega"
camera-id="xrCamera"
ar-tracker-id="xrARTracker"
></xr-easyar-mega>
<xr-node>
<xr-ar-tracker id="xrARTracker" mode="Plane"></xr-ar-tracker>
<xr-camera id="xrCamera" node-id="xrCamera" clear-color="0.925 0.925 0.925 1" background="ar" is-ar-camera></xr-camera>
</xr-node>
<xr-shadow id="shadow-root" node-id="xrShadow"></xr-shadow>
</xr-scene>
Cuidado
O planeMode de ar-system deve ser definido como 1
Registrar callbacks de evento do plugin Mega
<xr-easyar-mega
id="easyar-mega"
camera-id="xrCamera"
ar-tracker-id="xrARTracker"
bind:sessionStateChange="onSessionStateChange"
bind:megaLocalizationResult="onMegaLocalizationResult"
bind:postSessionUpdate="onPostSessionUpdate"
></xr-easyar-mega>
No WXML, vincule os eventos distribuídos pelo proxy xr-frame Element. Para o mecanismo de distribuição de eventos do xr-frame, consulte o mecanismo de eventos do xr-frame.
Os eventos distribuídos pelo plugin são:
| Nome do evento | Tipo de parâmetro | Descrição |
|---|---|---|
SessionStateChange |
SessionState | Acionado imediatamente quando o estado da Session muda. O parâmetro é o novo estado da Session, usado para processar os callbacks de início e sucesso da inicialização da Session. |
MegaLocalizationResult |
MegaLocalizationResult | Acionado depois que o frame de rendering que recebeu o resultado de Mega localization termina de atualizar. Quando o evento é acionado, todas as alterações de Transform controladas pela EasyAR nesse frame de rendering já foram concluídas. |
PostSessionUpdate |
Sem parâmetros | Acionado imediatamente depois que a Session termina de atualizar nesse frame de rendering. Nesse momento, todas as alterações de Transform controladas pela EasyAR nesse frame já foram concluídas. |
AR Session
Para criação, inicialização e destruição da session, consulte controle de fluxo de AR Session.
Confirme se a inicialização foi bem-sucedida por meio do callback do evento sessionStateChange. Quando o estado muda para Running, a ARSession pode ser considerada pronta.
No WXML, registre a função onSessionStateChange() no componente xr-frame como callback do evento sessionStateChange por meio de bind:sessionStateChange="onSessionStateChange":
<xr-easyar-mega
bind:sessionStateChange="onSessionStateChange"
></xr-easyar-mega>
Na função callback onSessionStateChange() do componente xr-frame, compare o estado da session com cada enum de SessionState para determinar o estado atual da session.
onSessionStateChange(event) {
const newState: easyar.SessionState = event.detail.value;
console.log(`EasyAR Session state changed to: ${mega.SessionState[newState]}`);
let displayInfoStr: string = "";
if (newState === mega.SessionState.None) {
displayInfoStr = "EasyAR Session is inactive.";
} else if (newState === mega.SessionState.Initializing) {
displayInfoStr = "EasyAR Session is initializing...";
} else if (newState === mega.SessionState.Running) {
displayInfoStr = "EasyAR Session initialized succeeded. Start running.";
}
this.triggerEvent("sessionDisplayInfoEvent", displayInfoStr);
}
No código acima, após a conclusão da inicialização, o console deve imprimir "EasyAR Session initialized succeeded. Start running."