点、线段、凹多边形相交判断以及游戏中的常见应用

本文接前文点、线段、多边形相交判断以及在游戏中常见的物理应用
前文主要讲解点、线段、凸包之间的相交判断算法,本文主要解释凹多边形(简称凹包)的判断方法。

一、简单多边形

由于以下论述都是基于简单多边形,因此线解释什么是简单多边形,如下左图是简单多边形,右图则不是。

也就是自身无交叉的属于简单多边形,而带有交叉的就不属于简单多边形。
左侧是一个典型的凹包。

二、如何判断顶点与凹包是否相交

这里先提出一个简单的方法,也是比较快速的方法,如果我们只是需要知道顶点与某个凹包是否相交的话,就可以使用射线法:

如上图,假设需要判断M与凹包关系,则可以从M点向右发射射线,查看击中凹包边缘的次数(就是使用前文所述的夹持法来判断交叉,附带+X轴向判断条件),如果击中的次数为奇数,则表示M位于凹包内部,如果为偶数,则处于外部。
该方法简单移动,也比较快速,甚至可以超越凹包判断带有自身交叠的凹多边形。

三、如何判断线段与凹包相交

可能你最直接想到的就是:如果一个顶点位于凹包内部,另外一个顶点位于凹包外部,则可以认为相交,这样大致是正确的,但是它未能处理穿透的情况,如下图:

这里我先提出一个与问题二很类似的解决方法,就是判断凹包中所有线段与目标线段MN的交叉次数,如果交叉次数为奇数,则表示MN与凹包相交且一个顶点位于凹包内部,如果为偶数,则认为相交且穿透,如果为0,则认为是不相交,或者线段MN包含在凹包内部。
尽管这个方法也很快,仍然保持了可以适用于带有自身交叠的凹多边形,然而其也有不足,就是无法区分出是不相交,还是包含在凹包内部,需要借助问题而来辅助解决最终的判断。

四、如何判断凸包与凹包的相交

由于通常来说,凹包计算都很消耗性能(回忆上文的凸包判断中的排他性),所以在游戏引擎中,一般可以运动的刚体,所能携带的动态碰撞体都不能使用凹包。然而,携带凸包碰撞体的刚体,在运动时仍然可以快速碰撞崎岖不平的地面(地形是一个凹包,静态碰撞体),这是因为,二者的快速碰撞,使用的凹包中的顶点与刚体碰撞体凸包进行快速排斥运算,因此仍然能够得到不错的性能。
也就是说,判断凹包与凸包是否相交的简单方法,就是遍历凹包所有顶点,只要有一个顶点在凸包内部,也就发生了碰撞(相交),相反,如果一个顶点也不在凸包内部,此时,可能是没有碰撞,也可能是凹包完全包含了凸包。可以看出,这个简单的方法并不严密,效率也不高,因为针对每个凹包顶点都需要逐一遍历,以凹包顶点数乘以凸包顶点数的计算复杂度才能完成。
更高效严密的算法,见后续文章。

五、游戏中的凹包与凸包应用

在游戏中,最常见的凸包应用就是动态碰撞体,凹包应用就是静态碰撞体,一般而言,当碰撞体产生交叉时,物理引擎就会将可运动的碰撞体弹开,而每次接近运动时,只需要判断运动方向上,可能侵入凸包范围内的那些顶点,因此刚体凸包与非常复杂的静态碰撞体凹包之间的相互计算也非常快。
然而,在某些情况下,刚体不允许被弹开,比如在Unity中将某个静态碰撞体设置为Trigger,作为触发区域,它本身不做碰撞反应,然而却需要做碰撞检测,在这种情况下,性能开销相对于非Trigger状态开销要大得多,因为整个Trigger都允许侵入刚体,所以作为Trigger,首先需要使用凸包,IsConvex要首先开启,才可以IsTrigger,即便都是用凸包,仍然非常消耗性能。所以应该尽可能精简Trigger碰撞体的顶点数。

六、凹包与凹包的相交计算

见后续文章“扫线法快速判断凹多边形相交”

展开阅读全文

Git 实用技巧

11-24
这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑问,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先commit然后再去push,而不是一条命令一次性搞定; 更多的开发者对Git已经入门,不过在遇到一些代码冲突、需要恢复Git代码时候就不知所措,这个时候哪些对 Git掌握得比较好的少数人,就像团队中的神一样,在队友遇到 Git 相关的问题的时候用各种流利的操作来帮助队友于水火。 我去年刚加入新团队,发现一些同事对Git的常规操作没太大问题,但对Git的理解还是比较生疏,比如说分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突问题的处理等,我在协助处理这些问题的时候也记录各种问题的解决办法,希望整理后通过教程帮助到更多对Git操作进阶的开发者。 本期教程学习方法分为“掌握基础——稳步进阶——熟悉协作”三个层次。从掌握基础的 Git的推送和拉取开始,以案例进行演示,分析每一个步骤的操作方式和原理,从理解Git 工具的操作到学会代码存储结构、演示不同场景下Git遇到问题的不同处理方案。循序渐进让同学们掌握Git工具在团队协作中的整体协作流程。 在教程中会通过大量案例进行分析,案例会模拟在工作中遇到的问题,从最基础的代码提交和拉取、代码冲突解决、代码仓库的数据维护、Git服务端搭建等。为了让同学们容易理解,对Git简单易懂,文章中详细记录了详细的操作步骤,提供大量演示截图和解析。在教程的最后部分,会从提升团队整体效率的角度对Git工具进行讲解,包括规范操作、Gitlab的搭建、钩子事件的应用等。 为了让同学们可以利用碎片化时间来灵活学习,在教程文章中大程度降低了上下文的依赖,让大家可以在工作之余进行学习与实战,并同时掌握里面涉及的Git不常见操作的相关知识,理解Git工具在工作遇到的问题解决思路和方法,相信一定会对大家的前端技能进阶大有帮助。
©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值