NavisworksTransport/doc/introduction/2.5.1_动画生成和播放功能设计说明.md

9.7 KiB
Raw Blame History

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. 接口

公共接口

/// <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 剩余时间