在 Vue 中使用 Three.js 渲染 GLB 格式模型

在 Vue 项目中渲染 GLB 格式的 3D 模型需要结合 Three.js 和 GLTFLoader。以下是完整的实现步骤:

  1. 安装必要的依赖
    首先安装 Three.js 和 GLTFLoader:
npm install three @types/three
  1. 页面中加载和渲染 GLB 模型
    (glb模型放入本地/assets/public文件夹下了)
<template>
  <div ref="container" style="width: 100%; height: 100vh;"></div>
</template>

<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue';
import * as THREE from 'three';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
import url from '@/assets/public/jizu.glb'

const container = ref(null);

let scene, camera, renderer, controls, animationId;

onMounted(() => {
  // 1. 初始化场景
  scene = new THREE.Scene();
  scene.background = new THREE.Color(0xaaaaaa);

  // 2. 初始化相机
  const width = container.value.clientWidth;
  const height = container.value.clientHeight;
  camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 1000);
  camera.position.set(0, 2, 5);

  // 3. 初始化渲染器
  renderer = new THREE.WebGLRenderer({ antialias: true });
  renderer.setSize(width, height);
  container.value.appendChild(renderer.domElement);

  // 4. 添加光源
  const ambientLight = new THREE.AmbientLight(0xffffff, 0.6);
  scene.add(ambientLight);

  const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);
  directionalLight.position.set(5, 10, 7);
  scene.add(directionalLight);

  // 5. 添加轨道控制器
  controls = new OrbitControls(camera, renderer.domElement);
  controls.target.set(0, 1, 0);
  controls.update();

  // 6. 加载 GLB 模型
  const loader = new GLTFLoader();
  console.log(loader,'111')
  loader.load(
    url, // 替换成你的模型路径
    (gltf) => {
      console.log(gltf,'222')
      scene.add(gltf.scene);
    },
    undefined,
    (error) => {
      console.error('加载模型失败:', error);
    }
  );

  // 7. 动画循环
  function animate() {
    animationId = requestAnimationFrame(animate);
    controls.update();
    renderer.render(scene, camera);
  }
  animate();

  // 8. 监听窗口大小变化
  window.addEventListener('resize', onWindowResize);
});

function onWindowResize() {
  if (!container.value) return;
  const width = container.value.clientWidth;
  const height = container.value.clientHeight;
  camera.aspect = width / height;
  camera.updateProjectionMatrix();
  renderer.setSize(width, height);
}

onBeforeUnmount(() => {
  window.removeEventListener('resize', onWindowResize);
  cancelAnimationFrame(animationId);
  controls.dispose();
  renderer.dispose();
  // 清理场景中的所有对象,防止内存泄漏
  scene.traverse((obj) => {
    if (obj.geometry) obj.geometry.dispose();
    if (obj.material) {
      if (Array.isArray(obj.material)) {
        obj.material.forEach((m) => m.dispose());
      } else {
        obj.material.dispose();
      }
    }
  });
  scene.clear();
});
</script>

如果使用的是vite可能会报错,在vite.config.js文件下加入:assetsInclude: ['**/*.glb'], // 明确包含GLB文件

import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
  assetsInclude: ['**/*.glb'], // 明确包含GLB文件
  server: {
    https: false,
    // host: "0.0.0.0",
    port: 9001,
    open: true,
    cors: true,
    strictPort: false,
    proxy: {
      '/api': {
        target: 'http://1.117.236.127',
        changeOrigin: true,
        rewrite: (path) => path.replace("/api", "")
      },
    }
  },
})
### 在 Vue使用 Three.js 加载 GLB 模型 为了在 Vue 项目中集成并展示 GLB 模型,需遵循特定流程来配置开发环境以及编写相应代码。以下是具体实现方式: #### 安装依赖库 确保 Node.js 已经安装完毕之后,在终端执行如下指令完成所需包的下载与安装: ```bash npm init -y npm install vue three @vue/composition-api gltfjsx three-gltf-loader ``` 上述命令不仅引入了 `three` 库用于三维渲染支持,还加入了专门处理 `.glb` 文件类型的加载器——`three-gltf-loader`。 #### 初始化 Vue 组件结构 创建一个新的 Vue 单文件组件(`.vue`),定义好 HTML 结构部分,准备放置 canvas 元素作为 Three.js 的绘图区域。 ```html <template> <div id="app"> <canvas ref="myCanvas"></canvas> </div> </template> <script> import * as THREE from 'three'; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'; export default { name: 'App', mounted() { this.init(); }, methods: { async init() { const scene = new THREE.Scene(); // 设置相机视角 const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); // 创建WebGLRenderer实例,并指定其尺寸大小 const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true, canvas: this.$refs.myCanvas }); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // 添加轨道控制器以便交互操作模型 const controls = new OrbitControls(camera, renderer.domElement); // 调整摄像机位置 camera.position.z = 5; // 加载 .glb 模型 const loader = new GLTFLoader().setPath('/models/'); await loader.loadAsync('model.glb').then((gltf) => { scene.add(gltf.scene); }); // 渲染循环函数 function animate() { requestAnimationFrame(animate); // 更新控制状态 controls.update(); renderer.render(scene, camera); } animate(); } } } </script> <style scoped> #app { width: 100%; height: 100vh; } canvas { display:block; } </style> ``` 这段代码展示了如何在一个简单的 Vue 组件里初始化 Three.js 场景、设置透视投影相机、添加轨道控制器允许用户旋转缩放查看模型、并通过 `GLTFLoader` 来异步加载外部的 `.glb` 格式的3D对象[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sunshinedada

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值