微信小程序xr-frame GLTF

这篇具有很好参考价值的文章主要介绍了微信小程序xr-frame GLTF。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:什么是GLTF?

原文解释是:GLTF是一种被广泛使用的文件格式,用来储存3D模型和3D场景。在xr-frame里你可以非常轻松地引入任意GLTF模型,并将其渲染出来。想要更详细的讲解:glTF -传输格式;

优势(摘自GLTF介绍 | 微信开放文档 (qq.com)):

  •  单一文件,完整场景

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

  •  成熟生态,海量资源

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

  • 以下使用方法、属性、事件、动画等 (摘自GLTF介绍 | 微信开放文档 (qq.com))

1.GLTF模型需要先通过Loader加载进小程序中,才可以渲染。

<xr-asset-load type="gltf" asset-id="gltfModel" src="/assets/xxx.gltf" />

2.GLTF组件

GLTF组件可以渲染一个已经加载完成的GLTFModel资源。

使用xr-gltf标签可以为标签自动创建GLTF组件

<xr-gltf id="myGLTF" model="gltfModel"></xr-gltf>

 3.标签属性

属性名 组件.属性 备注
model GLTF.model 使用的GLTFModel资源,对应xr-asset-load标签中的asset-id属性
cast-shadow GLTF.castShadow GLTF模型是否投射阴影
receive-shadow GLTF.receiveShadow GLTF模型是否接受阴影

 4.事件:

事件名 描述 事件回调参数 备注
gltf-loaded GLTF组件将GLTFModel渲染完毕后触发。 { target: Element } -

5.修改 :

GLTF组件提供了一系列接口来让用户操作xr-frame为GLTF模型生成的内部子树,开发者也可以用这些接口来动态修改glTF模型的颜色、纹理等材质属性

接口名 描述 备注
getInternalNodeByName 根据GLTFNode节点的name字段来获取xr-frame对应的Element
get meshes 获取生成的所有Mesh组件
getPrimitivesByNodeName 根据GLTFNode节点的name字段来获取其下的所有Mesh组件 2.28.1版本加入;详见API文档
getPrimitivesByMeshName 根据GLTFMesh节点的name字段来获取所有相关的Mesh组件 2.28.1版本加入;详见API文档

用法:修改GLTF贴图

// gltf信息
{
    ...
    "nodes": [{
      "mesh": 0,
      "name": "Banana"
    }],
    ...
}
<xr-gltf id="myGLTF" model="gltfModel" bind:gltf-loaded="handleGLTFLoaded"></xr-gltf>
function handleGLTFLoaded({ detail }) {
    const el = detail.value.target;
    //获取名字为nana的mesh
    const gltf = el.getComponent("gltf");
    const newMat = this.scene.assets.getAsset("texture", "...texture name...");
    for (const mesh of gltf.getPrimitivesByNodeName("Banana")) {
         //更改材质
        mesh.material.setTexture("u_baseColorMap", newMat);
    }
}

6.动画

如果GLTF模型有自带的动画,就会在当前元素下自动创建一个Animator组件,并将GLTF模型内的动画片段加入到这个Animator组件中。 

如果GLTF组件所在的元素本来已经拥有Animator组件,就不会新建,而是直接使用这个Animator组件。 在标签上添加anim-autoplay属性可以自动播放GLTF模型内的动画,会播放GLTF内的所有动画片段:

  •  自身就有动画直接加 anim-autoplay
<xr-gltf id="myGLTF" model="gltfModel" anim-autoplay></xr-gltf>
  • 使用animator实现动画

1) 设置动画json

{
  "keyframe": {
    "parent": {
      "0": {
        "rotation": [0, 0, 0]
      },
      "100": {
        "rotation": [0, 6.28, 0]
      }
    },
    "child": {
      "0": {
        "position.y": -0.5
      },
      "100": {
        "position.y": 1.5
      }
    }
  },
  "animation": {
    "parent": {
      "keyframe": "parent",
      "duration": 8,
      "ease": "linear",
      "loop": -1
    },
    "child": {
      "keyframe": "child",
      "duration": 4,
      "ease": "ease-in-out",
      "direction": "both",
      "loop": -1
    }
  }
}

2)加载动画资源

 <xr-asset-load asset-id="anim" type="keyframe" src="/assets/animation/miku-kawaii-animation.json"/>

3)绑定动画

  <xr-node anim-keyframe="anim" anim-autoplay="clip:parent">

4)控制动画

如果你只想播放GLTF模型里的某一个动画片段,或者想切换播放的动画片段,可以使用TS脚本来控制。

例如以下代码在GLTF模型渲染完毕后播放名为idle的动画:

// xml
<xr-gltf id="myGLTF" model="gltfModel" bind:gltf-loaded="handleGLTFLoaded"></xr-gltf>
// ts
function handleGLTFLoaded({ detail }) {
    const el = detail.value.target;
    const animator = el.getComponent("animator");
    animator.play("idle");
}

动画的名字idle,对应的是.gltf文件中animations数组节点的每一个元素的name属性(参考官方文档)。

7.Morph Target:(demo详见下篇文章)

1.什么是Morph Target?详见:静态网格体变形目标 | 虚幻引擎文档 (unrealengine.com)

xr-frame支持Morph Target动画,但是对target的数量有限制,同一个模型最多使用8个target

这里的target概念有别于.gltf文件内的target节点:.gltf文件内的一个同时拥有POSITIONNORMAL属性的target节点,在xr-frame中算作2个target(不影响渲染效果)。

8.注意事项(gltf模型限制)

GLTF模型需要满足以下条件才能正常渲染:

  • 纹理使用的顶点UV不超过2个;
  • 使用的顶点JOINTS不超过1个;
  • 使用的顶点WEIGHTS不超过1个;
  • 不使用sparse accessor
  • accessornormalized属性不为true
  • morph targets数量小于等于8个;
  • morph的属性为POSITION,NORMALTANGENT
  • 图元类型不为LINE_LOOPTRIANGLE_FAN;

经测试,只有少数模型会超出限制,大多数模型都可以正常渲染。并且随着项目迭代,未来将会解除或者放宽一些条件。

9.典型案例(多动画显示demo来源于微信开放文档)

1)wxml部分

<xr-scene id="xr-scene" bind:ready="handleReady">
  <xr-assets bind:progress="handleAssetsProgress" bind:loaded="handleAssetsLoaded">
    <xr-asset-load asset-id="anim" type="keyframe" src="/assets/animation/miku-kawaii-animation.json"/>
    <xr-asset-load type="gltf" asset-id="cloud-station" src="https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/cloud-station/index.glb" />
    <xr-asset-load type="gltf" asset-id="miku-kawaii" src="https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/shiteyanyo-hatsune-miku/index.glb" />
    <xr-asset-load type="gltf" asset-id="miku" src="https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/miku.glb" />
  </xr-assets>
  <xr-node>
    <xr-node node-id="target" position="0 1 0" />
    <xr-gltf position="0 0 0" scale="1 1 1" model="cloud-station" anim-autoplay></xr-gltf>
    <xr-gltf position="1.8 -0.5 1.5" scale="0.12 0.12 0.12" rotation="0 180 0" model="miku" anim-autoplay></xr-gltf>
    <xr-node anim-keyframe="anim" anim-autoplay="clip:parent">
      <xr-node position="0 -0.5 3" rotation="0 90 0" anim-keyframe="anim" anim-autoplay="clip:child">
        <xr-gltf model="miku-kawaii" anim-keyframe="anim" anim-autoplay></xr-gltf>
      </xr-node>
    </xr-node>
    <xr-camera
      id="camera" node-id="camera" position="0 1 7" clear-color="0.925 0.925 0.925 1"
      target="target" background="default" camera-orbit-control=""
    ></xr-camera>
  </xr-node>
  <xr-node node-id="lights">
    <xr-light type="ambient" color="1 1 1" intensity="1" />
    <xr-light type="directional" rotation="40 180 0" color="1 1 1" intensity="2" />
  </xr-node>
</xr-scene>

2)json动画部分

{
  "keyframe": {
    "parent": {
      "0": {
        "rotation": [0, 0, 0]
      },
      "100": {
        "rotation": [0, 6.28, 0]
      }
    },
    "child": {
      "0": {
        "position.y": -0.5
      },
      "100": {
        "position.y": 1.5
      }
    }
  },
  "animation": {
    "parent": {
      "keyframe": "parent",
      "duration": 8,
      "ease": "linear",
      "loop": -1
    },
    "child": {
      "keyframe": "child",
      "duration": 4,
      "ease": "ease-in-out",
      "direction": "both",
      "loop": -1
    }
  }
}

3)js部分

Component({
  properties: {
    a: Number,
  },
  data: {
    loaded: false
  },
  lifetimes: {
    attached() {
      console.log('data.a', this.data.a) // expected 123
    }
  },
  methods: {
    handleReady: function({detail}) {
      this.scene = detail.value;
      console.log('scene', detail.value);
    },
    handleAssetsProgress: function({detail}) {
      console.log('assets progress', detail.value);
    },
    handleAssetsLoaded: function({detail}) {
      console.log('assets loaded', detail.value);
      this.setData({loaded: true});
    },
    handleRaf: function({detail}) {
      console.log('raf', detail.value);
    }
  }
})

4)效果展示

xr-frame gltf动画文章来源地址https://www.toymoban.com/news/detail-455019.html

到了这里,关于微信小程序xr-frame GLTF的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • XR-FRAME 开始

    xr-frame 是一套小程序官方提供的XR/3D应用解决方案,基于混合方案实现,性能逼近原生、效果好、易用、强扩展、渐进式、遵循小程序开发标准。 在这一章中,我们将会带大家从头开始,用它构建一个XR小程序。 首先创建项目,让我们选择小程序工程: 之后先在 app.json 加上

    2024年02月12日
    浏览(62)
  • 微信小程序3D,使用Three.js在微信小程序中展示gltf模型,使用VisionKit展示AR能力

    本仓库只开源gltf模型展示技术,技术好的朋友有这些代码就能帮助你解决很多问题了 如需要完整项目(基于若依框架开发的后端,AR能力前端)需另外付费赞助, 联系方式:QQ 790002517 微信公众号:时不待我 https://github.com/zzy-life/Wechat3D Three.js Three.js is a JavaScript 3D library. thr

    2024年02月09日
    浏览(47)
  • 微信小程序适配iphoneX,XR,12及以上,获取底部安全区域

    iphone x及以上的异形屏top高度为44px(或以上),非异形屏为20px。 先判断是否为异形屏,如果是,获取到底部小黑条区域的高度。在页面设置底边距padding-bottom/margin-bottom,把内容区域隔开。 小黑条区域高度=屏幕高度-安全区域的bottom值,安全区域指的是内容可见区域 注意小

    2024年03月11日
    浏览(73)
  • 微信小程序用什么工具开发(微信小程序开发工具介绍)

    有很多人在开发小程序之前都会去了解微信小程序开发工具,想知道微信小程序用什么工具开发。时至今日,随着互联网技术的发展,现在开发微信小程序也能使用多种不同的工具,让我们来了解一下吧。 一、微信开发者工具 这是微信官方提供的微信小程序开发工具,可以

    2024年02月11日
    浏览(67)
  • 微信小程序用什么编写

    微信小程序是一种轻量级的应用程序,可以在微信中直接使用,而无需下载和安装。由于它的快速和简便,越来越多的企业和开发者开始将微信小程序作为他们的主要开发目标。那么,微信小程序到底用什么编写呢? 微信小程序可以使用多种编程语言和工具来编写,其中最常

    2024年02月12日
    浏览(42)
  • 微信小程序和微信H5有什么区别?

    前言:进入公司会发现会从最常见的PC端开发,慢慢将重心转移到H5开发,再到小程序开发,后面随着公司业务的发展还需要开发APP,也就是Android。也有可能顺序不一样,作为一个合格的后端甚至全栈,这些还是要会的。 在开发微信小程序功能的时候,发现微信小程序和微信

    2024年02月11日
    浏览(57)
  • 【微信小程序】小程序是什么?怎样快速上手开发一个小程序?

    大家好,从今天起我们开始微信小程序的学习之路,今天我们就先来认识一下什么是微信小程序,以及做好小程序开发前的准备! 微信小程序,简称小程序,是一种不需要下载安装即可使用的应用,开发者可以快速地开发一个小程序。小程序可以在微信内被便捷地获取和传播

    2024年02月09日
    浏览(57)
  • 微信公众平台(3):微信小程序发布为什么需要https证书

    微信小程序一定要用https的理由,小程序使用HTTPS链接分析 一、HTTPS HTTPS是HTTP的安全版,在 HTTP的基础上加入SSL证书 (服务器证书)后形成的安全协议 ,不但可以建立信息加密通过保障数据传输的安全,还能 认证服务器的真实性 , 防止“钓鱼”网站 。每个微信小程序都需要先

    2024年02月12日
    浏览(59)
  • 微信小程序“轻表查查”是做什么的?如何使用?

    亲爱的老师们,大家好!今天我要给大家介绍一款非常实用的微信小程序—— 轻表查查 。这个小程序可是个神器,可以帮助您轻松发布成绩查询信息,省时省力,还超级方便哦!   轻表查查是一款人人都可用的查询系统发布工具。它能够快速帮助个人、学校发布查询信息,

    2024年02月03日
    浏览(102)
  • 微信小程序个人和企业有什么不一样(个人和企业小程序的区别)

    很多朋友在注册微信小程序时不知道微信小程序个人和企业有什么不一样。本文就为大家介绍一下个人小程序和企业小程序的区别。 1、注册流程不一样。 在微信公众平台注册的小程序因为个人,小程序注册主体是个人用户所以他的注册流程比较简单,只需要个人身份信息验

    2024年02月12日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包