赞
踩
上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用,只完成了简单的环境搭建,这篇文章讲解如何加载3D模型。
在XR-Frame框架中,加载资源都是在wxml文件的标签中实现的。下面是wxml中完整的代码
index.wxml
- <xr-scene render-system="alpha:true" bind:ready="handleReady">
- <xr-assets>
- <xr-asset-load type="gltf" asset-id="gltf-model" src="{{url}}" options="ignoreError:-1"/>
- </xr-assets>
- <xr-node>
- <xr-gltf node-id="gltf-model" bind:gltf-loaded="handleGLTFLoaded" model="gltf-model"></xr-gltf>
- </xr-node>
- <xr-light type="ambient" color="1 1 1" intensity="2" />
- <xr-light type="spot" position="3 3 3" color="1 1 1" range="3" intensity="5" />
- <xr-camera id="camera" clear-color="0 0 0 0" position="1 1 2" target="gltf-model" camera-orbit-control/>
- </xr-scene>
上面代码中,<xr-assets> 标签代表要加载资源,<xr-asset-load>标签是要加载资源具体的属性,
其中 type 属性为要加载的资源格式,这里采用gltf格式比较方便,也是小程序官方推荐的格式,
asset-id 属性是资源的ID,设置设个属性主要是为了后续节点的操作。
options 属性这里设置为-1 是因为模型本身可能会超过小程序的限制,造成无法加载,设置为-1就会强行加载模型,但加载出的模型材质可能会出现意外的错误。所谓这个设置要慎重。
<xr-node> 表示这是一个节点,节点下可能放很多模型或内置的网格,便于统一管理。比如统一将一批node下的模型旋转,缩小,移动等操作。
<xr-gltf> 表示这是一个gltf 模型,model属性赋值为<xr-asset-load>标签的asset-id,代表要显示的就是这个id资源模型。
后面我还加入了两个光源<xr-light>,分别是环境光和聚光灯。
在wxml文件中,我们将<xr-asset-load> 标签中属性src的值绑定为一个变量为 url
这样,我们就需要在index.js 文件中给这个变量赋一个初始值
index.js
- Component({
- properties: {
- url: {
- type: String,
- value: ''
- }
- },
- data: {
- },
- methods: {
- handleGLTFLoaded() {
- console.log('模型加载完成')
- wx.hideLoading()
- },
- }
- })
这部分代码比较简单,这里给url赋值为空,然后我们在父组件中给这个变量赋值为对应的模型地址,这样就可以动态的加载模型。
代码中还有一个handleGLTFLoaded()方法,这个方法是在wxml文件中<xr-gltf>标签内绑定的加载模型完成后调用的回调函数。我们可以在这个函数中根据场景再对模型做一些微调。
通过上面两步,子组件的代码已经编写完成。下面我们只需要在调用xr-frame的页面给子组件的url属性赋值即可。
index.vue
- <template>
- <view style="display: flex;flex-direction: column;">
- <xr-start id="main-frame" disable-scroll
- :url="url"
- :width="renderWidth"
- :height="renderHeight"
- :style="'width:'+width+'px;height:'+height+'px;'">
- </xr-start>
- </view>
- </template>
-
- <script>
- export default {
- data() {
- return {
- url:"https://mp-f8b2202e-3122-48e4-9c72-9407860f72c5.cdn.bspapp.com/newModel/md58/580001.glb",
- width:300,
- height:300,
- renderWidth:300,
- renderHeight:300,
- }
- },
- onLoad(option){
- uni.showLoading({
- title:'模型加载中...'
- })
- this.width = uni.getWindowInfo().windowWidth
- this.height = uni.getWindowInfo().windowHeight
- const dpi = uni.getWindowInfo().pixelRatio
- this.renderWidth = this.width * dpi
- this.renderHeight = this.height * dpi
- this.url = "https://mp-f8b2202e-3122-48e4-9c72-9407860f72c5.cdn.bspapp.com/newModel/md58/580001.glb"
- },
- methods: {
-
- }
- }
- </script>
-
- <style>
- page{
- background-color: #303030;
- background-repeat: no-repeat;
- background-size: 100%;
- background-image: url("https://mmbiz.qpic.cn/mmbiz_jpg/DWsjgNA1bNhdC11VLBgx2BWNTPV9IpOibepzbDy76xTme7ByunTCCPnafo2Y4I6hWz1PMlQxaSib6pmXu8C0IO5A/640?wx_fmt=jpeg&from=appmsg");
- }
- </style>
在onLoad()函数中,我们首先根据屏幕大小和pixelRatio重新设置的xr-frame组件的大小。
然后给url赋值为自己服务器中存储的模型链接地址。
这里给大家推荐一个微信小程序 3D模型素材库,这个小程序中的模型都是针对小程序优化后的glb格式文件,体积小,加载快,非常适合小程序使用
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。