BEPU物理引擎碰撞系统的架构与设计
创始人
2024-04-28 11:27:23
0

前面我们讲解了如何监听物理引擎的碰撞事件, 在物理引擎内核中如何架构与设计碰撞规则,使得物理Entity与周围的物理环境产生碰撞时,如何灵活的控制物理碰撞,本节給大家详细的讲解BEPUphysicsint 物理引擎内部是如何管理与控制碰撞规则的。本文主要讲解3个部分:

(1) 物理引擎碰撞计算的全流程详解;

(2) 用户控制碰撞关系的规则详解;

(3) 与物理碰撞相关的其它一些注意事项;

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

物理引擎碰撞计算的全流程详解

物理引擎的碰撞计算是物理引擎性能消耗的部分之一,物理引擎如何高效的做好物理碰撞计算与物理引擎内核如何标准的处理碰撞检测流程(pipeline),详细的步骤如下:

(1) BroadPhase 快速粗略碰撞检测。 通过这个步骤,快速的计算筛选出来可能产生碰撞的物理Entity碰撞对(Entity Collison Pair)。要实现这个设计目标我们可以从物体与场景入手,可以简化物体的形状来做碰撞检测,通过物理场景,快速的排除掉不可能发生碰撞的物体,从而替代简单的暴力搜索O(n^2)。每个物理Entity都有自己的包围盒,能包围住整个物理Entity的形状,当两个物理Entity的包围盒有重叠的时候,物理引擎会产生一个潜在可能的碰撞对,如图1.6-1

图1.6-1

找到这个碰撞对后,就会把物理碰撞对加入到物理世界的碰撞列表中,来进行下一步计算。

(2) NarrowPhase 精确的计算碰撞,生成碰信息。经过第一步的粗略计算,找出来了可能发生碰撞的物理Entity碰撞对。接下来就是要根据物理Shape形状与角度来精确的计算出来是否有真实的碰撞以及详细的碰撞点位置,表面法线信息等。注意不是所有的碰撞对都会产生碰撞,如上图1.6-1所示,BroadPhase阶段产生了碰撞,但是NarrowPhase阶段,却发现没有产生碰撞。

(3) Collision Respones阶段: 物理碰撞系统的最后一个阶段就是迭代计算出碰撞对每个物理Entity运动改变的影响。因为物理引擎中不允许两个物理Entity穿透。所以碰撞后就会改变物理Entity的运动状态。

用户定义碰撞规则

在物理引擎Pipeline的物理碰撞计算中要筛选出物理Entity碰撞规则。碰撞规则是指进入碰撞标准流程计算中采用哪种策略。用户可以指定物体的碰撞规则,指定碰撞计算策略。用户定义碰撞规则可由有3个地方产生出来, 这3个地方按照优先级进行筛选,如果当前没有,就进入下一个位置筛选,都没有,就用默认的碰撞规则。3个地方的分别如下(按照优先级来区分):

Specific特殊碰撞规则表: 物理Entity有一个Specific列表保存了一些物理的Entity实例以及与这些Entity实例的碰撞规则,如果碰撞对中的Entity实例在这个表中,就返回这个表中的碰撞规则。否则就进入下一个规则产生阶段。

Personal 私有碰撞规则: 针对单个的物理的Entity,如果物理Entity设置了这个碰撞规则,就是用这个碰撞规则。

Group 碰撞分组:每个物体都可以设置一个碰撞分组,如果没有设置就使用默认的碰撞分组。由所在的碰撞分组来决定碰撞规则。

这3个决定碰撞规则的地方的优先级别如图1.6-2所示:

图1.6-2

上面提到一个概念,碰撞规则,碰撞规则是决定了物体与物体之间的碰撞该如何处理与计算。BEPU物理引擎分成了几个规则:

CollisionRule.Normal: 允许碰撞对(Collision Pair)经历完整的碰撞计算,完整的碰撞计算包括了broad phase, narrow phase, collision response三个阶段。

CollisionRule.NoSolver: 允许碰撞对经历broad phase, narrow phase阶段,但是不计算碰撞信息与对物体运动状态的改变。

CollisionRule.NoNarrowPhaseUpdate: 允许碰撞对经历broad phase 与第一阶段的narrow phase。但是narrow phase的计算结果不更新到碰撞对中。

CollisionRule.NoNarrowPhasePair: 允许碰撞对经历broad phase的粗略测试,不进行narrow phase 测试。

CollisionRule.NoBroadPhase: 不做任何的碰撞测试。

CollisionRule.Defer: 延后决定,一个比较特殊的状态,上面说了有3个地方可以决定碰撞策略,如果某一个地方没有碰撞策略,就返回CollisionRule.Defer,进入到下一个地方。如果所有都没有,就使用默认的策略。

讲解完这些基本概念以后,我们来介绍一下基于碰撞分组Group如何具体产生碰撞策略。这种模式是我们开发中最常用的模式,当Specific与Personal两个地方无法决定碰撞策略的时候,物体的碰策略就是由它所在的分组来决定。物理引擎内核中有一个CollisionGroupRules字典,描述了哪些Group分组到碰撞规则的映射。当前物体所属哪个组,就可以获得该碰撞规则。要创建一个用户自定义的组,只要new 一个CollisionGroup的实例,然后将与每个其它分组的碰撞规则设置到CollisionGroupRules表中即可。有时候每个物体的类型会有冲突,那么如何取舍呢?这里的碰撞策略有一个优先级:NoBroadPhase>NoNarrowPhasePair>NoNarrowPhaseUpdate>NoSolver>Normal。

物理碰撞相关的其它事项

用户可自定义broad phase的测试函数:我们可以通过设置物理Entity的CollisionRuleCalculator 的delegate 回调函数来定制broad phase碰撞测试时候的碰撞算法。这个回调函数最终会存到BroadPhase中的CalculateCollisionRuleCallback中。

kinematic 的物理Entity采用CollisionRule.NoSolver碰撞策略,这样可以不用改变它们的物理的运动状态。

今天的分享就到这里了,关注我们,可以获取Unity BEPUphysint3D实战源码。

下节预告: 基于BEPUphysicsint整合到Unity项目实战

相关内容

热门资讯

los系统和安卓系统的区别,两... 你有没有想过,为什么你的手机有时候运行得那么顺畅,有时候又卡得像蜗牛呢?这背后其实隐藏着两个大玩家—...
安卓系统可以安装cad软件,安... 你有没有想过,在安卓手机上也能轻松安装CAD软件呢?没错,就是那个专业的设计软件,以前只能在电脑上操...
车载ce系统与安卓系统的区别,... 你有没有想过,为什么你的车载系统有时候那么不智能,而安卓手机却总能给你带来惊喜?今天,就让我带你深入...
苹果6s系统换安卓系统,体验安... 你有没有想过,把你的苹果6s换成安卓系统呢?想象那流畅的触控体验,加上安卓那丰富的应用和可定制的界面...
安卓转移ios健康系统,探索健... 你有没有想过,从安卓手机转到iOS设备后,那些积累的健康数据怎么办呢?别急,今天就来给你详细解析如何...
安卓系统如何换微信号,教你如何... 你是不是也和我一样,对安卓系统换微信号这个话题感兴趣呢?毕竟,谁不想偶尔换个心情,换个昵称呢?好啦,...
安卓机清理系统内存,提升手机运... 手机用久了是不是感觉越来越卡?别急,今天就来教你怎么给安卓机清理系统内存,让你的手机焕发新生!一、内...
安卓子系统要求CPU,安卓子系... 你知道吗?最近在安卓系统圈子里,有个话题可是热得不得了,那就是安卓子系统对CPU的要求。这可不是小事...
安卓系统排名第几,引领智能时代... 你知道吗?在智能手机的世界里,有一个系统可是当之无愧的“王者”——那就是安卓系统!今天,就让我带你一...
阿里云是不是安卓系统,引领安卓... 最近是不是有很多小伙伴在问:“阿里云是不是安卓系统?”这个问题可真是让人好奇啊!咱们就来好好探讨揭开...
安卓系统音量调节的文件,安卓系... 你有没有遇到过这种情况:手机音量调得刚刚好,突然间就变得忽高忽低,让人听得心烦意乱?别急,今天就来跟...
平板刷安卓10原生系统,平板新... 你有没有想过,你的平板电脑也能拥有安卓10的原生系统呢?没错,就是那个流畅又强大的系统,现在它也能在...
安卓系统怎么设定位手机,安卓系... 你有没有想过,你的安卓手机是怎么知道你在哪儿的呢?没错,就是定位功能!这可是现代智能手机的一大亮点,...
升级的安卓系统怎样降级,安卓系... 你有没有遇到过这种情况?手机里的安卓系统突然升级了,结果发现新系统有点小bug,或者某些功能变得不那...
安卓刷机怎么升级系统,轻松实现... 你有没有发现,你的安卓手机最近有点儿慢吞吞的,是不是也想给它来个“大变身”,让它焕发新生呢?没错,刷...
安卓系统迷你小音响,便携式音乐... 你有没有想过,在忙碌的生活中,给自己一个小小的音乐角落,让心情随着音符跳动呢?今天,就让我带你走进一...
老安卓系统怎么删除页面,老安卓... 你有没有发现,手机里的安卓系统用久了,页面上的应用图标就像小山一样堆得高高的?有时候,看着这些图标,...
安卓手机死屏重置系统,轻松解决... 手机突然死屏了,是不是心里一紧?别慌,今天就来跟你聊聊安卓手机死屏后如何重置系统,让你轻松解决这个小...
安卓系统高怎么运行,解锁流畅体... 手机里的安卓系统突然变得卡顿起来,是不是让你感觉像是在迷宫里找出口?别急,今天就来给你支几招,让你的...
安卓系统新消息弹屏,体验升级 你知道吗?最近安卓系统又来了一大波新消息,这可真是让人兴奋不已!想象当你正在专心致志地刷着手机,突然...