一. 需求
利用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。