一、当Vue遇见Three.js
作为一个经历过前端从2D向3D演进的开发者,我深知在Vue项目中集成Three.js的痛点:繁琐的API调用、复杂的场景管理、响应式状态同步难题。直到遇见 TresJS——这个基于Vue3的声明式3D框架,将Three.js的强大能力与Vue的响应式系统完美融合,让3D开发变得像搭建普通Vue组件一样简单。本文将结合实际案例,带你从环境搭建到复杂场景开发,全面掌握TresJS的核心用法。
二、TresJS核心特性:重新定义Vue 3D开发
2.1 声明式组件化开发
告别Three.js的命令式编程,用Vue模板语法构建3D场景:
<TresCanvas>
<TresPerspectiveCamera :position="[0, 0, 5]" />
<TresMesh>
<TresBoxGeometry :args="[1, 1, 1]" />
<TresMeshBasicMaterial color="red" />
</TresMesh>
</TresCanvas>
- 每个3D对象(相机、几何体、材质)都是可复用的Vue组件
- 通过props动态控制3D属性,天然支持响应式
2.2 深度集成Vue生态
- 响应式系统:直接使用
ref/reactive控制3D对象状态 - 生命周期:自动管理Three.js场景的初始化与销毁
- Vite驱动:支持HMR(模块热替换),修改组件实时生效
2.3 高性能与扩展性
- 内置渲染优化,支持大型场景(测试显示10000+多边形渲染流畅)
- 完全兼容Three.js生态,可直接使用Three.js的材质、动画库及GLTF模型
三、快速上手:10分钟搭建第一个3D场景
3.1 环境准备
# 1. 创建Vite项目(选择Vue模板)
npm create vite@latest my-tresjs-app --template vue
cd my-tresjs-app
# 2. 安装TresJS核心包(包含Three.js)
npm install @tresjs/core three
3.2 Vite配置优化
在vite.config.ts中添加TresJS模板编译配置:
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { templateCompilerOptions } from '@tresjs/core'
export default defineConfig({
plugins: [
vue({
template: {
compilerOptions: {
...templateCompilerOptions,
isCustomElement: (tag) => tag.startsWith('tres-'), // 识别TresJS组件
}
}
})
]
})
3.3 创建基础3D场景
<!-- src/App.vue -->
<template>
<div class="container">
<TresCanvas
class="canvas"
:antialias="true"
window-size
@ready="onCanvasReady"
>
<!-- 相机 -->
<TresPerspectiveCamera
:position="[0, 0, 20]"
:zoom="1.2"
@mousemove="onMouseMove"
/>
<!-- 立方体 -->
<TresMesh v-model:rotation="cubeRotation">
<TresBoxGeometry :args="[5, 5, 5]" />
<TresMeshPhongMaterial color="#42b983" />
</TresMesh>
<!-- 环境光 -->
<TresAmbientLight :intensity="0.5" color="#ffffff" />
</TresCanvas>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { TresCanvas, TresPerspectiveCamera, TresMesh, TresBoxGeometry, TresMeshPhongMaterial, TresAmbientLight } from '@tresjs/core'
// 响应式旋转状态
const cubeRotation = ref([0, 0, 0])
function onCanvasReady(canvas: any) {
console.log('3D场景初始化完成', canvas)
}
function onMouseMove(e: MouseEvent) {
cubeRotation.value = [
e.clientY * 0.1,
e.clientX * 0.1,
0
]
}
</script>
<style scoped>
.container {
width: 100vw;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
.canvas {
width: 800px;
height: 600px;
box-shadow: 0 0 20px rgba(0,0,0,0.2);
}
</style>
效果说明:
- 鼠标移动控制立方体旋转(响应式数据驱动)
- 环境光与 phong 材质实现立体光影效果
window-size指令自动适配窗口大小
四、进阶玩法:实验室功能与生态扩展
4.1 TresJS实验室
访问TresJS在线示例平台,体验:
4.1.1 Cientos组件库
<!-- 使用预定义的球体组件 -->
<TresSphere
:radius="3"
:segments="32"
:material="new TresMeshStandardMaterial({ color: '#ff6b6b' })"
/>
4.1.2 后期处理效果
<TresCanvas>
<TresEffectComposer>
<TresRenderPass />
<TresOutlinePass :args="[new THREE.Color('white'), 2]" />
</TresEffectComposer>
</TresCanvas>
- 支持阴影、模糊、边缘检测等20+后期效果
4.1.3 Nuxt集成(SSR友好)
# Nuxt项目安装
npm install @tresjs/nuxt
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@tresjs/nuxt']
})
4.2 复杂场景实践:3D产品展示页
需求:展示可交互的3D手机模型
<template>
<TresCanvas class="product-preview">
<!-- 模型加载 -->
<TresGLTF
url="/models/phone.gltf"
@load="onModelLoad"
>
<TresMesh
:position="[0, -2, 0]"
:scale="[0.5, 0.5, 0.5]"
>
<TresMeshStandardMaterial
:metalness="0.8"
:roughness="0.2"
/>
</TresMesh>
</TresGLTF>
<!-- 环境光与方向光 -->
<TresAmbientLight intensity="0.3" />
<TresDirectionalLight
:position="[5, 10, 5]"
:intensity="0.8"
/>
<!-- 鼠标拖拽交互 -->
<TresOrbitControls />
</TresCanvas>
</template>
<script setup lang="ts">
import { TresGLTF, TresOrbitControls, TresDirectionalLight } from '@tresjs/core'
function onModelLoad(model: THREE.Group) {
// 模型加载后的自定义逻辑
model.traverse(child => {
if (child instanceof THREE.Mesh) {
child.castShadow = true
child.receiveShadow = true
}
})
}
</script>
关键技术点:
- 加载GLTF模型(支持Blender导出的复杂模型)
- 使用
TresOrbitControls实现鼠标拖拽旋转 - 材质属性(金属度、粗糙度)模拟真实质感
- 阴影渲染配置(需开启渲染器阴影)
五、性能优化与最佳实践
5.1 渲染性能优化
- 层级管理:通过
TresGroup组件组合复杂对象,减少渲染批次 - 材质复用:相同材质的对象共享材质实例
<script setup> const redMaterial = ref(new TresMeshBasicMaterial({ color: 'red' })) </script> <TresMesh> <TresBoxGeometry /> <TresMeshBasicMaterial :ref="redMaterial" /> </TresMesh> <TresMesh> <TresBoxGeometry /> <TresMeshBasicMaterial :ref="redMaterial" /> </TresMesh> - LOD(层级细节):对远距离对象使用低精度模型
<TresLOD> <TresMesh :scale="2">...</TresMesh> <!-- 近距离高精度模型 --> <TresMesh :scale="2" :visible="false">...</TresMesh> <!-- 远距离低精度模型 --> </TresLOD>
5.2 响应式优化
- 避免在
setup中频繁创建Three.js对象,改为在onMounted中初始化 - 大数据量场景使用
requestAnimationFrame批量更新状态
5.3 调试工具
- 使用Three.js官方的WebGL Inspector调试渲染问题
- 通过TresJS提供的
debugprop开启调试模式:<TresCanvas debug /> <!-- 显示帧率、内存占用等信息 -->
六、适用场景与生态对比
| 场景类型 | TresJS优势 | 传统Three.js方案痛点 |
|---|---|---|
| 数据可视化 | 组件化图表组件,支持Vue响应式数据绑定 | 需手动处理数据与3D对象同步 |
| 产品3D展示 | 内置模型加载器与交互组件(拖拽、缩放) | 交互逻辑需手动实现 |
| VR/AR应用 | 兼容WebXR,支持陀螺仪等设备API | 设备适配复杂,需处理多场景切换 |
| 动画特效 | 基于Vue过渡系统实现平滑动画 | 动画逻辑与组件生命周期耦合度低 |
七、总结:开启Vue 3D开发新时代
TresJS的出现,让Vue开发者无需深入Three.js底层即可构建复杂3D场景,其核心价值在于:
- 降低门槛:用Vue思维开发3D,组件化模式大幅缩短学习曲线
- 生态融合:无缝接入Vue CLI/Vite/Nuxt,共享生态工具链
- 性能保障:在保持Three.js高性能的同时,提供Vue级开发体验
如果你正在开发数据大屏、产品官网、教育模拟等需要3D交互的项目,TresJS会是比Three.js更高效的选择。现在就访问TresJS官网,尝试用Vue的方式重新定义3D开发吧!
项目地址:
开发者建议:从基础几何体开始练习,逐步尝试加载外部模型和实现交互逻辑,结合Vue的状态管理方案(如Pinia)可进一步提升大型场景的开发效率。确保使用Vue 3.2.25+、Vite 4.0.0+以获得最佳兼容性。