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

 更新时间:2024年10月04日 10:21:04   作者:名字太难随便取了  
当使用Three.js加载GLB模型时,遇到加载错误常常是路径问题,解决方案:1. 将GLB模型文件置于public目录,避免打包时路径编码变化;2. 从node_modules的three库中复制draco解码器至public目录;3. 确认场景、摄像机和光源设置正确

报错

加载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>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue程序化的事件监听器(实例方案详解)

    Vue程序化的事件监听器(实例方案详解)

    本文通过两种方案给大家介绍了Vue程序化的事件监听器,每种方案通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2020-01-01
  • vue图片裁剪插件vue-cropper使用方法详解

    vue图片裁剪插件vue-cropper使用方法详解

    这篇文章主要为大家详细介绍了vue图片裁剪插件vue-cropper使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • vue3如何使用element-plus的dialog

    vue3如何使用element-plus的dialog

    这篇文章主要介绍了vue3优雅的使用element-plus的dialog,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • 前端vue中实现嵌入代码编辑器的详细代码

    前端vue中实现嵌入代码编辑器的详细代码

    随着Web技术的不断发展,前端开发也正日新月异,下面这篇文章主要给大家介绍了关于前端vue中实现嵌入代码编辑器的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • Vue组件库ElementUI实现表格列表分页效果

    Vue组件库ElementUI实现表格列表分页效果

    这篇文章主要为大家详细介绍了Vue组件库ElementUI实现表格列表分页效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • Vue项目中实现描点跳转scrollIntoView的案例

    Vue项目中实现描点跳转scrollIntoView的案例

    这篇文章主要介绍了Vue项目中实现描点跳转scrollIntoView的案例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Vue IP地址输入框实例代码

    Vue IP地址输入框实例代码

    本文通过实例代码给大家介绍Vue IP地址输入框实现,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-10-10
  • 整理项目中vue.config.js打包优化配置方法

    整理项目中vue.config.js打包优化配置方法

    这篇文章主要介绍了整理项目中vue.config.js打包优化,包括配置 webpack-bundle-analyzer 插件查看文件大小及配置compression-webpack-plugin 用gzip压缩打包的文件大小,本文结合实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 解决vue 中 echart 在子组件中只显示一次的问题

    解决vue 中 echart 在子组件中只显示一次的问题

    vue推荐组件化开发,所以就把每个图表封装成子组件,然后在需要用到该图表的父组件中直接使用。接下来给大家介绍vue 中 echart 在子组件中只显示一次的问题,需要的朋友参考下吧
    2018-08-08
  • Vue纯前端实现导出excel中的图片与文件超链接

    Vue纯前端实现导出excel中的图片与文件超链接

    这篇文章主要为大家详细介绍了Vue如何纯前端实现导出excel中的图片与文件超链接,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下
    2025-03-03

最新评论