AR场景事件

<xr-scene bind:ready="handleReady" bind:ar-ready="handleARReady">
</xr-scene>

AR系统为场景元素提供了以下事件:

事件 参数 立即 wxml 时机
ar-ready 微信小程序AR功能启动成功
ar-error 错误error 微信小程序AR功能启动失败

ARCamera

<xr-camera
  background="ar" is-ar-camera
/>

首先是background,当将其设置为ar时,整个场景的背景会显示为当前手机摄像头拍摄的画面。

然后是isARCamera,当开启它时,这个相机会被作为AR相机使用。在AR系统为PlaneMarker模式时,相机的参数将由AR系统控制,请不要在脚本中自行修改相机属性!!!

深度遮挡

Beta 版本特性 依赖基础库版本 v3.1.0

需要在 Plane 模式,且支持 v2 的设备上,planeMode 需设定为 1(只允许水平面识别)。

通过以下几个属性确定 ARsystem 深度遮挡的具体表现

  1. depthMask 在满足使用要求的情况下,是否开启实时深度遮挡。
  2. depthNear 开启实时深度遮挡时,遮挡的近处阈值。
  3. depthFar 开启实时深度遮挡时,遮挡的远处阈值。
  4. depthDebug 开启实时深度遮挡时,显示一个用于Debug的图层。

案例代码片段 链接

<!-- plane + depth 模式下 planeMode 需设置为 1 (只允许水平面识别) -->
<!-- 水平平面识别情况下,开启深度,近处阈值为0.1,远处阈值为1的深度遮挡,并显示调试用图层 -->
<xr-scene ar-system="modes:Plane; planeMode: 1; depthMask: true; depthNear: 0.1; depthFar: 100; depthDebug: true;">
</xr-scene>

识别模式

modes 属性,决定AR系统使用的具体识别模式。大部分情况下只允许同时运行一种模式。

目前不支持 modes 模式的动态切换。如果需要切换,可以考虑销毁原AR组件后,新建其他AR模式组件实现

目前支持的单一模式:

  1. 平面识别 Plane
  2. 2DMarker / 3DMarker 识别 Marker
  3. OSD识别 OSD
  4. 人脸识别 Face
  5. 肢体识别 Body
  6. 手部识别 Hand

目前由于微信小程序AI系统限制,除了 Plane + Marker 模式外,只能同时开启一种模式!!!

目前支持的混合模式:

  1. 平面结合Marker识别 Plane Marker
<!-- 目前版本 plane + marker 模式下 planeMode 需设置为 1 (只允许水平面识别) -->
<xr-scene ar-system="modes:Plane Marker; planeMode: 1"></xr-scene>

GLTF画廊

*以下图片均为 xr-frame 渲染截屏,模型来源为 gltf 官方示例与 sketchfab 资源(CC-Licensed)。

物件模型

人物模型

卡通模型

完整场景

GLTF介绍

GLTF是一种被广泛使用的文件格式,用来储存3D模型和3D场景。在xr-frame里你可以非常轻松地引入任意GLTF模型,并将其渲染出来。

使用GLTF的优势

📦 单一文件,完整场景

使用GLTF打包后的GLB文件,可将一整个场景的所有要素包揽进去。轻松管理你的3D资源。

🌍 成熟生态,海量资源

来自全世界的优秀创作者,在不同社区中分享作品。配合xr-frame的渲染能力,简直是随取随用。

微信小程序 + GLTF 可以做到…

  • 基础三角形网格模型
  • 场景树状节点组织
  • PBR材质渲染
  • 渲染状态控制
  • 模型基础动画
  • 骨骼蒙皮以及骨骼动画
  • 顶点Morph以及Morph动画
  • 点选GLTF模型与其交互
  • TS脚本控制GLTF渲染
  • ……

GLTF模型一般是什么样的?

如果你对GLTF还没有一个大致的了解:别担心,这里准备了一些图片,带你阅览各种各样的GLTF模型。

我要怎么做才能使用GLTF模型?

仅需要2行xml代码,2个xml标签,一个负责加载,一个负责渲染。即可将任意GLTF模型引入你的微信小程序中。

点击这里跟着我们的步骤来实现。


GLTF

  • GLTF格式介绍 – 面向不熟悉GLTF格式的用户;
  • 画廊 – 由xr-frame渲染的GLTF画廊;
  • GLTF使用说明 – 在xr-frame里使用GLTF的方法与规则;
  • 模型优化工具

后处理

后处理一般指一次渲染的最后环节,它接受一个相机的渲染结果,用图像处理算法对结果增强来达到一些效果,比如模糊、辉光、渐晕等等。

xr-frame内置的后处理系统以相机为基础,将后处理资源组装起来,实现最终的效果。

⚠️ 后处理系统在框架内部涉及到渲染管线,目前暂时不接受定制,未来视情况开放。

后处理资源

单个后处理资源对应后处理中的一个步骤,我们可以用以下几种方式来创建它:

在xml中创建

在XML中创建是最常用的使用方式

<xr-asset-post-process asset-id="blur" type="blur" is-hdr data="radius:10" />

可见我们指定了资源的asset-id、后处理类型type、是否为is-hdr和参数data。如此一来在资源系统中将会创建一个类型为blur、开启HDR、参数为{radius:10}的后处理资源blur

在代码中创建

当然,如果有需要我们也可以使用代码创建:

const xrFrameSystem = wx.getXrFrameSystem();

scene.assets.addAsset('post-process', 'vignette', scene.createPostProcess({
  type: 'vignette',
  isHDR: false,
  data: {
    intensity: 0,
    smoothness: 2,
    color: [0 0 0 1]
  }
}));

这里创建了一个类型为vignette的后处理资源。

在相机中配置

有了资源,只需要将它们配置给相机便可以开启后处理效果了:

<xr-camera
  ......
  post-process="blur vignette"
/>

相机元素的post-process属性接受一个字符串数组,数组的每个元素都是后处理资源的id,它们会按照步骤顺序执行。

修改参数

有时候我们想修改后处理资源的参数来调整效果,有两种方式可以实现:

在代码中修改

一个最常用的方法就是在代码中拿到资源引用后修改:

const blur = scene.assets.getAssets('post-process', 'blur');
blur.data.radius = 20;

使用帧动画

另一种方法是使用帧动画,指定某帧的属性为后处理资源:

{
  "keyframe": {
    "blur": {
      "0": {
        "asset-post-process.assetData.radius": 10
      },
      "100": {
        "asset-post-process.assetData.radius": 64
      }
    }
  },
  "animation": {
    "parent": {
      "keyframe": "blur",
      "duration": 4,
      "ease": "linear",
      "loop": -1
    }
  }
}

内置后处理资源

目前框架内置支持的后处理资源类型和对应效果可见:内置后处理资源。

阴影

在前面网格一章中我们提到过阴影,阴影是灯光和这二者的协作结果,只有主平行光能够产生阴影,以如下场景为例:

<xr-mesh node-id="plane" position="0 -0.4 0" scale="5 0.2 5" geometry="cube"  uniforms="u_baseColorFactor:0.48 0.78 0.64 1" receive-shadow
/>
<xr-gltf model="test-gltf" cast-shadow/>
<xr-camera
  position="3 3 3" target="plane" 
/>
<xr-light type="directional" rotation="60 0 0" color="1 1 1" intensity="2.5" cast-shadow />

可见,我们给plane这个xr-mesh开启了receive-shadow去接收阴影,然后开启了xr-gltfcast-shadow来产生阴影,最后开启了主光源的cast-shadow总开关允许灯光产生阴影。

当然,在实际使用中会有一些需要关注的地方:

  1. 支持自己给自己投影,可以同时开启产生和接收阴影。
  2. 可能需要视情况调整shadow-distance来避免阴影投影过大或者过小。
  3. 适当调整shadow-bias来防止自阴影。

宏和uniforms

以下宏或者uniforms会被传递到着色器中:

类型 说明
开启接受阴影 WX_RECEIVE_SHADOW bool

可以直接通过以下方法来获取当前物体阴影:

方法 说明
float shadowCalculation(vec3 posWorld) 传入世界坐标,返回阴影强度

天空盒

在相机的章节里我们提到过天空盒,当camera.background设置为skybox,将使用环境组件所定义的天空盒纹理,其由两个属性定义:

  1. sky-map:天空盒纹理,默认由环境数据提供,但也可以接受用户使用此属性覆盖。可以使用任何纹理,包括视频纹理。
  2. is-sky2d:天空盒渲染模式是否为2D,开启时会渲染一个平铺自适应的2D背景,此时纹理应当是一张2D图。

uniforms和宏

和渲染相关的环境数据均已全局uniform和全局宏的方式传入着色器,它们是:

类型 说明
开启环境漫反射 WX_USE_IBL_DIFFUSE bool
开启环境高光反射 WX_USE_IBL_SPECULAR bool
高光反射mipmaps数量 WX_USE_SPECULAR_MIPMAPS int
高光反射使用RGBD WX_USE_SPECULAR_RGBD bool
类型 uniforms 说明
漫反射系数 u_diffuseSH vec3[9]
漫反射曝光值 u_diffuseExp texture2d
高光反射纹理 u_specularEnvMap texture2d
高光反射曝光值 u_specularExp v
环境和天空盒旋转 u_envRotation float