DOTS Unity.Physics物理引擎碰撞查询核心分析

  最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们给大家分享和介绍一下这个物理引擎的碰撞查询以及核心相关概念。

Unity.Physics碰撞查询概述

  碰撞查询(Collison Qurey)是Unity.Physics物理引擎中的一个很重要的功能。很多游戏逻辑都需要基于碰撞查询来实现,比如一个子弹是否打到了物体,具体打在了哪个部位,这些都需要依赖Collison Qurey来实现。Unity Physics物理引擎有强大的碰撞查询功能,包含了:射线检测,形状检测,最近点计算等。

  碰撞查询(Collison Qurey)计算的时候,读取的是物理引擎里面的内部数据,更准确的说是broadphase阶段的内部数据。Broadphase阶段的计算发生在PhysicsInitializeGroup中计算。当我们完成broadphase 阶段的计算后,只有到下一次PhysicsInitializeGroup碰撞查询所需要数据才会更新。所以我们在DOTS编写代码的时候,要把碰撞查询的System代码放在PhysicsInitializeGroup之前或之后。如果你想要获得更精准的碰撞查询信息,可以在PhysicsSimulationGroup完成物理迭代的计算后,同步更新最新的物理数据到碰撞查询所需要的数据结构中,这样碰撞查询更精准但是也会消耗更多的性能。如果需要物理引擎迭代计算完后把数据同步到Collision Qurey所依赖的内部数据中,我们只要的打开SynchronizeCollisionWorld开关就可以了(组件PhysicsStep.SynchronizeCollisionWorld)。如果开启了SynchronizeCollisionWorld属性,我们需要把碰撞查询的代码逻辑System执行顺序放在PhysicsInitializeGroup之前或PhysicsSimulationGroup之后。   

  碰撞查询可以针对单个的碰撞器或者是整个物理世界。当我们是对整个物理世界来作查询的时候,内部是基于一个a bounding volume tree结构来作高效的碰撞查询。你也可以创建独立于物理世界的碰撞世界。如果你使用的是物理世界,那么碰撞查询所需要的数据都是发生在物理迭代计算的broad phase阶段。

Unity Physics支持的碰撞检测类型

  • 射线检测(Ray Cast):

      沿着射线或线段的方向找出所有or最近的相交的物体。输入为Start(起点), End(终点),Filter(检测过滤标记)。返回为一个碰撞检测的集合。注意射线检测传过一个物体后,返回的结果只有开始进入的那个点,从物体出来的那个点不会被计算出来。

  • 碰撞器检测(Collider cast):

      给定一个特定的形状,沿着一条直线的起点到终点的方向来做碰撞测试,这个形状撞到空间中的物体就返回碰撞结果。如下图所示,橙色的碰撞器沿着直线的方向与黄色的物体相交,相交的性质与位置在紫色的地方。返回紫色与黄色物体相交的碰撞信息。   

  • 距离检测(Distance query)

    • Point Distance Query: 给定一个原点O,给定一个最大的半径(maximum radius),向四周发散,当射线撞到空间中的物体后,返回物体表面到给定原点O距离最近的点。
    • Collider Distance Queries: 给定一个物理世界里面的Collider,给定一个最大的半径,向四周发散,放回从Collider到物体表面最近的两个点。   

  碰撞检测返回的主要数据类型:

  • Fraction: 返回特定方向上与交点的比例系数;
  • Position:返回物体表面交点的世界坐标;
  • SurfaceNormal: 返回物体表面的交点的法线
  • RigidBodyIndex:返回碰撞查询世界里面的刚体所在的索引;
  • Entity:返回碰撞查询世界中刚体所对应的Entity;
  • ColliderKey: 返回碰撞所在的三角形面的更加详细的内部信息;
  • Material: 返回碰撞所对应的材质信息;

  今天的分享就到这里,关注我们 + 企.鹅.裙 428 540 563 获取更多的DOTS的相关资料


  下面是DOTS的VIP课程前18节视频,免费观看

Unity DOTS进阶与项目实战(B站18集)

第001课DOTS的环境安装与准备事项

第002课 DOTS的核心机制与概述

第003课DOTS的SubScene

第004课Component的概述与普通组件的Baker

第005课System与SystemGroup概述

第006课DOTS中的ECS核心概念总结

第007课Baking系列之Baking与Baker详解

第008课Baking系列之BakingSystem与BakingWorld详解

第009课FilterBakingOutput与PrefabsInBaking

第010课BlobAsset核心机制分析

第011课Aspect核心机制分析

第012课 StructChange核心机制详解

第013课Managed与Unmanaged Component详解与性能分析

第014课ShareComponent核心机制与性能分析

第015课CleanupComponent核心分析

第016课 Dynamic Buffer Component详解与分析

第017课Tag与Chunk Component详解与分析

第018课Enableable与Singleton组件详解与分析

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值