2D复杂几何体的精确碰撞测试。

碰撞测试,复杂的图形基本的思想是切割图形然后分区域做碰撞测试,面对复杂图形的时候分割图形都是一个很头疼的问题,而且分割的越多计算量越大。

我这里提出一个碰撞方法在保证精确的前提下提高了效率(已测试可行)。

如果一个两个图形相碰撞。那么他们的其中的一个或者多个顶点就会在另外一个图形中。

如下图(本人美术不好。请大家见谅)。



其实我跟大家画出来的红色线段,就是我今天样讲的方法。点朝y轴方向发射两个射线。(实际上可以是任意方向,不过考虑到计算量和简单化逻辑,我们使用x轴,或者y轴方向)

然后这两个射线分别与图形的交点数,都是奇数个,那么这个点就会在图形内部,同样两个图形就碰撞了。

当然也有情况需要分开讨论,比如说最后一种情况(三角形)。

当第一次相交的时候就相交在图形的点上。那么这个时候应该视为只相交了一次。如果不是第一次与图形相交则按正常的逻辑视为相交两次(因为点同时在两个线段上,所以过这个点的射线相交了两次)。

使用y轴作为射线方向的原因,是因为,判断射线与直线相交的运算变的非常简单。 只要点的x坐标在 线段两端点的x坐标之间。那么这个线段就一定会与射线相交。一个简单的大于小于就能判断出射线和线段是否相交。

同样适用x轴作为方向也是一样。(任意方向都满足这个结论,除特殊情况我们都应该选择x或y)。


如果大家有什么更好的建议,或者说特定的情况会产生bug。欢迎大家多多给建议。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值