VTK 碰撞检测

需求:机械手运动仿真,实时检测是否与周边物体发生碰撞

实现:

1,VTK的碰撞检测原理就是 求物体的包围盒,然后检测包围盒与线、面、或者另一个包围盒是否相交。包围盒主要包括球体、轴对齐包围盒(AABB)、有向包围盒(OBB)和凸包(Convex Hull),参考(VTK笔记——轴对齐包围盒(AABB) - 灰信网(软件开发博客聚合))

2,VTK自带了一个vtkCollisionDetectionFilter过滤器,来计算碰撞检测,此过滤器利用的就是OBB包围盒,使用简单,只需提供两个物体的数据集和矩阵即可。

3,实现的时候 利用一个结构体,来定义角色,矩阵和包围盒。这样便于计算。

struct  SimulateActor
{
    using Ptr =  QSharedPointer;
    vtkSmartPointer Actor;
    vtkSmartPointer Trans;
    vtkSmartPointer PolyData;
    vtkSmartPointer Collide;
};

4,首先初始化之后所有的物体。然后利用两个循环来依次判断每两个物体是否发生碰撞。

5,不足:

(1),此过滤器只能检测两个物体是否发生碰撞,无奈当前只能通过两个循环来进行遍历。

(2),没有找到如何将多个actor组合成一个,然后进行碰撞检测的方法,如果能组合成一个效率会提高很多。

(3)目前六个部件,与50个障碍物进行碰撞检测。检测一次的时间大约50ms。

 

你可能感兴趣的:(其它,大数据)