sample-easyar-effect-occlusion

演示如何使用插件提供的效果实现模型Occlusion效果。

配置和运行

请参考 开发入门 进行配置和运行

如果想创建标准的xr-frame工程,请参考微信官方文档 开始

详解

模型occlusion效果实现方式为模型+自定义occlusion effect,effect id为 easyar-occlusion

sample的运行流程基于小程序基本框架,目录pages中存放所有的页面逻辑,components中存放所有被页面使用的组件功能,xr-frame和AR功能的在component中加载和使用。

小程序的目录结构说明:https://developers.weixin.qq.com/miniprogram/dev/framework/structure.html

演示效果

../../_images/occlusion.gif

注册material

wx.getXrFrameSystem().registerMaterial("occlusion", scene => scene.createMaterial(scene.assets.getAsset("effect", "easyar-occlusion")));

使用xr-frame的标准流程注册材质球。

给模型添加occlusion材质

Mesh组件在创建的时候可以设置材质,这里使用了内置的cube几何体来做示例,material设置为已注册的材质id,不需要设置纹理贴图。

let cube = scene.createElement(wx.getXrFrameSystem().XRMesh, {
    geometry: "cube",
    material: "occlusion",
});
root.addChild(cube);

GLTF组件与Mesh组件行为不同,所以无法在创建时添加材质,但可以获取GLTF所有的Mesh组件替换材质

//GLTF和GLB模型的Occlusion,GLTF组件与Mesh组件行为不一样,需要在加载完成后遍历GLTF.meshes获取模型上所有的Mesh组件替换材质。
let assetData = {
    assetId: "panda",
    type: "gltf",
    src: "https://staticfile-cdn.sightp.com/easyar/webar/mini/xiongmao.gltf",
    option: null
}
//这里通过Promis来创建模型是为了确保遍历GLTF.meshes的时候模型已经完成加载并且已经在场景中创建,否则meshes内没有东西无法完成材质替换
scene.assets.loadAsset(assetData)
.then((value) => {
    let panda = scene.createElement(wx.getXrFrameSystem().XRGLTF, { model: "panda" })
    root.addChild(panda);
    let occlusionMaterial = scene.assets.getAsset("material", "occlusion");
    panda.getComponent(wx.getXrFrameSystem().GLTF).meshes.forEach(m => {
        //neverCull为是否关闭视锥体剔除功能
        //如果要做特大遮挡模型可以考虑不关闭功能,需要根据性能状态进行衡量。
        m.setData({ neverCull: true, material: occlusionMaterial });
    });
    let transform = panda.getComponent(wx.getXrFrameSystem().Transform);
    transform.position.setValue(0.75, 0, 0);
    transform.rotation.setValue(0, 0, 0);
    transform.scale.setValue(1, 1, 1);
});

微信小程序相关说明: