2.5.1 动画生成和播放功能设计说明
2.5.1.1. 模块描述
动画生成和播放模块是碰撞检测功能的核心模块,负责指定物流组件(待载转运车),选择路径,生成动画仿真物流组件的运动过程。支持设置动画时长,支持动画的播放、停止和步进播放。该模块通过TimeLiner集成和动态变换实现沿路径的动画效果,为碰撞检测提供动态测试环境。
该模块与PathAnimationManager、TimeLinerIntegrationManager和PathCurveEngine紧密集成,实现流畅的路径动画仿真。
2.5.1.2. 功能
核心功能
- 动画生成:根据路径生成物流组件的运动动画
- 动画播放:播放生成的动画
- 动画控制:支持播放、暂停、停止、步进控制
- 时长设置:支持设置动画总时长
- 速度控制:支持调整播放速度
- 双向播放:支持正向和反向播放
子功能
| 功能编号 |
功能名称 |
功能描述 |
| 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 |
动画过程的内存占用 |
| 支持路径长度 |
无限制 |
支持的最长路径 |
性能优化策略
- 预计算动画帧数据
- 使用空间索引优化碰撞检测
- 帧数据缓存和复用
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. 接口
公共接口
/// <summary>
/// 路径动画管理器
/// </summary>
public class PathAnimationManager
{
/// <summary>
/// 创建动画
/// </summary>
/// <param name="animatedObject">动画对象</param>
/// <param name="route">动画路径</param>
/// <param name="config">动画配置</param>
public void CreateAnimation(ModelItem animatedObject, PathRoute route, AnimationConfig config);
/// <summary>
/// 播放动画
/// </summary>
public void Play();
/// <summary>
/// 暂停动画
/// </summary>
public void Pause();
/// <summary>
/// 停止动画
/// </summary>
public void Stop();
/// <summary>
/// 步进播放
/// </summary>
/// <param name="direction">方向:1=前进,-1=后退</param>
public void Step(int direction);
/// <summary>
/// 跳转到指定进度
/// </summary>
/// <param name="progress">进度(0-1)</param>
public void Seek(double progress);
/// <summary>
/// 设置播放速度
/// </summary>
/// <param name="speed">速度倍率</param>
public void SetPlaybackSpeed(double speed);
}
/// <summary>
/// 动画配置
/// </summary>
public class AnimationConfig
{
public double Duration { get; set; }
public int FrameRate { get; set; }
public double DetectionTolerance { get; set; }
public bool EnableCollisionDetection { get; set; }
}
事件接口
/// <summary>
/// 动画状态变更事件
/// </summary>
public event EventHandler<AnimationState> StateChanged;
/// <summary>
/// 动画进度更新事件
/// </summary>
public event EventHandler<double> ProgressUpdated;
/// <summary>
/// 动画帧更新事件
/// </summary>
public event EventHandler<AnimationFrame> FrameUpdated;
2.5.1.8. 注释设计
代码注释规范
/// <summary>
/// 动画状态
/// </summary>
public enum AnimationState
{
/// <summary>
/// 空闲,未生成动画
/// </summary>
Idle,
/// <summary>
/// 已就绪,动画已生成但未播放
/// </summary>
Ready,
/// <summary>
/// 播放中
/// </summary>
Playing,
/// <summary>
/// 暂停
/// </summary>
Paused,
/// <summary>
/// 已停止
/// </summary>
Stopped,
/// <summary>
/// 已完成
/// </summary>
Finished
}
/// <summary>
/// 动画帧数据
/// </summary>
public class AnimationFrame
{
/// <summary>
/// 帧索引
/// </summary>
public int Index { get; set; }
/// <summary>
/// 进度(0-1)
/// </summary>
public double Progress { get; set; }
/// <summary>
/// 该帧的位置
/// </summary>
public Point3D Position { get; set; }
/// <summary>
/// 绕Z轴的偏航角(弧度)
/// </summary>
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 |
剩余时间 |