当前位置: 代码网 > it编程>前端脚本>Vue.js > Vue+Three加载glb文件报错问题及解决

Vue+Three加载glb文件报错问题及解决

2024年10月28日 Vue.js 我要评论
报错加载glb的代码load3d() { const loader = new gltfloader() const dracoloader = new dracoloader()

报错

加载glb的代码

load3d() {
      const loader = new gltfloader()
      const dracoloader = new dracoloader()
      dracoloader.setdecoderpath('/draco/')
      dracoloader.preload()
      loader.setdracoloader(dracoloader)

      loader.load('/3d/city.glb', (gltf) => {
        this.scene.add(gltf.scene)
        this.renderer.render(this.scene, this.camera)
      }, (xhr) => {
        console.log((xhr.loaded / xhr.total) * 100 + '% loaded')
      }, (error) => {
        console.error(error)
      })
    }

解决方式

1. glb模型文件请放到public文件下,否则会无法查找到(打包后其他文件都会加上一串编码)

2. 前往node_modules文件下 找到three文件夹, 找到/examples/js/libs/draco/ 将draco整个文件夹复制下来

3. 将复制的draco文件夹复制到public文件夹内

const dracoloader = new dracoloader()
dracoloader.setdecoderpath('/draco/')

5. 大功告成

注意:

  • 请先保证场景摄像机和光源都是正确的
  • 3d/city.glb中的3d是我在public中创建的名为3d的文件夹

完整代码

<template>
  <section>
    <section id="container"></section>
  </section>
</template>

<script>
import * as three from 'three'
import { gltfloader } from 'three/examples/jsm/loaders/gltfloader'
import { orbitcontrols } from 'three/examples/jsm/controls/orbitcontrols'
import { dracoloader } from 'three/examples/jsm/loaders/dracoloader'
export default {
  name: 'index',
  data() {
    return {
      camera: null,
      scene: null,
      renderer: null,
      mesh: null
    }
  },
  mounted() {
    this.init()
    this.animate()
  },
  methods: {
    init() {
      const container = document.getelementbyid('container')
      this.camera = new three.perspectivecamera(90, container.clientwidth / container.clientheight, 0.1, 10000)
      this.renderer = new three.webglrenderer({ antialias: true })

      this.camera.position.set(200, 200, 400)

      this.scene = new three.scene()

      this.renderer.setclearcolor(new three.color(0xf7f2f1))
      this.renderer.setsize(container.clientwidth, container.clientheight)
      this.renderer.shadowmap.enabled = true

      container.appendchild(this.renderer.domelement)

      this.controls = new orbitcontrols(this.camera, this.renderer.domelement)
      this.controls.target = new three.vector3(0, 0, 0)

      this.loadlight()
      this.load3d()
    },
    load3d() {
      const loader = new gltfloader()
      const dracoloader = new dracoloader()
      dracoloader.setdecoderpath('/draco/')
      dracoloader.preload()
      loader.setdracoloader(dracoloader)

      loader.load('/3d/city.glb', (gltf) => {
        this.scene.add(gltf.scene)
        this.renderer.render(this.scene, this.camera)
      }, (xhr) => {
        console.log((xhr.loaded / xhr.total) * 100 + '% loaded')
      }, (error) => {
        console.error(error)
      })
    },
    loadlight() {
      // 点光源
      // const point = new three.pointlight(0xffffff)
      // point.position.set(4000, 4000, 4000) // 点光源位置
      // this.scene.add(point) // 点光源添加到场景中
      // 环境光
      const ambient = new three.ambientlight(0xffffff)
      this.scene.add(ambient)
    },
    animate() {
      requestanimationframe(this.animate)
      this.renderer.render(this.scene, this.camera)
    }
  }
}
</script>

<style scoped>
  #container {
    width: 100%;
    height: calc(100vh - 84px);
  }
</style>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com