利用VTK 包围盒实现简单的碰撞检测

利用VTK 包围盒实现简单的碰撞检测

一. 需求

利用VTK自带的包围盒实现简单的碰撞检测。

二. 实现

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

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

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

struct  SimulateActor
{
    using Ptr =  QSharedPointer<SimulateActor>;
    vtkSmartPointer<vtkActor> Actor;
    vtkSmartPointer<vtkTransform> Trans;
    vtkSmartPointer<vtkPolyData> PolyData;
    vtkSmartPointer<vtkCollisionDetectionFilter> Collide;
};

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

5,不足

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

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

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

发表回复