Vue集成three.js并加载glb、gltf、FBX、json模型的场景分析

下面是针对"Vue集成three.js并加载glb、gltf、FBX、json模型的场景分析"的完整攻略,包括两个示例的说明。

Vue集成three.js并加载模型的场景分析

前言

Three.js是一个基于webgl开发的JavaScript 3D库,它能够让开发人员通过JS创建各种3D场景。同时,Vue则是一个较为流行的JavaScript开发框架,可以轻松地搭建Web应用。

在本篇文章中,我们将结合这两种技术,介绍如何在Vue中集成three.js,并成功加载gltf、glb、fbx和json模型。

准备工作

首先,我们需要创建一个Vue项目。可以使用如下命令:

vue create vue-threejs-model

运行上述命令后,在相应的目录下面,一个与项目名相同的文件夹便会被创建。

接下来,我们需要安装three.js。在终端中,运行如下命令:

cd vue-threejs-model
npm install three

在我们能够使用three.js之前,需要在项目中引入它。在main.js文件中,添加如下代码:

import * as THREE from 'three'

window.THREE = THREE // 特别注意:必须将three.js绑定在window对象上,否则在后面的GLTFLoader、FBXLoader和OrbitControls等模块中会找不到THREE

这样,我们就可以在Vue中使用three.js了。

加载模型

在本节中,我们将介绍如何加载gltf、glb、fbx和json模型。

GLTF/GLB

GLTF和GLB是行业标准的3D模型格式,在三维渲染领域中应用非常广泛。three.js中提供了GLTFLoader模块用于加载gltf/glb格式的3D模型。

import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'

const loader = new GLTFLoader()
loader.load('model.gltf', (gltf) => {
    scene.add(gltf.scene)
})

以上代码会将model.gltf文件加载到场景scene中。

GLTFLoader还提供了许多可选的属性,例如在此处增加使用代码:

const loader = new GLTFLoader()
loader.load('model.gltf', (gltf) => {
    gltf.scene.traverse((node) => {
        if (node instanceof THREE.Mesh) {
            // 设置材质
            node.material.side = THREE.DoubleSide // 可以看到内置表面
            node.material.transparent = true
            node.material.opacity = 0.8
        }
    })
    scene.add(gltf.scene)
}, undefined, (error) => {
    console.error(error)
})

这个示例演示了如何在模型加载完成后,遍历模型的所有子元素,以设置材质效果。同时,我们对于模型本身的信息,如 loading 、progress 和 error 等,三个回调函数都在对象内提供。不过,只有前两个回调函数是必须要的,否则如果在加载时出现错误,我们将无法收到错误信息。

FBX

FBX是另一个流行的3D模型格式,它由Autodesk开发并且广泛用于游戏和影视制作中。与GLTF一样,three.js中也提供了FBXLoader模块(需要单独安装)用于加载fbx格式的3D模型。

import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader'

const loader = new FBXLoader()
loader.load('model.fbx', (fbx) => {
    scene.add(fbx)
})

JSON

除GLTF、GLB和FBX外,three.js还支持JSON格式。JSON格式之所以老行业不推荐使用,是因为它需要多余的字符串量(甚至比二进制文件还要多),因此其体积相对较大。但是,在某些场景下,还是可以考虑使用JSON格式。

顾名思义,JSONLoader模块可以用于加载JSON格式的3D模型。

import { JSONLoader } from 'three'

const loader = new JSONLoader();

loader.load('model.json', (geometry, materials) => {
    const material = new THREE.MultiMaterial(materials)
    const mesh = new THREE.Mesh(geometry, material)
    scene.add(mesh)
})

总结

在本篇文章中,我们介绍了在Vue中集成three.js,以及如何成功加载不同格式的3D模型文件。不过,值得注意的是,当模型文件过大时,加载时可能会产生明显的延迟。因此,对于较大的模型,我们建议在loading过程中增加合适的预加载界面,从而增加用户体验。

示例代码

下面是一个基于Vue和three.js的简单示例代码:

<template>
  <div class="three-container">
    <div ref="dom" class="three-dom"></div>
  </div>
</template>

<style scoped>
  .three-container {
    width: 100%;
    height: 100%;
    overflow: hidden;
  }

  .three-dom {
    width: 100%;
    height: 100%;
  }
</style>

<script>
  import * as THREE from 'three'

  import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'
  import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'

  export default {
    name: 'ThreeContainer',

    data() {
      return {
        scene: null,
        renderer: null,
        camera: null,
        controls: null,
        group: null
      }
    },

    mounted() {
      this.initScene()
      this.animate()
    },

    methods: {
      initScene() {
        this.scene = new THREE.Scene()

        // 环境光
        const ambientLight = new THREE.AmbientLight(0x666666)
        this.scene.add(ambientLight)

        // 添加照相机
        this.camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 0.1, 1000)
        this.camera.position.set(0, 4, 10)
        this.scene.add(this.camera)

        // 添加渲染器
        this.renderer = new THREE.WebGLRenderer({
          antialias: true
        })
        this.renderer.setPixelRatio(window.devicePixelRatio)
        this.renderer.setSize(window.innerWidth, window.innerHeight)
        this.renderer.setClearColor(0x132c3e)
        this.$refs.dom.appendChild(this.renderer.domElement)

        // OrbitControls
        this.controls = new OrbitControls(this.camera, this.renderer.domElement)
        this.controls.enableDamping = true
        this.controls.dampingFactor = 0.2
        this.controls.screenSpacePanning = false
        this.controls.minDistance = 1
        this.controls.maxDistance = 10
        this.controls.maxPolarAngle = Math.PI / 2

        // 添加group
        this.group = new THREE.Group()
        this.scene.add(this.group)

        // 加载模型
        const loader = new GLTFLoader()
        loader.load('model.gltf', (gltf) => {
          gltf.scene.traverse((node) => {
            if (node instanceof THREE.Mesh) {
              node.material.side = THREE.DoubleSide
            }
          })

          this.group.add(gltf.scene)
        }, undefined, (error) => {
          console.error(error)
        })

        // 监听窗口大小变化
        window.addEventListener('resize', this.handleResize)
      },

      animate() {
        window.requestAnimationFrame(() => {
          this.animate()
        })

        this.controls.update()
        this.renderer.render(this.scene, this.camera)
      },

      handleResize() {
        this.camera.aspect = window.innerWidth / window.innerHeight
        this.camera.updateProjectionMatrix()

        this.renderer.setSize(window.innerWidth, window.innerHeight)
      }
    }
  }
</script>
<template>
  <div>
    <ThreeContainer />
  </div>
</template>

<script>
import ThreeContainer from '@/components/ThreeContainer'

export default {
  name: 'App',

  components: {
    ThreeContainer
  }
}
</script>

在index.html中加入CSS样式,全局设置height为100%:

<style>
  html, body {
    height: 100%;
    margin: 0;
  }
</style>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue集成three.js并加载glb、gltf、FBX、json模型的场景分析 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue 解决在element中使用$notify在提示信息中换行问题

    要在 element-ui 的 $notify 中进行换行,可以使用 html 标签进行内容换行。但是,直接在 $notify 中插入 html 标签会将其解析为字符串,而不是渲染成为 html 元素。因此许多人会通过使用 dangerouslyUseHTMLString 属性,来将 <br> 等 html 标签渲染为真正的 html 元素。 以…

    Vue 2023年5月27日
    00
  • Vue.js进阶知识点总结

    下面的回答会详细讲解Vue.js进阶知识点总结的完整攻略。 一、前言 Vue.js 是一个轻量级的前端 MVVM 框架,具有简单易上手、高效灵活等特点。针对Vue.js 进阶知识点的总结和学习,本篇文章针对四个方面的主题进行详细讲解: 响应式原理 组件化 动画效果 服务端渲染 二、响应式原理 Vue.js 中的响应式原理就是利用了 JavaScript 的 …

    Vue 2023年5月27日
    00
  • Vue2.0实现自适应分辨率

    下面我来详细讲解“Vue2.0实现自适应分辨率”的完整攻略。 1. 什么是自适应分辨率? 自适应分辨率指随着设备分辨率的变化而自动适应显示效果,实现在不同分辨率设备上呈现相同的视觉效果。 2. 如何实现自适应分辨率? 实现自适应分辨率的关键是通过响应式设计方法,在不同尺寸的设备上渲染相应的页面视图。Vue2.0框架提供了多种方法实现自适应分辨率,包括: 2.…

    Vue 2023年5月28日
    00
  • Vue.js如何获取data-*的值

    当我们需要在 Vue.js 中获取 HTML 标签上的 data-* 属性值时,我们可以通过以下两种方式实现: 方式一:在模板中使用 我们可以在 HTML 模板中使用 v-bind 指令或简写的 : 符号将 data-* 属性值绑定到 Vue.js 实例的数据对象中,然后通过数据对象的属性获取值。 HTML 模板代码: <div id="ap…

    Vue 2023年5月27日
    00
  • 基于Vue.js实现数字拼图游戏

    以下是“基于Vue.js实现数字拼图游戏”的完整攻略。 1. 准备工作 在开始编写数字拼图游戏之前,我们需要安装Vue.js和一些相关的依赖。可以使用以下命令进行安装: npm install -g vue-cli vue init webpack my-project cd my-project npm install 2. 组件开发 接下来我们需要编写数…

    Vue 2023年5月27日
    00
  • vue项目如何去掉URL中#符号的方法

    Vue.js是一个采用渐进式开发的JavaScript框架,路由系统使用的是Vue Router,该路由系统默认使用URL中的 “#”(hash) 字符来控制页面的跳转。但是,在某些场景下,我们想要去掉URL中的 # 符号。这里提供两种去掉 URL 中 # 符号的方法。 方法一:使用HTML5 History模式 HTML5 History模式会使用HTML…

    Vue 2023年5月27日
    00
  • vue3中使用Apache ECharts的详细方法

    在Vue3中使用Apache ECharts的方法,可以通过以下步骤来实现: 步骤1:安装ECharts 可以通过NPM来安装ECharts,输入以下命令来安装最新版本的ECharts: npm install echarts 步骤2:在Vue3中引入ECharts 可以在Vue3中使用ECharts,只需要在需要使用的组件中引入ECharts即可,例如: …

    Vue 2023年5月28日
    00
  • Vue 中批量下载文件并打包的示例代码

    要实现Vue中批量下载文件并打包,可以使用webpack和file-saver库。 安装file-saver库 首先需要安装file-saver库,可以使用npm进行安装,命令如下: npm install file-saver –save 创建download.js 创建一个download.js文件,包含一个方法downloadSingle(url, …

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部