NavisworksTransport/doc/introduction/2.5.2_碰撞检查功能设计说明.md

10 KiB
Raw Blame History

2.5.2 碰撞检查功能设计说明

2.5.2.1. 模块描述

碰撞检查模块是碰撞检测功能的核心模块负责在指定物流组件待载转运车动画运行过程中如果与其他模型发生碰撞或干涉要高亮显示该模型并记录碰撞结果。支持碰撞记录导出。该模块使用ClashDetective集成和空间索引实现高效的动态碰撞检测。

该模块与ClashDetectiveIntegration、PathAnimationManager和CollisionSceneHelper紧密集成实现实时碰撞检测和结果记录。

2.5.2.2. 功能

核心功能

  1. 实时碰撞检测:在动画播放过程中实时检测碰撞
  2. 碰撞高亮:高亮显示发生碰撞的模型
  3. 碰撞记录:记录碰撞的时间、位置、对象等信息
  4. 结果导出:导出碰撞记录到文件
  5. ClashDetective集成与Navisworks ClashDetective联动

子功能

功能编号 功能名称 功能描述
2.5.2.F1 预计算碰撞 预计算可能的碰撞点
2.5.2.F2 实时检测 动画过程中的实时碰撞检测
2.5.2.F3 碰撞高亮 高亮显示碰撞对象
2.5.2.F4 碰撞记录 记录碰撞详情
2.5.2.F5 结果查看 查看碰撞结果列表
2.5.2.F6 记录导出 导出碰撞记录
2.5.2.F7 排除设置 设置不参与碰撞检测的对象
2.5.2.F8 容差设置 设置碰撞检测容差

2.5.2.3. 性能

性能指标

指标名称 目标值 说明
检测响应时间 < 50ms 单次碰撞检测的响应时间
帧率影响 < 5FPS 碰撞检测对动画帧率的影响
支持对象数量 > 10000 支持检测的场景对象数量
内存占用 < 200MB 碰撞检测的额外内存占用

性能优化策略

  1. 使用空间索引加速检测
  2. 碰撞结果缓存
  3. 分层检测减少计算量

2.5.2.4. 输入输出项

1. 字段输入输出

输入字段

字段名 类型 必填 说明
AnimatedObject ModelItem 运动对象
ExcludedObjects List 排除的对象列表
Tolerance double 检测容差默认0.05
UseClashDetective bool 使用ClashDetective默认true

输出字段

字段名 类型 说明
Collisions List 碰撞结果列表
CollisionCount int 碰撞总数
UniqueCollisions int 去重后的碰撞数

2. 界面交互输入输出

界面输入

  • 检测容差设置
  • 排除对象选择
  • 手动触发检测

界面输出

  • 碰撞列表显示
  • 碰撞位置高亮
  • 碰撞统计信息
  • 结果导出提示

2.5.2.5. 算法

碰撞检测算法

算法:基于空间索引的碰撞检测
输入:运动对象,场景对象,容差
输出:碰撞结果

1. 获取运动对象的包围盒
2. 膨胀包围盒(增加容差)
3. 使用空间索引查询可能碰撞的对象
4. 对于每个候选对象:
   5. 进行精确的碰撞检测
   6. 如果碰撞:
      7. 记录碰撞信息
8. 返回所有碰撞结果

ClashDetective集成算法

算法使用ClashDetective检测碰撞
输入:运动对象,检测配置
输出:碰撞结果

1. 创建Clash测试
2. 设置测试参数
3. 执行测试
4. 获取碰撞结果
5. 解析结果数据
6. 转换为内部格式
7. 返回碰撞列表

碰撞记录算法

算法:记录碰撞信息
输入:碰撞结果
输出:记录数据

1. 对于每个碰撞:
   2. 记录时间戳
   3. 记录动画进度
   4. 记录碰撞位置
   5. 记录涉及的对象
   6. 记录碰撞类型
   7. 保存到数据库
8. 返回记录ID

2.5.2.6. 流程逻辑

开始
  │
  ▼
┌─────────────────┐
│  配置检测参数    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  设置排除对象    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐      是
│  预计算碰撞?    │──────────┐
└────────┬────────┘          │
         │否                 │
         ▼                   │
┌─────────────────┐          │
│  开始动画播放    │          │
└────────┬────────┘          │
         │                   │
         ▼                   │
┌─────────────────┐          │
│  实时碰撞检测    │          │
└────────┬────────┘          │
         │                   │
    ┌────┴────┐              │
    ▼         ▼              │
┌────────┐  ┌────────┐       │
│发现碰撞│  │无碰撞  │       │
└───┬────┘  └───┬────┘       │
    │           │            │
    ▼           │            │
┌────────┐      │            │
│高亮显示│      │            │
└───┬────┘      │            │
    │           │            │
    ▼           │            │
┌────────┐      │            │
│记录碰撞│      │            │
└───┬────┘      │            │
    │           │            │
    └─────┬─────┘            │
          │                  │
          ▼                  │
┌─────────────────┐          │
│  继续动画?      │──────────┤
└────────┬────────┘ 否       │
         │                   │
         │是                 │
         │                   │
         └───────────────────┤
                             │
                             ▼
                   ┌─────────────────┐
                   │  执行ClashDetective检测  │
                   └────────┬────────┘
                            │
                            ▼
                   ┌─────────────────┐
                   │  合并检测结果    │
                   └────────┬────────┘
                            │
                            ▼
                   ┌─────────────────┐
                   │  显示最终结果    │
                   └────────┬────────┘
                            │
                            ▼
                           结束

2.5.2.7. 接口

公共接口

/// <summary>
/// ClashDetective集成
/// </summary>
public class ClashDetectiveIntegration
{
    /// <summary>
    /// 执行碰撞检测测试
    /// </summary>
    /// <param name="animatedObject">运动对象</param>
    /// <param name="config">检测配置</param>
    /// <returns>检测结果</returns>
    public ClashTestResult RunClashTest(ModelItem animatedObject, ClashTestConfig config);
    
    /// <summary>
    /// 获取当前碰撞结果
    /// </summary>
    public List<ClashResult> GetCurrentCollisions();
    
    /// <summary>
    /// 导出碰撞结果
    /// </summary>
    /// <param name="filePath">导出路径</param>
    public void ExportCollisions(string filePath);
    
    /// <summary>
    /// 设置排除对象
    /// </summary>
    public void SetExcludedObjects(List<ModelItem> excludedObjects);
}

/// <summary>
/// 碰撞检测配置
/// </summary>
public class ClashTestConfig
{
    public double Tolerance { get; set; }
    public bool UsePreciseDetection { get; set; }
    public List<ModelItem> ExcludedObjects { get; set; }
}

事件接口

/// <summary>
/// 碰撞检测事件参数
/// </summary>
public class CollisionDetectedEventArgs : EventArgs
{
    public ModelItem AnimatedObject { get; set; }
    public ModelItem CollisionObject { get; set; }
    public Point3D Position { get; set; }
    public double AnimationProgress { get; set; }
}

/// <summary>
/// 碰撞检测事件
/// </summary>
public event EventHandler<CollisionDetectedEventArgs> CollisionDetected;

2.5.2.8. 注释设计

代码注释规范

/// <summary>
/// 碰撞结果
/// </summary>
public class CollisionResult
{
    /// <summary>
    /// 运动对象
    /// </summary>
    public ModelItem Item1 { get; set; }
    
    /// <summary>
    /// 被碰撞对象
    /// </summary>
    public ModelItem Item2 { get; set; }
    
    /// <summary>
    /// 碰撞位置
    /// </summary>
    public Point3D CollisionPoint { get; set; }
    
    /// <summary>
    /// 碰撞时的动画进度0-1
    /// </summary>
    public double AnimationProgress { get; set; }
    
    /// <summary>
    /// 碰撞时间
    /// </summary>
    public DateTime Timestamp { get; set; }
}

2.5.2.9. 数据结构

CollisionResult 结构

字段名 类型 说明
Item1 ModelItem 运动对象
Item2 ModelItem 被碰撞对象
CollisionPoint Point3D 碰撞位置
AnimationProgress double 动画进度0-1
Timestamp DateTime 碰撞时间
CollisionType CollisionType 碰撞类型
PenetrationDepth double 穿透深度

CollisionType 枚举

说明
Hard 硬碰撞(实体接触)
Soft 软碰撞(容差范围内)
Clearance 间隙不足

ClashTestConfig 结构

字段名 类型 说明
Tolerance double 检测容差(米)
UsePreciseDetection bool 使用精确检测
ExcludedObjects List 排除对象
TestName string 测试名称

CollisionStatistics 结构

字段名 类型 说明
TotalCollisions int 总碰撞数
UniqueCollisions int 去重后碰撞数
HardCollisions int 硬碰撞数
SoftCollisions int 软碰撞数
MostHitObject ModelItem 被碰撞最多的对象
FirstCollisionTime double 首次碰撞进度