truth-lab Phase 2 第②步 — 控制点拖拽 + 物理动画 + 实时数据¶
目标¶
在第①步 3D 场景基础上,增加交互式和动画能力: 1. 拖拽编辑控制点 — 用户可拖拽 3D 空间中的控制点,实时更新轨道形状 2. 物理正确的球体动画 — 小球沿最速降线轨迹平滑运动 3. 实时数据面板 — 显示位置、速度、时间、能量等物理量
文件结构(在现有 truth-lab 项目上修改)¶
实现计划¶
1️⃣ 物理引擎扩展 (src/physics/brachistochrone.ts)¶
- 增加
computeAnimation(start, end, controls, totalTime)函数 - 输入:起点 A、终点 B、控制点序列、总运动时间
- 输出:一系列
(t, x, y, vx, vy, speed)帧 - 实现最速降线轨迹的参数化匀速插值
- 能量守恒验证:
mgh + 0.5*m*v² = constant
2️⃣ 控制点拖拽 (BrachistochroneScene.tsx 改造)¶
- 用
@react-three/drei的<TransformControls>或<DragControls> - 控制点显示为可拖拽的球体(比普通点大,带发光环)
- 拖拽时:
- 实时更新
simulationStore中的控制点位置 - 轨道
TubeGeometry自动重建 - 物理帧缓存重新计算
- 选中控制点高亮(颜色变化 + 缩放)
3️⃣ 小球动画组件 (BrachistochroneBall.tsx)¶
<mesh>球体,沿预计算路径运动- 使用
useFrame+lerp平滑插值 - 球体带拖尾轨迹线(半透明曲线)
- 速度矢量箭头随球移动
4️⃣ 实时数据面板 (BrachistochroneData.tsx)¶
- 固定在屏幕右下角的 HUD 风格面板
- 显示:
- 位置 (x, y)
- 速度 (m/s)
- 已用时间 (s)
- 动能 (J)
- 势能 (J)
- 总能 (J) — 应保持守恒
- 使用
Html组件覆在 3D 场景上
5️⃣ 控制面板 (BrachistochroneControls.tsx)¶
- 播放/暂停按钮
- 重置按钮
- 速度滑块(1x, 2x, 0.5x)
- 控制点数量显示
安装依赖(如需)¶
当前已有 three、@react-three/fiber、@react-three/drei(第①步已加)
开发流程¶
- 扩展物理引擎
- 改造场景支持拖拽
- 添加小球动画
- 添加数据面板
- 添加控制面板
- 本地测试 → git push → 服务器部署