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

yizhihongxing

下面是针对"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中data里面的数据相互使用方式

    Vue是一款流行的前端框架。data对象是Vue组件中的一个非常重要的属性。在Vue组件中,我们可以定义数据、方法、计算属性等。data对象中定义的数据可以在Vue实例的模板中使用,也可以在Vue组件中的方法或计算属性中进行操作。 下面是在Vue中使用data里面的数据的几种方式: 直接使用 最基本的使用方法,就是在Vue实例或组件中使用this关键字直接访…

    Vue 2023年5月28日
    00
  • 解决vue单页面应用进入页面加载所有 js 的问题

    解决 Vue 单页面应用进入页面加载所有 js 的问题需要使用到 webpack 的代码分割功能。 Webpack 提供了代码分割功能,通过将应用中的代码分割成多个块(chunk),可以实现按需加载,减少首次加载时间。 以下是详细攻略: 步骤一:配置 webpack 在 webpack.config.js 中进行配置,启用代码分割功能,并将其设置为按需加载。…

    Vue 2023年5月28日
    00
  • vue实现五子棋游戏

    实现五子棋游戏可以通过Vue框架实现。下面是实现五子棋游戏的流程: 初始化项目 首先,创建一个新的Vue项目,并安装项目所需要的依赖。安装依赖后进行如下配置,将vue.config.js文件的publicPath属性设置为空字符串。 module.exports = { publicPath: ” } 创建五子棋游戏界面 创建五子棋游戏所需要的界面,包括棋…

    Vue 2023年5月29日
    00
  • Vue.js和Vue.runtime.js区别浅析

    Vue.js和Vue.runtime.js区别浅析 在学习 Vue.js 时,我们经常听到“Vue.js”和“Vue.runtime.js”这两个术语。这两个概念的区别是什么呢?在本文中,我们将对此进行深入探讨。 Vue.js Vue.js 是一个创建 Web 应用程序的开源 JavaScript 框架。Vue.js 的核心是一个响应式的数据绑定系统和一个组…

    Vue 2023年5月29日
    00
  • vant使用datetime-picker组件设置maxDate和minDate的坑及解决

    关于“vant使用datetime-picker组件设置maxDate和minDate的坑及解决”的攻略,我整理了如下内容: 问题描述 在使用Vant组件库中的DateTimePicker组件时,需要设置maxDate和minDate参数控制可选范围。但是,这两个参数的设定并不是特别顺利,可能会出现一些问题,例如: 输入的日期不符合要求,仍然可以选择 只有时…

    Vue 2023年5月29日
    00
  • Vue中使用vux的配置详解

    Vue.js 是一个流行的前端框架,Vux 是一个基于 Vue.js 的 UI 组件库。在 Vue.js 项目中使用 Vux 可以快速构建出美观易用的 UI 界面,有效提高开发效率。如何在 Vue.js 中使用 Vux 呢?本攻略将提供一份详细的配置方案来指导你完成这个过程。 1. 安装 Vux 首先,你需要使用 npm 或 yarn 来安装 Vux。在命令…

    Vue 2023年5月28日
    00
  • 前端vue a链接下载文件失败的问题(未发现文件)

    针对vue前端下载文件失败的问题,常见的原因有以下几种: 后端没有处理下载请求的接口,或者接口存在问题; 前端对于下载请求的处理未能正确执行。 针对第一种情况,需要检查后端是否提供对应的下载接口,并且接口返回的文件地址是否正确。可以通过postman等工具模拟请求该接口,检查返回的数据是否符合预期。 针对前端对于下载请求的处理问题,常见的一种错误是只处理了应…

    Vue 2023年5月28日
    00
  • vue+ts下对axios的封装实现

    下面就详细讲解“vue+ts下对axios的封装实现”的完整攻略: 一、安装Axios 首先,在项目根目录下执行以下命令安装axios和@types/axios: npm install axios @types/axios –save 安装完成后,在vue项目中引入axios: import Axios from ‘axios’; 二、创建axios实例…

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