基于 MediaPipe + Three.js 的实时姿态可视化前端

这是一套前端实时姿态捕获与 3D 可视化的 DEMO,特点是启动快、UI 现代、渲染稳定,同时对设备性能与网络情况做了多处优化。

预览地址

技术栈与核心依赖

  • 框架与工程:Vite + React + TypeScript
  • 实时姿态识别:MediaPipe Tasks Vision(PoseLandmarker)
  • 三维渲染:Three.js(OrbitControls 动态导入)
  • UI/样式:现代玻璃拟态风格 + 自定义 Loading

功能总览

  • 实时相机捕获与姿态识别(身体骨架)
  • 三维骨架可视化(颜色分区、发光、光照增强)
  • 角度信息面板(可自动隐藏,仅在有数据时显示)
  • 全局加载遮罩(等待 MediaPipe + Three.js 完成)
  • 手动启动/停止相机控制(支持自动启动模式)

关键模块与结构

  • src/components/CameraCapture/CameraCapture.tsx
    • 负责相机权限、视频流、MediaPipe 推理、数据结构转换
    • 提供 onPoseDetection, onReady, onStarted, onStopped
    • 支持按钮控制"启动相机/停止相机"
  • src/components/PoseVisualizer/PoseVisualizer.tsx
    • Three.js 场景、光照与骨架渲染
    • 动态导入 OrbitControls,限制旋转角度,不卡交互
    • angle-display 面板:仅在有数据时显示,避免遮挡
  • src/App.tsx
    • 负责两个模块组合 + 全局加载遮罩

MediaPipe 接入要点

  • 预加载
    • 启动时预创建 PoseLandmarker,后续组件共享,减少首次推理延迟
  • 推理节流
    • 使用 requestAnimationFrame,同时用 33ms 限制至 ~30FPS,减轻负载
  • 结果转换
    • results.landmarks 转为统一 PoseData,包含 landmarksconnections

示例(推理节流核心逻辑片段):

ts 复制代码
const now = performance.now();
const elapsed = now - lastDetectTimeRef.current;
if (elapsed >= 33) {
  lastDetectTimeRef.current = now;
  const poseResults = poseLandmarkerRef.current.detectForVideo(videoEl, now);
  // 转换数据后 onPoseDetection(poseData)
}

Three.js 可视化策略

  • 场景与光照
    • AmbientLight + DirectionalLight + PointLight 增强立体感
    • 关闭阴影、降低 pixelRatio,保性能稳定
  • 骨架渲染
    • 关节点使用不同尺寸与颜色分区,提升可视效果
    • 线条色彩柔和(透明度 0.8),避免视觉噪声
  • 交互限制
    • OrbitControls 限制旋转范围,支持小幅观察,不允许拖拽离场景

UI/交互设计

  • 全局 Loading 遮罩
    • 等 MediaPipe + Three.js 均完成后自动消失
  • 手动相机控制
    • 顶部按钮:启动/停止
    • 卸载时清理流与动画帧,避免内存泄漏
  • 角度信息条 angle-display
    • 仅在有角度数据时展示;否则隐藏,不遮挡画面
    • 背景为浅色玻璃风格,支持移动端可读性

性能优化清单

  • MediaPipe
    • 预加载模型,避免首帧等待
    • 推理节流至 ~30FPS
  • Three.js
    • 关闭阴影、降低抗锯齿与像素密度上限
    • 节省几何细分(SphereGeometry 16/16)
  • 网络与构建
    • Vite 插件移除第三方 sourcemap 注释,避免控制台噪音
    • 手动切换为本地模型与本地 wasm(可选,弱网/内网环境)

常见问题与排查

  • 模型/wasm 拉取失败
    • 检查 CDN 可访问性,或改为本地:将模型放到 public/models/pose_landmarker_lite.task
    • wasm 路径:默认 CDN。如需离线,将 @mediapipe/tasks-vision/wasm 同名文件复制至 public/mediapipe/wasm/,并修改 FilesetResolver.forVisionTasks('/mediapipe/wasm')
  • 扩展拦截 fetch
    • 使用无痕窗口或禁用拦截扩展
    • DevTools Network 查看失败 URL

体验与易用性

  • 打开即用(默认自动启动相机);也支持手动控制
  • 视觉现代化:玻璃面板、渐变、光效与动效
  • 移动端自适应:容器尺寸与文本字号优化

可继续演进的方向

  • 角度计算实现(肩/肘/膝等)并在面板展示历史曲线
  • 录制模式:保存姿态数据或渲染视频
  • 更多皮肤主题(暗/亮主题切换)
  • 多模型支持(如 Holistic / Hands / Face)可开关切换
  • 性能自适应(根据设备性能自动降低几何细分与像素比)
相关推荐
崔庆才丨静觅6 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60617 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了7 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅7 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅7 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅8 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment8 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅8 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊8 小时前
jwt介绍
前端
爱敲代码的小鱼8 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax