# 2.5.1 动画生成和播放功能设计说明 ## 2.5.1.1. 模块描述 动画生成和播放模块是碰撞检测功能的核心模块,负责指定物流组件(待载转运车),选择路径,生成动画仿真物流组件的运动过程。支持设置动画时长,支持动画的播放、停止和步进播放。该模块通过TimeLiner集成和动态变换实现沿路径的动画效果,为碰撞检测提供动态测试环境。 该模块与PathAnimationManager、TimeLinerIntegrationManager和PathCurveEngine紧密集成,实现流畅的路径动画仿真。 ## 2.5.1.2. 功能 ### 核心功能 1. **动画生成**:根据路径生成物流组件的运动动画 2. **动画播放**:播放生成的动画 3. **动画控制**:支持播放、暂停、停止、步进控制 4. **时长设置**:支持设置动画总时长 5. **速度控制**:支持调整播放速度 6. **双向播放**:支持正向和反向播放 ### 子功能 | 功能编号 | 功能名称 | 功能描述 | |---------|---------|---------| | 2.5.1.F1 | 动画对象选择 | 选择要动画的物流组件 | | 2.5.1.F2 | 路径选择 | 选择动画路径 | | 2.5.1.F3 | 动画生成 | 生成沿路径的动画 | | 2.5.1.F4 | 播放控制 | 播放、暂停、停止动画 | | 2.5.1.F5 | 步进控制 | 单步前进/后退 | | 2.5.1.F6 | 时长设置 | 设置动画总时长 | | 2.5.1.F7 | 速度调节 | 调节播放速度倍率 | | 2.5.1.F8 | 进度跳转 | 跳转到指定进度 | | 2.5.1.F9 | 循环播放 | 设置循环播放模式 | | 2.5.1.F10 | TimeLiner集成 | 与TimeLiner任务同步 | ## 2.5.1.3. 性能 ### 性能指标 | 指标名称 | 目标值 | 说明 | |---------|-------|------| | 动画生成时间 | < 2秒 | 生成动画的响应时间 | | 播放帧率 | > 30FPS | 动画播放的帧率 | | 内存占用 | < 200MB | 动画过程的内存占用 | | 支持路径长度 | 无限制 | 支持的最长路径 | ### 性能优化策略 1. 预计算动画帧数据 2. 使用空间索引优化碰撞检测 3. 帧数据缓存和复用 ## 2.5.1.4. 输入输出项 ### 1. 字段输入输出 #### 输入字段 | 字段名 | 类型 | 必填 | 说明 | |-------|------|-----|------| | AnimatedObject | ModelItem | 是 | 动画对象 | | Route | PathRoute | 是 | 动画路径 | | Duration | double | 否 | 动画时长(秒),默认10秒 | | FrameRate | int | 否 | 帧率,默认30FPS | #### 输出字段 | 字段名 | 类型 | 说明 | |-------|------|------| | AnimationFrames | List | 动画帧数据 | | TotalFrames | int | 总帧数 | | CurrentFrame | int | 当前帧索引 | | AnimationState | AnimationState | 动画状态 | ### 2. 界面交互输入输出 #### 界面输入 - 对象选择操作 - 路径选择 - 播放控制按钮 - 进度条拖动 - 速度调节滑块 #### 界面输出 - 动画状态显示 - 进度条更新 - 当前帧信息显示 - 播放时间显示 ## 2.5.1.5. 算法 ### 动画生成算法 ``` 算法:生成路径动画 输入:动画对象,路径,时长,帧率 输出:动画帧数据 1. 计算总帧数:duration * frameRate 2. 对于每帧: 3. 计算进度:frameIndex / totalFrames 4. 根据进度计算路径上的位置 5. 计算朝向(根据路径方向) 6. 创建动画帧数据 7. 返回所有帧数据 ``` ### 路径位置计算算法 ``` 算法:计算路径上的位置 输入:路径点列表,进度(0-1) 输出:位置和朝向 1. 计算目标距离:总长度 * 进度 2. 遍历路径段: 3. 如果目标距离在当前段内: 4. 计算段内插值比例 5. 插值计算位置 6. 计算朝向向量 7. 返回结果 8. 减去当前段长度,继续 ``` ### 动画帧插值算法 ``` 算法:平滑插值动画帧 输入:当前帧索引,总帧数,路径数据 输出:插值后的位置和旋转 1. 计算精确的进度值 2. 找到前后关键帧 3. 计算插值权重 4. 对位置进行Lerp插值 5. 对旋转进行Slerp插值 6. 返回插值结果 ``` ## 2.5.1.6. 流程逻辑 ``` 开始 │ ▼ ┌─────────────────┐ │ 选择动画对象 │ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 选择动画路径 │ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 设置动画参数 │ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 生成动画数据 │ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 开始播放动画 │ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 更新对象位置 │ └────────┬────────┘ │ ┌────┴────┐ ▼ ▼ ┌────────┐ ┌────────┐ │继续播放│ │用户控制│ └───┬────┘ └───┬────┘ │ 暂停 │ │ ┌────────┘ │ ▼ │ ┌──────────┐ │ │ 暂停状态 │ │ └───┬──────┘ │ │ 继续 └─────┤ │ ▼ ┌─────────────────┐ │ 动画结束/停止 │ └────────┬────────┘ │ ▼ 结束 ``` ## 2.5.1.7. 接口 ### 公共接口 ```csharp /// /// 路径动画管理器 /// public class PathAnimationManager { /// /// 创建动画 /// /// 动画对象 /// 动画路径 /// 动画配置 public void CreateAnimation(ModelItem animatedObject, PathRoute route, AnimationConfig config); /// /// 播放动画 /// public void Play(); /// /// 暂停动画 /// public void Pause(); /// /// 停止动画 /// public void Stop(); /// /// 步进播放 /// /// 方向:1=前进,-1=后退 public void Step(int direction); /// /// 跳转到指定进度 /// /// 进度(0-1) public void Seek(double progress); /// /// 设置播放速度 /// /// 速度倍率 public void SetPlaybackSpeed(double speed); } /// /// 动画配置 /// public class AnimationConfig { public double Duration { get; set; } public int FrameRate { get; set; } public double DetectionTolerance { get; set; } public bool EnableCollisionDetection { get; set; } } ``` ### 事件接口 ```csharp /// /// 动画状态变更事件 /// public event EventHandler StateChanged; /// /// 动画进度更新事件 /// public event EventHandler ProgressUpdated; /// /// 动画帧更新事件 /// public event EventHandler FrameUpdated; ``` ## 2.5.1.8. 注释设计 ### 代码注释规范 ```csharp /// /// 动画状态 /// public enum AnimationState { /// /// 空闲,未生成动画 /// Idle, /// /// 已就绪,动画已生成但未播放 /// Ready, /// /// 播放中 /// Playing, /// /// 暂停 /// Paused, /// /// 已停止 /// Stopped, /// /// 已完成 /// Finished } /// /// 动画帧数据 /// public class AnimationFrame { /// /// 帧索引 /// public int Index { get; set; } /// /// 进度(0-1) /// public double Progress { get; set; } /// /// 该帧的位置 /// public Point3D Position { get; set; } /// /// 绕Z轴的偏航角(弧度) /// public double YawRadians { get; set; } } ``` ## 2.5.1.9. 数据结构 ### AnimationState 枚举 | 值 | 说明 | |---|------| | Idle | 空闲状态 | | Ready | 已就绪 | | Playing | 播放中 | | Paused | 暂停 | | Stopped | 已停止 | | Finished | 已完成 | ### AnimationConfig 结构 | 字段名 | 类型 | 说明 | |-------|------|------| | Duration | double | 动画时长(秒) | | FrameRate | int | 帧率(FPS) | | DetectionTolerance | double | 检测容差(米) | | EnableCollisionDetection | bool | 启用碰撞检测 | | LoopPlayback | bool | 循环播放 | ### AnimationFrame 结构 | 字段名 | 类型 | 说明 | |-------|------|------| | Index | int | 帧索引 | | Progress | double | 进度(0-1) | | Position | Point3D | 位置 | | YawRadians | double | 偏航角(弧度) | | Collisions | List | 碰撞结果 | | HasCollision | bool | 是否有碰撞 | ### PlaybackState 结构 | 字段名 | 类型 | 说明 | |-------|------|------| | State | AnimationState | 当前状态 | | CurrentFrame | int | 当前帧索引 | | CurrentProgress | double | 当前进度 | | PlaybackSpeed | double | 播放速度倍率 | | RemainingTime | TimeSpan | 剩余时间 |