收藏
回答

xr-frame xr-ar-tracker 在触发切换事件的时候如何更新视频纹理资源?

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 需求 xr-asset-load xr-ar-tracker 微信安卓客户端 8.0.32.2300 2.30.0

场景中存在多个 tracker,当 tracker 触发 tracker-switch 事件的时候,如何去动态更新视频纹理。

目前以下两种思路均未实现这个功能。

方式一:当 tracker 切换的时候,更改 video-texture 的 src 信息

js 文件:

handleTrackerSwitch: async function (event) {
      console.log('tracker - switch');
      const active = event.detail.value;
      const item = event.target.dataset.item;

      const url = this.data.items1[item].resourceUri;
      this.setData({ resourceUrl: url });
      const video = this.scene.assets.getAsset("video-texture", "hikari");
      console.log({ video });
      active ? video.play() : video.stop();
    }


方式二:列表遍历,tracker 切换的时候,控制列表中选项的显示和隐藏

 

js 文件:

handleTrackerSwitch: async function (event) {
      const active = event.detail.value;
      const item = event.target.dataset.item;
      this.setData({ currentIndex: Number(item) });
      const video = this.scene.assets.getAsset("video-texture", "hikari");
      console.log({ video });
      // console.log({ height: video.height, width: video.width });
      active ? video.play() : video.stop();
    }


目前尝试了以上两种方式,当 tracker 切换的时候,视频纹理的路径没有更新,仍为初始化时的值。

有其他实现思路或者已经实现了这个功能的,麻烦分享一下实现思路,感谢。

最后一次编辑于  2023-02-08
回答关注问题邀请回答
收藏

5 个回答

  • Roam
    Roam
    2023-02-09

    xr-Frame 中,动态改 xr-asset-load 里的值是无效的。

    所以方法一中,动态改 src 是无效的。


    xr-Frame 中使用资源的时候,需要保证资源已经被注册 (wxml被解析,一般需要通过加载回调确定)而且动态场景 xr-asset-load  不会触发 xr-assets 的 loaded事件。

    所以方法二中,下方使用的是没有被注册的视频纹理,也是无效的。

    (btw,实现需要这种方法可以考虑动态创建 xr-assets 使用,但是不推荐)


    如果需要动态使用资源(如视频纹理),推荐使用脚本进行动态加载。

    可以参考以下代码进行实现,需要注意的是,assetId 不能一致,会导致索引失败

    const videos = await Promise.all(videoList.map(videoItem => scene.assets.loadAsset({
      type: 'video-texture',
      assetId: videoItem.id,
      src: videoItem.url,
      options: { loop: true },
    })))
    videos.map((videoTexture, index) => {
      const videoMat = scene.createMaterial(
        scene.assets.getAsset('effect', 'simple'),
        { u_baseColorMap: videoTexture.value.texture }
      )
      scene.assets.addAsset('material', `video-mat-${videoList[index].id}`, videoMat)
    })
    


    目前 xr-frame-demo 通用模版 - 多tracker切换模版已更新,可以参考实现

    https://github.com/dtysky/xr-frame-demo

    2023-02-09
    有用
    回复 4
    • uzz T
      uzz T
      2023-02-13
      感谢回复,目前还有两个问题需要帮助解答一下。
      若同一项目上需要几十种甚至几百种视频纹理的情况下,动态 loadAsset 时会导致卡顿或白屏,针对这个问题目前有优化方式吗,或者说出现这个问题是合理的吗,
      另外,想问一下视频纹理上的资源,现在应该是每次重新进入场景都会需要重新加载,会影响到使用体验,这个缓存策略目前是什么样子的啊,有办法自己修改吗
      2023-02-13
      回复
    • Roam
      Roam
      2023-02-17回复uzz T
      一次性缓存几十种甚至几百种视频纹理,这种情况一般不存在,一般可以根据需求,动态加载和释放几张纹理做缓存。
      目前视频纹理的缓存在客户端侧,缓存策略不可控。需要等客户端侧视频解析改造后,才比较好确定最终的缓存策略。
      2023-02-17
      回复
    • bush
      bush
      2023-02-23
      通过这种方法加载的材质,怎么正确贴到加载的gltf模型上?
      2023-02-23
      回复
    • REN先森@向向AR
      REN先森@向向AR
      2023-02-24
      2023-02-24
      回复
  • 花开富贵🌺
    花开富贵🌺
    02-02

    这块的问题大佬解决了吗

    02-02
    有用
    回复
  • bush
    bush
    2023-02-24

    2023-02-24
    有用
    回复 3
    • 心态与度量
      心态与度量
      2023-04-24
      群二维码重新发一下
      2023-04-24
      1
      回复
    • bush
      bush
      2023-07-24回复心态与度量
      a75427
      2023-07-24
      回复
    • bush
      bush
      2023-07-24回复bush
      a754627
      2023-07-24
      回复
  • 一位不愿意透露姓名的吴文斌先生
    一位不愿意透露姓名的吴文斌先生
    2023-02-13

    有没有遇到视频问题开启音频不生效的问题,而且加上开启声音参数配置之后循环播放也不生效了

    2023-02-13
    有用
    回复 2
  • 陈林兵
    陈林兵
    2023-02-09

    我们目前采用的方法是写多个tracker,然后资源动态加载

    2023-02-09
    有用
    回复 1
    • uzz T
      uzz T
      2023-02-09
      我目前也是写了多个 tracker ,资源动态加载,但是识别出的视频纹理一直是同一个,觉得是代码写的有问题,但是没找到原因,麻烦帮忙分析一下,如果方便的话,麻烦贴一下实现的示例代码。
      2023-02-09
      回复
登录 后发表内容