当前位置: 首页 > web >正文

在 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", "")},}},
})
http://www.xdnf.cn/news/6554.html

相关文章:

  • antd 主题色定制
  • C++(12):using声明
  • 智能包装机控制终端技术方案:基于EFISH-SCB-RK3588/SAIL-RK3588的全场景国产化替代解析
  • Console Importer浏览器插件的编译 及 制作成.crx浏览器插件的步骤
  • electron进程通信
  • 128.在 Vue 3 中使用 OpenLayers 实现绘制矩形截图并保存地图区域
  • 关于xammp数据库打开不了,但是日志没错误的问题解决以及其数据库的备份
  • 如何利用 Python 爬虫按关键字搜索京东商品:实战指南
  • Docker 安装 MySQL8
  • OpenCV 图像直方图:从原理剖析到实战应用
  • linux系统服务
  • Qt信号槽机制与UI设计完全指南:从基础原理到实战应用
  • 【笔试训练】简单写词|dd爱框框|除2!
  • Cursor无法使用C/C++调试的解决办法
  • Ubuntu使用Docker搭建SonarQube企业版(含破解方法)
  • Hugging Face 中 LeRobot 使用的入门指南
  • LangChain4j +DeepSeek大模型应用开发——10 检索增强生成 RAG
  • Ubuntu下配置VScode出现#include错误请更新includePath的解决方法
  • Java类一文分解:JavaBean,工具类,测试类的深度剖析
  • 汽车零部件冲压车间MES一体机解决方案
  • 卷积神经网络和深度神经网络的区别是什么?
  • 数据结构与算法-线性表-单链表(Linked List)
  • OSCP备战-kioptrix 2014详细步骤
  • 第三十一节:直方图处理-直方图反向投影
  • 题目:两个线程交替输出1-100的数字,例如:t1--》1,t2--》2,....
  • 最小生成树(竞赛)
  • python基础语法(三-上)
  • 技术文档:变频器干扰问题与解决方案
  • 印度全印度游戏联合会(AIGF)介绍与用途
  • 本地化部署HomeAssistant语音助手并接入DeepSeek