2.5.2 碰撞检查功能设计说明
2.5.2.1. 模块描述
碰撞检查模块是碰撞检测功能的核心模块,负责在指定物流组件(待载转运车)动画运行过程中,如果与其他模型发生碰撞或干涉,要高亮显示该模型,并记录碰撞结果。支持碰撞记录导出。该模块使用ClashDetective集成和空间索引实现高效的动态碰撞检测。
该模块与ClashDetectiveIntegration、PathAnimationManager和CollisionSceneHelper紧密集成,实现实时碰撞检测和结果记录。
2.5.2.2. 功能
核心功能
- 实时碰撞检测:在动画播放过程中实时检测碰撞
- 碰撞高亮:高亮显示发生碰撞的模型
- 碰撞记录:记录碰撞的时间、位置、对象等信息
- 结果导出:导出碰撞记录到文件
- 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 |
碰撞检测的额外内存占用 |
性能优化策略
- 使用空间索引加速检测
- 碰撞结果缓存
- 分层检测减少计算量
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 |
首次碰撞进度 |