微信AR实现识别手部展示glb模型(带demo)

提示:我的代码文件在资源里,有需要可自行下载,微信开发者工具直接运行到pages/ar/scene-ar-germanBusiness/index页面,进行手机预览可查看。项目记得改成自己的appid
在这里插入图片描述

1.效果
在这里插入图片描述
2.微信小程序手势识别只支持以下几个动作,和识别点位,官方文档
因为AR识别手部一直在识别,所以会出现闪动问题。可以将微信开发者调试基础库设置到3.3.2以上,可能要稳定一些
在这里插入图片描述
3.3.代码展示,我用的是微信官方文档案例demo框架。官方文档demo
在这里插入图片描述
4.代码展示,在组件里先创建xr-ar-german组件
在这里插入图片描述
index.wxml

<!-- 手势识别 -->
<xr-scene ar-system="modes:Hand" bind:ready="handleReady" bind:ar-ready="handleARReady">
  <xr-assets bind:progress="handleAssetsProgress" bind:loaded="handleAssetsLoaded">
  <!-- D仔模型 -->
    <!-- <xr-asset-load type="gltf" asset-id="miku2" src="模型"/> -->
    <xr-asset-load type="gltf" asset-id="miku2" src="https://cyvideo.i-oranges.com/ar/ds2024/67.glb"/>
   
  </xr-assets>
  <xr-env env-data="xr-frame-team-workspace-day"/>
  <!-- D仔模型位置调整 9 5 13 7 0 1 2 12 6 7 10 11 8 4 14 15 16 17 18 19 20 3-->
  <xr-node wx:if="{{arReady}}">
    <xr-ar-tracker id='tracker' mode="Hand" auto-sync="9">
        <!-- <xr-gltf id="wxball-2" model="miku2"
       anim-autoplay scale="0.12 0.12 0.12" 
       rotation="0 180 0"
        bind:gltf-loaded="handleGLTFLoaded"  wx:if="{{modeShow}}"/> -->
        <xr-gltf id="wxball-2" model="miku2"
       anim-autoplay scale="0.12 0.12 0.12" 
       position="0 0 -1"
       rotation="10 180 0"
        bind:gltf-loaded="handleGLTFLoaded"  wx:if="{{modeShow}}"/>
    </xr-ar-tracker>
    <!-- AR相机 -->
    <xr-camera
      id="camera"  target="miku2"  node-id="camera" clear-color="0.925 0.925 0.925 1"
      background="ar" is-ar-camera  near="0.0001"  position="2 1 10"
    ></xr-camera>
  </xr-node>
  <xr-node node-id="lights">
    <!-- <xr-light type="ambient" color="1 1 1" intensity="2.5" /> -->
    <xr-light type="ambient" color="1 1 1" intensity="2.9" />
    <!-- 点光源 -->
    <!-- <xr-light type="point" position="0 0 0" color="1 1 1" range="30" intensity="10" /> -->
  </xr-node>
</xr-scene>

index.js

Component({
  behaviors: [require('../common/share-behavior').default],
  data: {
    loaded: false,
    arReady: false,
    modeShow: false, //模型展示默认不展示false
    isplay: true,
    modeShowOne: false,
    time:null,//定时器
  },
  methods: {
    // 模型加载完毕
    handleGLTFLoaded({
      detail
    }) {

    },
    handleReady({
      detail
    }) {
      const xrScene = this.scene = detail.value;
      // 显示加载中提示
      wx.showLoading({
        title: '加载中',
        mask: true // 是否显示透明蒙层,防止用户点击其他区域
      })
      xrScene.event.add('tick', this.handleTick.bind(this));
    },
    handleAssetsProgress: function ({
      detail
    }) {
      console.log('组件进度', detail.value);
      //组件进度 detail.value.progress == 1组件加载完毕
    },
    handleAssetsLoaded: function ({
      detail
    }) {
      // console.log('assets loaded', detail.value);
      // 隐藏加载中提示
      wx.hideLoading()
      this.setData({
        loaded: true
      });
    },
    handleARReady: function ({
      detail
    }) {
      // console.log('arReady');
      this.setData({
        arReady: true
      });
    },
    handleTick: function () {
      let that = this;
      const xrSystem = wx.getXrFrameSystem();
      const trackerEl = this.scene.getElementById('tracker');
      if (!trackerEl) {
        return;
      }
      const tracker = trackerEl.getComponent(xrSystem.ARTracker);
      console.log('识别到手了',this.data.isplay,'====',tracker.arActive)
//tracker.arActive = true  代表识别到了手部任何部位
      if (!tracker.arActive) {
        // this.setData({
        //   isplay:true
        // })
        return
      }
      // 这里只是例子,实际上用的是`ARTracker`的`autoSync`属性。
      // 但也是一个更高自由度的选项。
      // 视情况需要自己同步`tracker`的`scale`和`rotation`特定节点。
      // 第一个参数是特征点编好,第二个是可选的复用结果,第三个是可选的是否相对于`ARTracker`。
      // 为`false`为世界空间的位置,需要配合`scale`自己使用
      const position = tracker.getPosition(98, new xrSystem.Vector3(), false);
      // 获取手势姿态,详见官网
      const gesture = tracker.gesture;
      //识别成功显示D仔模型在手上  gesture==1手掌识别
      if (gesture == 1) {
        console.log('显示D仔11', this.data.isplay);
        // 判断是否新用户需要进来引导画面  1表示需要
        wx.setStorageSync('gestureOne', 1);
        //显示模型
        this.setData({
          modeShow: true
        })
        if (this.data.isplay) {
         this.data.time = setTimeout(() => {
            console.log("暂停动画了");
            //暂停手势模型动画
            let animator1 = that.scene.getElementById('wxball-2').getComponent("animator");
            animator1.pause();
          }, 4000)
          this.setData({
            isplay: false
          })
        }
      } else {
        console.log('没有识别到手掌');
        this.setData({
          modeShow: false, //隐藏模型
          isplay: true //默认未识别到手的时候初始化动画
        })
        //清除定时器
        clearTimeout(this.data.time);
      }
      // 获取总体置信度
      const score = tracker.score;
      this.triggerEvent('info', {
        gesture,
        score
      });
    }
  }
})

index.json

{
  "component": true,
  "renderer": "xr-frame"
}

5.创建父组件scene-ar-germanBusiness,引入手势识别子组件
在这里插入图片描述
在这里插入图片描述
index.WXML

<view wx:if="{{gestureShow==1}}">
  <xr-demo-viewer>
    <xr-ar-german  disable-scroll id="main-frame" width="{{renderWidth}}"height="{{renderHeight}}" style="width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;" bind:info="handleInfo" bind:arTrackerState="handleARTrackerState" />
  </xr-demo-viewer>
</view>

index.json

{
  "usingComponents": {
    "xr-demo-viewer": "../../../components/xr-demo-viewer/index",//官方文档案例有,复制过来
    "xr-ar-german": "../../../components/xr-ar-german/index",
  },
  "disableScroll": true
}

index.js

var sceneReadyBehavior = require('../../behavior-scene/scene-ready');
var handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML;
var xmlCode = ``;
Page({
  moveTimes: 0,
  behaviors: [sceneReadyBehavior],
  data: {
     gestureShow:1
  },
    handleInfo: function ({
    detail
  }) {
  console.log('模型出来了',detail)
    this.setData({
      gesture: detail.gesture,
      score: detail.score.toFixed(2)
    });
    if (this.data.gesture === 1) {
       wx.showToast({
         title: '识别成功',
         icon: 'none',
         duration: 200
       }); 
     // setTimeout(res=>{
      //  this.setData({
      //    horizontalShow:false,//隐藏引导
     //   })
    //  },100)
    //  setTimeout(res => {
     //   this.setData({
      //    tipsTu: false,
      //    progessShow: false,
    //    })
  //    }, 2000)
    } else {
    //没有识别到
    //  this.setData({
    //    progessShow: false
    //  })
    }
  },
    handleARTrackerState: function ({
    datail
  }) {
     console.log('模形出来了吗',detail)
  },
})

最终效果

小程序AR手势识别

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Uniapp微信小程序中,要渲染fbx或者glb模型,可以通过使用THREE.js库来实现。 首先,您需要将fbx或glb模型文件添加到您的Uniapp项目中。可以直接将模型文件放置在项目的静态资源目录下,或者通过引入第三方插件来处理模型文件的加载和渲染。 然后,您可以创建一个新的Uniapp页面来显示模型。在该页面中,使用THREE.js库的相关方法来加载模型文件,并将其渲染到页面上。 在加载模型文件之前,需要先引入THREE.js库。可以在页面的script中导入库文件,并创建一个渲染器。然后,使用THREE.js提供的加载器来加载fbx或glb模型文件。 当模型文件加载完成后,可以创建一个场景、摄像机和光源来对模型进行渲染。通过THREE.js提供的相机控制器,可以调整视角和交互方式。 最后,将渲染器输出的结果添加到页面中,用于显示模型。可以通过canvas元素或其他合适的元素将渲染器的输出添加到页面上。 需要注意的是,在Uniapp微信小程序中使用THREE.js库要保证库文件和相关资源的正确路径,并且需要处理好模型的尺寸和纹理等问题,以确保模型在小程序中正确显示。 总而言之,通过使用THREE.js库,在Uniapp微信小程序中渲染fbx或glb模型,可以通过加载模型文件、创建场景和渲染器等步骤来实现。这样可以使得小程序的用户能够在界面上直观地观看和交互模型。 ### 回答2: 在Uniapp微信小程序中渲染fbx或glb模型可以通过引入相关的三维库来实现。首先,需要使用Uniapp的npm模块管理器(插件市场中下载)将相关的三维库安装到项目中。常用的三维库有THREE.js和Babylon.js等。 安装完三维库后,可以在小程序页面中通过引入相应的库,创建场景、相机和渲染器。然后,通过加载fbx或glb模型文件,并将其添加到场景中。这些库通过提供加载器的方式,可以将模型文件解析为可渲染的对象。 加载模型文件后,可以设置其位置、旋转、缩放等属性,以及添加纹理材质。同时,可以根据需要设置光照、阴影等效果,使模型更加逼真。 随后,调用渲染器的渲染方法将场景和相机渲染到画布上,从而实现对fbx或glb模型的渲染。可以通过监听事件或者动画控制库来实现模型的交互和动画效果。 需要注意的是,由于Uniapp是跨平台开发框架,一些平台可能不支持加载fbx或glb模型,因此在开发过程中需要对各个平台的兼容性进行测试和处理。 总之,借助Uniapp的扩展性,结合相关的三维库,可以在微信小程序中轻松实现对fbx或glb模型的渲染和展示,为用户提供更加丰富的视觉体验。 ### 回答3: 在Uniapp中,要渲染FBX或者GLB模型,可以使用uni-3d-model组件来实现。首先,需要将FBX或者GLB模型文件添加到项目中的static文件夹中,然后使用uni-3d-model组件来加载和渲染模型。 1. 在页面的vue文件中,引入uni-3d-model组件: ``` <template> <uni-3d-model :src="modelUrl"></uni-3d-model> </template> <script> export default { data() { return { modelUrl: '/static/model.fbx' // 或者'/static/model.glb' } } } </script> ``` 2. 在uni-3d-model组件中,通过设置src属性将模型文件路径传递给组件,使其加载并渲染模型。其中,modelUrl的值应为FBX或者GLB模型文件在static文件夹中的相对路径。 需要注意的是,渲染FBX或者GLB模型需要在小程序的云开发环境中进行,因此在使用uniapp编译小程序之前,需要先将uni-3d-model组件配置为“原生小程序组件”。具体操作可参考uni-3d-model组件的官方文档。 通过以上步骤,就可以在uniapp微信小程序中成功渲染FBX或者GLB模型了。同时,可以根据需要,设置组件的其他属性,如大小、位置、旋转等,来调整模型在小程序中的展示效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值