当前位置:   article > 正文

uniApp中使用小程序XR-Frame创建3D场景(2)加载模型

uniApp中使用小程序XR-Frame创建3D场景(2)加载模型

上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用,只完成了简单的环境搭建,这篇文章讲解如何加载3D模型。

1 加入模型加载标签

在XR-Frame框架中,加载资源都是在wxml文件的标签中实现的。下面是wxml中完整的代码

index.wxml

  1. <xr-scene render-system="alpha:true" bind:ready="handleReady">
  2. <xr-assets>
  3. <xr-asset-load type="gltf" asset-id="gltf-model" src="{{url}}" options="ignoreError:-1"/>
  4. </xr-assets>
  5. <xr-node>
  6. <xr-gltf node-id="gltf-model" bind:gltf-loaded="handleGLTFLoaded" model="gltf-model"></xr-gltf>
  7. </xr-node>
  8. <xr-light type="ambient" color="1 1 1" intensity="2" />
  9. <xr-light type="spot" position="3 3 3" color="1 1 1" range="3" intensity="5" />
  10. <xr-camera id="camera" clear-color="0 0 0 0" position="1 1 2" target="gltf-model" camera-orbit-control/>
  11. </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>,分别是环境光和聚光灯。

2.动态加载外部模型

在wxml文件中,我们将<xr-asset-load> 标签中属性src的值绑定为一个变量为 url

这样,我们就需要在index.js 文件中给这个变量赋一个初始值

index.js

  1. Component({
  2. properties: {
  3. url: {
  4. type: String,
  5. value: ''
  6. }
  7. },
  8. data: {
  9. },
  10. methods: {
  11. handleGLTFLoaded() {
  12. console.log('模型加载完成')
  13. wx.hideLoading()
  14. },
  15. }
  16. })

这部分代码比较简单,这里给url赋值为空,然后我们在父组件中给这个变量赋值为对应的模型地址,这样就可以动态的加载模型。

代码中还有一个handleGLTFLoaded()方法,这个方法是在wxml文件中<xr-gltf>标签内绑定的加载模型完成后调用的回调函数。我们可以在这个函数中根据场景再对模型做一些微调。

3.父组件给子组件赋值

通过上面两步,子组件的代码已经编写完成。下面我们只需要在调用xr-frame的页面给子组件的url属性赋值即可。

index.vue

  1. <template>
  2. <view style="display: flex;flex-direction: column;">
  3. <xr-start id="main-frame" disable-scroll
  4. :url="url"
  5. :width="renderWidth"
  6. :height="renderHeight"
  7. :style="'width:'+width+'px;height:'+height+'px;'">
  8. </xr-start>
  9. </view>
  10. </template>
  11. <script>
  12. export default {
  13. data() {
  14. return {
  15. url:"https://mp-f8b2202e-3122-48e4-9c72-9407860f72c5.cdn.bspapp.com/newModel/md58/580001.glb",
  16. width:300,
  17. height:300,
  18. renderWidth:300,
  19. renderHeight:300,
  20. }
  21. },
  22. onLoad(option){
  23. uni.showLoading({
  24. title:'模型加载中...'
  25. })
  26. this.width = uni.getWindowInfo().windowWidth
  27. this.height = uni.getWindowInfo().windowHeight
  28. const dpi = uni.getWindowInfo().pixelRatio
  29. this.renderWidth = this.width * dpi
  30. this.renderHeight = this.height * dpi
  31. this.url = "https://mp-f8b2202e-3122-48e4-9c72-9407860f72c5.cdn.bspapp.com/newModel/md58/580001.glb"
  32. },
  33. methods: {
  34. }
  35. }
  36. </script>
  37. <style>
  38. page{
  39. background-color: #303030;
  40. background-repeat: no-repeat;
  41. background-size: 100%;
  42. background-image: url("https://mmbiz.qpic.cn/mmbiz_jpg/DWsjgNA1bNhdC11VLBgx2BWNTPV9IpOibepzbDy76xTme7ByunTCCPnafo2Y4I6hWz1PMlQxaSib6pmXu8C0IO5A/640?wx_fmt=jpeg&amp;from=appmsg");
  43. }
  44. </style>

onLoad()函数中,我们首先根据屏幕大小和pixelRatio重新设置的xr-frame组件的大小。

然后给url赋值为自己服务器中存储的模型链接地址。

这里给大家推荐一个微信小程序 3D模型素材库,这个小程序中的模型都是针对小程序优化后的glb格式文件,体积小,加载快,非常适合小程序使用

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/323567
推荐阅读
相关标签
  

闽ICP备14008679号