首页 > 其他分享 >DOTS Unity.Physics物理引擎碰撞查询核心分析

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

时间:2024-01-11 10:35:40浏览次数:36  
标签: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: 返回碰撞所对应的材质信息;

 

今天的分享就到这里

标签:DOTS,返回,物体,碰撞,查询,Unity,Physics,物理
From: https://www.cnblogs.com/rainy1unity/p/17958000

相关文章

  • Unity DOTS物理引擎的核心分析与详解
    最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们来给大家分享和介绍一下这个物理引擎的使用。Unity.Physics的设计哲学 Unity.Physics是基于DOTS设计思想的一个高性能C#物理引擎的实现,  包含了物理刚体的迭代计算与碰撞检测等查询。Unity.P......
  • Unity3D 最后一次drawcall 如何避免详解
    Unity3D是一款广泛使用的游戏开发引擎,它基于C#编程语言,可以实现跨平台的游戏开发。在Unity3D中,drawcall是一个非常重要的概念,它指的是渲染引擎每次渲染物体时所调用的函数。过多的drawcall会导致游戏性能下降,因此我们需要采取一些措施来避免过多的drawcall。对啦!这里有个游戏开发......
  • Unity3D 如何把全部游戏逻辑都放到lua层实现详解
    Unity3D是一款非常流行的游戏开发引擎,它支持C#、JavaScript和Boo等脚本语言。然而,有时候我们可能希望将全部游戏逻辑都放到Lua层实现,这样可以更方便地进行游戏逻辑的修改和调试。本文将详细介绍如何使用Unity3D将全部游戏逻辑都放到Lua层实现。对啦!这里有个游戏开发交流小组里面......
  • Unity3D 在移动端的性能优化指标怎样才算合理方面详解
    Unity3D是一款非常强大的跨平台游戏开发引擎,它能够在不同的平台上实现高质量的游戏开发。然而,在移动端上,由于硬件性能的限制,需要进行一定的性能优化才能保证游戏的流畅运行。本文将详细介绍Unity3D在移动端性能优化方面的指标和技术,并给出相关的代码实现。对啦!这里有个游戏开发交......
  • Unity3D 原始对象和占位对象详解
    Unity3D是一款强大的跨平台游戏引擎,提供了丰富的功能和工具,方便开发者创建各种类型的游戏。在Unity3D中,原始对象和占位对象是两个重要的概念。本文将详细介绍原始对象和占位对象的概念、技术详解以及代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小......
  • 在Unity中使用动捕数据实时驱动3D数字人,让3D内容创作更简单
    Unity引擎和UE引擎,是当今使用人数最多的游戏引擎软件之一,它们被广泛用于游戏开发、虚拟现实、增强现实和其他交互式3D应用程序的开发。DSFUN-Unity插件能够帮助开发者更便捷地在Unity平台中利用动捕数据进行高效创作,提升项目效率。一、插件放入当前项目文件夹下将资源包包放入unit......
  • Unity3D UGUI的Button组件的介绍及使用详解
    Unity3D是一款功能强大的游戏开发引擎,而UGUI是Unity3D提供的一套用户界面系统。在UGUI中,Button组件是最常用的组件之一,本文将详细介绍Button组件的使用方法和相关技术细节。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大......
  • VMware Tanzu Community Edition (TCE) 0.9 - 适合所有人的 Tanzu Kubernetes
    作者:gc,主页:www.sysin.org2021.10.04,VMware宣布了一个非常令人兴奋的新项目,称为TanzuCommunityEdition。以下TanzuCommunityEdition介绍翻译自VMware相关博客。什么是Tanzu社区版,为什么要关心?今天,最终用户(管理员、架构师、开发人员、平台运营商等)很难获得VMware的Tan......
  • Unity引擎2D游戏开发,音源设置和音效播放
    导入资源包在UnityAssetsStore当中,下载导入下面两个资源包到Unity中在Unity中,下载导入到项目当中新建一个文件夹,命名为Audio,将导入的两个文件夹放进来挂载音效打开MainCamera,能够发现该摄像机带有一个名为“AudioListener”的组件该组件用于监听音源发出的声音当摄......
  • Unity3d Vertex/Fragment Shader添加Shadow
    Shader"ZX/BaseVertFragmentShadow"{Properties{_DiffuseTexture("DiffuseTexture",2D)="white"{}_DiffuseTint("DiffuseTint",Color)=(1,1,1,1)}SubShader{......