碰撞测试,复杂的图形基本的思想是切割图形然后分区域做碰撞测试,面对复杂图形的时候分割图形都是一个很头疼的问题,而且分割的越多计算量越大。
我这里提出一个碰撞方法在保证精确的前提下提高了效率(已测试可行)。
如果一个两个图形相碰撞。那么他们的其中的一个或者多个顶点就会在另外一个图形中。
如下图(本人美术不好。请大家见谅)。
其实我跟大家画出来的红色线段,就是我今天样讲的方法。点朝y轴方向发射两个射线。(实际上可以是任意方向,不过考虑到计算量和简单化逻辑,我们使用x轴,或者y轴方向)
然后这两个射线分别与图形的交点数,都是奇数个,那么这个点就会在图形内部,同样两个图形就碰撞了。
当然也有情况需要分开讨论,比如说最后一种情况(三角形)。
当第一次相交的时候就相交在图形的点上。那么这个时候应该视为只相交了一次。如果不是第一次与图形相交则按正常的逻辑视为相交两次(因为点同时在两个线段上,所以过这个点的射线相交了两次)。
使用y轴作为射线方向的原因,是因为,判断射线与直线相交的运算变的非常简单。 只要点的x坐标在 线段两端点的x坐标之间。那么这个线段就一定会与射线相交。一个简单的大于小于就能判断出射线和线段是否相交。
同样适用x轴作为方向也是一样。(任意方向都满足这个结论,除特殊情况我们都应该选择x或y)。
如果大家有什么更好的建议,或者说特定的情况会产生bug。欢迎大家多多给建议。