news 2026/4/18 4:57:22

Vue 3 中集成 Three.js 场景的完整实践指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue 3 中集成 Three.js 场景的完整实践指南

本文详解如何在 vue 3(javascript 版本)项目中正确集成 three.js 基础场景,涵盖 dom 挂载、生命周期协调、渲染循环管理及常见陷阱规避。 本文详解如何在 vue 3(javascript 版本)项目中正确集成 three.js 基础场景,涵盖 dom 挂载、生命周期协调、渲染循环管理及常见陷阱规避。在 Vue 3 的响应式架构下直接嵌入 Three.js 渲染逻辑,需特别注意 DOM 元素可用性、渲染器生命周期与 Vue 组件生命周期的协同。原生 Three.js 示例依赖 document.body.appendChild(),但在 Vue 单文件组件(SFC)中,必须通过 ref 获取真实 DOM 节点,并在 onMounted 钩子中安全挂载渲染器——这是避免 Cannot read property 'appendChild' of null 等错误的关键。以下是一个可直接运行的 App.vue 完整实现(使用 JavaScript,非 TypeScript):<script setup>import { ref, onMounted, onUnmounted } from 'vue';import * as THREE from 'three';// 创建 DOM 引用容器const target = ref();// 初始化 Three.js 核心对象const scene = new THREE.Scene();const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000);const renderer = new THREE.WebGLRenderer({ antialias: true });renderer.setSize(500, 500); // 推荐显式设置尺寸,避免默认拉伸renderer.setPixelRatio(window.devicePixelRatio); // 提升高 DPI 屏幕显示质量// 创建绿色立方体const geometry = new THREE.BoxGeometry(1, 1, 1);const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });const cube = new THREE.Mesh(geometry, material);scene.add(cube);camera.position.z = 5;// 动画循环函数(闭包内维持引用,避免重复创建)let animationId = null;function animate() { animationId = requestAnimationFrame(animate); cube.rotation.x += 0.01; cube.rotation.y += 0.01; renderer.render(scene, camera);}// 组件挂载后:挂载渲染器 DOM 并启动动画onMounted(() => { if (target.value) { target.value.appendChild(renderer.domElement); animate(); }});// 【重要】组件卸载前清理资源,防止内存泄漏onUnmounted(() => { if (animationId) { cancelAnimationFrame(animationId); } if (renderer.domElement && renderer.domElement.parentNode) { renderer.domElement.parentNode.removeChild(renderer.domElement); } renderer.dispose(); // 释放 WebGL 资源});</script><template> <div ref="target" class="three-container"></div></template><style scoped>.three-container { width: 500px; height: 500px; margin: 2rem auto; border: 1px solid #eee;}</style>? 关键要点说明: ref + onMounted 是黄金组合:确保 renderer.domElement 只在真实 DOM 节点就绪后才插入; 显式 setSize() 优于 renderer.setSize(window.innerWidth, ...):避免因响应式容器尺寸变化导致渲染异常,推荐结合 CSS 控制容器宽高,Three.js 渲染器按需适配; 务必调用 renderer.dispose() 和 cancelAnimationFrame:Vue 组件可能被复用或销毁,未清理的动画帧和 WebGL 上下文将引发内存泄漏; 添加 antialias: true 和 setPixelRatio:显著提升视觉质量,尤其在 Retina 屏幕上; 避免在 setup() 顶层执行渲染逻辑:Three.js 对象(如 scene, camera)可定义在顶层,但 DOM 操作与动画启动必须延迟至 onMounted。? 进阶提示:如需响应窗口缩放,可监听 window.resize 事件并更新 camera.aspect 与 renderer.setSize(),但需注意防抖以避免高频重绘。 Zeemo AI 一款专业的视频字幕制作和视频处理工具

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 4:56:24

深入解析Scaramuzza/ocam全向相机内参模型:从理论到实践

1. Scaramuzza/ocam全向相机模型的核心思想 第一次接触Scaramuzza模型时&#xff0c;我被它独特的建模思路惊艳到了。与传统的针孔相机模型或者鱼眼相机模型不同&#xff0c;Scaramuzza模型采用泰勒多项式来描述3D空间点到2D像素坐标的映射关系。这种做法的精妙之处在于&#x…

作者头像 李华
网站建设 2026/4/18 4:55:37

2026届学术党必备的六大降重复率方案实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 抑制 AIGC&#xff08;人工智能生成内容&#xff09;检测比率之时&#xff0c;关键之处在于削…

作者头像 李华
网站建设 2026/4/18 4:55:35

独立开发者必看:像素幻梦如何3步生成可商用像素头像/图标/场景图

独立开发者必看&#xff1a;像素幻梦如何3步生成可商用像素头像/图标/场景图 1. 像素幻梦简介 像素幻梦&#xff08;Pixel Dream Workshop&#xff09;是一款基于FLUX.1-dev扩散模型的像素艺术生成工具&#xff0c;专为独立开发者、游戏创作者和数字艺术家设计。它采用明亮的…

作者头像 李华
网站建设 2026/4/18 4:52:49

为什么92%的企业误读了奇点AI重构建议?20年架构老兵逐条批注2026大会原声稿(附避坑 checklist)

第一章&#xff1a;92%企业误读奇点AI重构建议的根源诊断 2026奇点智能技术大会(https://ml-summit.org) 当前&#xff0c;超九成企业将“奇点AI重构”窄化为模型替换或算力扩容&#xff0c;却忽视其本质是组织认知范式与系统耦合逻辑的双重跃迁。这一误读并非源于技术理解不…

作者头像 李华
网站建设 2026/4/18 4:49:29

5分钟快速激活Windows和Office:KMS_VL_ALL_AIO智能激活脚本终极指南

5分钟快速激活Windows和Office&#xff1a;KMS_VL_ALL_AIO智能激活脚本终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否还在为Windows系统或Office办公软件的激活问题而烦恼&…

作者头像 李华
网站建设 2026/4/18 4:48:57

深入解析TMS320F2803x DSP的ePWM模块:从基础配置到高级应用

1. ePWM模块基础概念与核心功能 TMS320F2803x DSP的增强型脉宽调制&#xff08;ePWM&#xff09;模块是电机控制、电源转换等实时控制系统的核心外设。我第一次接触这个模块时&#xff0c;被它灵活的设计所震撼——它不仅能生成精确的PWM波形&#xff0c;还能实现多模块协同工作…

作者头像 李华