vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > Three.js引入模型格式.fbx、.glb

Vue中使用Three.js引入模型格式(.fbx、.glb)的实现步骤

作者:码上前端

最近刚开始做的一个项目,后面有个模块要通过three.js实现3D的场景,因为之前也没接触过3D这块,就提前学了一下,做个记录,这篇文章主要介绍了Vue中使用Three.js引入模型格式(.fbx、.glb)的实现步骤,需要的朋友可以参考下

引言

在现代 Web 开发中,3D 可视化的需求日益增长。Three.js 作为一个强大的 JavaScript 3D 库,为开发者提供了创建和展示 3D 场景的便捷方式。而 Vue.js 是一款流行的前端框架,以其响应式数据绑定和组件化开发的特性,极大地提高了开发效率。将 Three.js 与 Vue.js 结合使用,能够让我们在 Vue 项目中轻松实现 3D 场景的展示。本文将详细介绍如何在 Vue 项目中使用 Three.js 引入不同格式的 3D 模型,主要包括 .fbx 和 .glb 格式。

环境准备

1. 创建 Vue 项目

首先,确保你已经安装了 Vue CLI。如果还未安装,可以使用以下命令进行安装:

npm install -g @vue/cli

然后,创建一个新的 Vue 项目:

vue create threejs-vue-model-loader
cd threejs-vue-model-loader

2. 安装 Three.js 及相关依赖

在项目根目录下,使用以下命令安装 Three.js:

npm install three

对于不同的模型格式,我们还需要安装相应的加载器。以 .fbx 和 .glb 为例,分别需要引入 FBXLoader 和 GLTFLoader

实现步骤

1. 创建 Vue 组件

在 src/components 目录下创建一个名为 ThreeModelLoader.vue 的组件,以下是完整的代码及详细注释:

<template>
  <!-- 用于渲染 Three.js 场景的容器 -->
  <div ref="container" style="width: 100%; height: 600px;"></div>
</template>

<script>
import * as THREE from 'three';
// 导入 FBX 模型加载器
import { FBXLoader } from 'three/addons/loaders/FBXLoader.js';
// 导入 GLTF 模型加载器
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';

export default {
  name: 'ThreeModelLoader',
  data() {
    return {
      scene: null, // Three.js 场景对象
      camera: null, // 相机对象
      renderer: null, // 渲染器对象
      controls: null, // 相机控制器对象
      fbxModel: null, // 存储加载的 FBX 模型
      glbModel: null, // 存储加载的 GLB 模型
    };
  },
  mounted() {
    this.initThree(); // 初始化 Three.js 场景
    this.loadFBXModel(); // 加载 FBX 模型
    this.loadGLBModel(); // 加载 GLB 模型
    this.animate(); // 启动动画循环
  },
  methods: {
    initThree() {
      // 创建场景
      this.scene = new THREE.Scene();

      // 创建透视相机
      this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / 600, 0.1, 1000);
      this.camera.position.z = 5;

      // 创建渲染器
      this.renderer = new THREE.WebGLRenderer();
      this.renderer.setSize(window.innerWidth, 600);
      // 将渲染器的 DOM 元素添加到容器中
      this.$refs.container.appendChild(this.renderer.domElement);

      // 创建轨道控制器,方便用户交互
      const OrbitControls = require('three/addons/controls/OrbitControls.js').OrbitControls;
      this.controls = new OrbitControls(this.camera, this.renderer.domElement);

      // 添加环境光,使场景更明亮
      const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
      this.scene.add(ambientLight);

      // 添加平行光,增强场景的立体感
      const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);
      directionalLight.position.set(1, 1, 1);
      this.scene.add(directionalLight);

      // 监听窗口大小变化,更新相机和渲染器
      window.addEventListener('resize', this.onWindowResize);
    },
    loadFBXModel() {
      const loader = new FBXLoader();
      // 替换为你的 FBX 模型文件路径
      loader.load('/path/to/your/model.fbx', (object) => {
        this.fbxModel = object;
        // 设置模型的位置
        this.fbxModel.position.set(-2, 0, 0);
        this.scene.add(this.fbxModel);
      }, undefined, (error) => {
        console.error('FBX 模型加载失败:', error);
      });
    },
    loadGLBModel() {
      const loader = new GLTFLoader();
      // 替换为你的 GLB 模型文件路径
      loader.load('/path/to/your/model.glb', (gltf) => {
        this.glbModel = gltf.scene;
        // 设置模型的位置
        this.glbModel.position.set(2, 0, 0);
        this.scene.add(this.glbModel);
      }, undefined, (error) => {
        console.error('GLB 模型加载失败:', error);
      });
    },
    animate() {
      // 请求下一帧动画
      requestAnimationFrame(this.animate);

      // 更新控制器
      this.controls.update();

      // 渲染场景
      this.renderer.render(this.scene, this.camera);
    },
    onWindowResize() {
      // 更新相机的投影矩阵
      this.camera.aspect = window.innerWidth / 600;
      this.camera.updateProjectionMatrix();

      // 更新渲染器的大小
      this.renderer.setSize(window.innerWidth, 600);
    },
  },
  beforeDestroy() {
    // 移除窗口大小变化的监听器
    window.removeEventListener('resize', this.onWindowResize);
    // 销毁控制器
    this.controls.dispose();
    // 销毁渲染器
    this.renderer.dispose();
    // 移除场景中的模型
    if (this.fbxModel) {
      this.scene.remove(this.fbxModel);
    }
    if (this.glbModel) {
      this.scene.remove(this.glbModel);
    }
  },
};
</script>

<style scoped>
/* 可以添加一些样式 */
</style>

2. 在 App.vue 中使用组件

打开 src/App.vue 文件,将 ThreeModelLoader 组件引入并使用:

<template>
  <div id="app">
    <ThreeModelLoader />
  </div>
</template>

<script>
import ThreeModelLoader from './components/ThreeModelLoader.vue';

export default {
  name: 'App',
  components: {
    ThreeModelLoader,
  },
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

3. 代码解释

初始化 Three.js 场景

在 initThree 方法中,我们完成了以下操作:

加载 FBX 模型

在 loadFBXModel 方法中,我们使用 FBXLoader 加载 FBX 模型。通过调用 loader.load 方法,传入模型文件的路径、加载成功的回调函数和加载失败的回调函数。在加载成功的回调函数中,将模型添加到场景中,并设置其位置。

加载 GLB 模型

在 loadGLBModel 方法中,我们使用 GLTFLoader 加载 GLB 模型。同样通过调用 loader.load 方法,传入模型文件的路径、加载成功的回调函数和加载失败的回调函数。在加载成功的回调函数中,将模型的场景对象添加到场景中,并设置其位置。

动画循环

在 animate 方法中,使用 requestAnimationFrame 实现动画循环。在每一帧中,更新控制器并渲染场景。

窗口大小变化处理

在 onWindowResize 方法中,更新相机的投影矩阵和渲染器的大小,以确保场景在不同窗口大小下都能正确显示。

资源清理

在 beforeDestroy 方法中,移除窗口大小变化的监听器,销毁控制器和渲染器,并从场景中移除加载的模型,避免内存泄漏。

运行项目

在项目根目录下,使用以下命令启动开发服务器:

npm run serve

打开浏览器,访问 http://localhost:8080,你将看到加载的 FBX 和 GLB 模型,并且可以通过鼠标交互控制相机视角。

总结

通过以上步骤,我们成功在 Vue 项目中使用 Three.js 引入了不同格式的 3D 模型。在实际开发中,你可以根据需要调整模型的位置、大小和姿态,还可以添加更多的交互效果和动画,以实现更加丰富的 3D 场景展示。

参考资料

到此这篇关于Vue中使用Three.js引入模型格式(.fbx、.glb)的文章就介绍到这了,更多相关Three.js引入模型格式.fbx、.glb内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文