返回文章列表

记忆树 — 3D 沉浸式记忆空间

2026年6月12日5 分钟阅读

快速体验

🌳 打开记忆树

项目简介

记忆树是一个基于 Three.js 的 3D 沉浸式记忆空间,通过 174,000 个粒子构建梦幻星海,配合音乐播放和相册系统,打造专属的回忆空间。

技术栈

技术用途
Three.js3D 渲染引擎,处理粒子系统和几何体
React Three FiberThree.js 的 React 封装,声明式 3D 开发
@react-three/drei常用 3D 组件(OrbitControls、useTexture、useVideoTexture)
Framer Motion2D UI 动画(加载界面、弹窗过渡)
Lucide React图标库(关闭、返回、音乐等图标)

项目架构

src/
├── app/memory-tree/page.tsx      # 页面入口,动态加载 3D 组件
├── components/blog/MemoryTree.tsx # 核心 3D 场景组件
└── config/photos.ts              # 相册数据配置

核心组件解析

1. 粒子系统(Particle Systems)

记忆树由多层粒子系统叠加构成,营造星空效果:

组件粒子数作用
ParticleWave35,000地面波浪,青紫双色交替,模拟海面波动
StarDust5,000星尘背景,三种纹理(星星、雪花、月亮)以不同速度旋转
EnergyBeam18,000能量光束,从树心向外发散的细小粒子
RadiantTree95,000树冠主体,6 层结构,粉白渐变
LuminousPedestal9,000底座光环,粉紫色旋转基座
KleinBottle12,000克莱因瓶装饰,青色渐变悬浮在树顶

总计约 174,000 个粒子,全部使用 AdditiveBlending 实现发光效果。

2. 音乐播放系统

内置音乐播放器,支持多首歌曲切换:

  • 播放控制:播放/暂停、上一首/下一首
  • 唱片机样式:旋转黑胶唱片效果,播放时发光
  • 歌曲列表:默认包含 3 首歌曲,可自定义
  • 键盘控制:空格键暂停/播放

3. 相册系统

支持多张照片组成的相册,点击可查看详情:

  • 懒加载:基于距离的纹理加载,优化性能
  • 相册弹窗:左侧照片轮播,右侧文字描述
  • 缩略图导航:底部显示相册照片列表
  • 键盘导航:左右箭头切换照片,ESC 关闭

4. 加载动画

采用模拟进度条 + 真实加载进度混合策略:

typescript
1// 模拟进度:2 秒内完成
2const t = Math.min(elapsed / 2.0, 1);
3const eased = 1 - Math.pow(1 - t, 3);
4
5// 超时保护:2.5 秒后强制显示
6const timer = setTimeout(() => setReady(true), 2500);

响应式设计

针对移动端做了专门优化:

配置项桌面端移动端
相机位置[0, 15, 80][0, 20, 100]
视场角42°50°
DPR1-1.51-1.2
自动旋转速度0.30.15
最小距离4560
抗锯齿开启关闭(性能优先)

数据配置

相册数据在 src/config/photos.ts 中定义:

typescript
1export interface Album {
2  id: string;
3  title: string;
4  cover: string;
5  description?: string;
6  photos: { url: string; type?: "image" | "video"; rotate?: number; caption?: string }[];
7}
8
9export const ALBUM_DATA: Album[] = [
10  // 添加你的相册数据...
11];

照片路径建议放在 public/images/memory-tree/ 目录下。

性能优化

  1. 动态加载:使用 next/dynamic + ssr: false 避免服务端渲染
  2. 粒子复用:所有粒子使用 useMemo 缓存,避免重复计算
  3. 懒加载:照片基于距离加载,减少初始内存占用
  4. 移动端降级:关闭抗锯齿、降低 DPR、减少旋转速度
  5. 超时保护:2.5 秒后强制显示,避免白屏

交互说明

  • 拖拽旋转:鼠标左键拖动视角(移动端支持触控)
  • 滚轮缩放:调整与树的距离
  • 点击照片:弹出相册详情(支持照片轮播)
  • 音乐控制:点击唱片机按钮播放/暂停,左右箭头切歌
  • ESC 键:关闭预览弹窗
  • 自动旋转:松手后缓慢回正

发表评论