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

Three.js在vue中的使用(二)-加载、控制

在 Vue 中使用 Three.js 加载模型、控制视角、添加点击事件是构建 3D 场景的常见需求。下面是一个完整的示例,演示如何在 Vue 单文件组件中实现以下功能:

  • 使用 GLTFLoader 加载 .glb/.gltf 模型
  • 添加 OrbitControls 控制视角(旋转、缩放、平移)
  • 给模型添加点击事件

使用的技术栈

  • Vue 3 + Composition API(或 Vue 2)
  • Three.js 核心库
  • three/examples/js/loaders/GLTFLoader
  • three/examples/js/controls/OrbitControls

📦 安装依赖(如未安装)

npm install three
npm install three-gltf-loader  # 或直接引入 GLTFLoader

示例代码:Vue 单文件组件

<template><div class="model-viewer-container" ref="viewerContainer"></div>
</template><script setup>
import { ref, onMounted } from 'vue'
import * as THREE from 'three'
import { OrbitControls } from 'three/addons/controls/OrbitControls.js'
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'const viewerContainer = ref(null)let scene, camera, renderer, controls, modelfunction init() {// 创建场景scene = new THREE.Scene()scene.background = new THREE.Color(0xeeeeee)// 创建相机const width = viewerContainer.value.clientWidthconst height = viewerContainer.value.clientHeightcamera = new THREE.PerspectiveCamera(45, width / height, 0.1, 1000)camera.position.set(0, 2, 5)// 创建渲染器renderer = new THREE.WebGLRenderer({ antialias: true })renderer.setSize(width, height)renderer.setPixelRatio(window.devicePixelRatio)viewerContainer.value.appendChild(renderer.domElement)// 添加光源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.5)scene.add(directionalLight)// 添加控制器controls = new OrbitControls(camera, renderer.domElement)controls.enableDamping = true// 加载模型const loader = new GLTFLoader()loader.load('/models/test.glb', // 替换为你的模型路径(gltf) => {model = gltf.scenescene.add(model)// 添加点击事件监听window.addEventListener('click', onClick)},undefined,(error) => {console.error('An error occurred while loading the model:', error)})// 渲染循环function animate() {requestAnimationFrame(animate)controls.update()renderer.render(scene, camera)}animate()
}// 点击事件处理函数
function onClick(event) {if (!model) return// 计算鼠标归一化坐标const mouse = new THREE.Vector2()mouse.x = (event.clientX / window.innerWidth) * 2 - 1mouse.y = -(event.clientY / window.innerHeight) * 2 + 1// 创建射线const raycaster = new THREE.Raycaster()raycaster.setFromCamera(mouse, camera)// 获取模型中的所有可交互对象const intersects = raycaster.intersectObject(model, true)if (intersects.length > 0) {console.log('点击了模型!', intersects[0].object)alert('你点击了模型上的一个部件')}
}// 响应窗口变化
window.addEventListener('resize', () => {if (!camera || !renderer) returncamera.aspect = viewerContainer.value.clientWidth / viewerContainer.value.clientHeightcamera.updateProjectionMatrix()renderer.setSize(viewerContainer.value.clientWidth, viewerContainer.value.clientHeight)
})onMounted(() => {init()
})
</script><style scoped>
.model-viewer-container {width: 100%;height: 100vh;
}
</style>

文件结构建议

your-project/
├── public/
│   └── models/
│       └── test.glb   <-- 放置你的模型文件
├── src/
│   └── components/
│       └── ModelViewer.vue

注意:模型放在 public/models/ 目录下,通过 /models/test.glb 路径访问。


🔧 功能说明

功能实现方式
加载模型使用 GLTFLoader 加载 .glb.gltf 模型
控制视角使用 OrbitControls 实现自由旋转、缩放、平移
点击事件使用 Raycaster 进行射线检测,判断是否点击到模型
响应式布局监听 resize 事件并更新相机和渲染器尺寸

扩展建议

需求推荐做法
多个模型加载使用 Promise.all() 异步加载多个模型
模型动画播放使用 AnimationMixerClock 控制动画
加载进度条使用 LoadingManager 显示加载百分比
自定义材质遍历模型子对象并修改材质颜色、透明度等属性
高亮选中部分修改点击对象的材质颜色或使用 OutlinePass 后期高亮
http://www.xdnf.cn/news/3574.html

相关文章:

  • 【ICMP协议深度解析】从网络诊断到安全实践
  • Mysql常用语句汇总
  • centos7.0无法安装php8.2/8.3
  • ROS2学习笔记|创建工作空间并打印文件内容
  • 视频编解码学习二之颜色科学
  • UDP / TCP 协议
  • 使用DeepSeek协助恢复历史数据
  • GoFrame 奉孝学习笔记
  • ElasticSearch深入解析(十):字段膨胀(Mapping 爆炸)问题的解决思路
  • leetcode0096. 不同的二叉搜索树-medium
  • 从零开发一个B站视频数据统计Chrome插件
  • Android Compose 层叠布局(ZStack、Surface)源码深度剖析(14)
  • AI Agent开发第48课-DIFY中利用AI动态判断下一步流程-DIFY调用API、REDIS、LLM
  • 面试现场“震”情百态:HashMap扩容记
  • 昇腾的CANN是什么?跟英伟达CUDA的有什么联系和区别?【浅谈版】
  • 生成式 AI 的未来
  • [一文解决大模型微调+部署+RAG] LLamaFactory微调模型后使用Ollama + RAGFlow在Windows本地部署
  • LabVIEW软件设计锂电池故障模拟检测
  • 学习黑客安全基础理论入门
  • 深度学习经典网络之LeNet-5详解
  • 【AI面试准备】电商购物车AI测试设计与实施
  • C 语言 第五章 指针(6)
  • AI驱动文字冒险游戏
  • 从零开始讲DDR(8)——AXI 接口MIG 使用(1)
  • 主机Windows和虚拟机ubuntu和开发板三者互ping学习记录
  • Allegro23.1新功能之如何使用文件预览功能操作指导
  • 改进算法超详细:双变异樽海鞘群算法:从最优性能设计到分析
  • 数字智慧方案6185丨智慧银行解决方案(51页PPT)(文末有下载方式)
  • 【quantity】5 derive_more库 2.0 版介绍
  • 预订接口优化:使用本地消息表保证订单生成、库存扣减的一致性