首页 > 其他分享 >BEPUphysicsint碰撞事件详解

BEPUphysicsint碰撞事件详解

时间:2023-10-27 11:22:04浏览次数:35  
标签:BEPUphysicsint 碰撞 引擎 事件 延时 复合体 详解 物理

上一节我们給大家介绍了BEPUphysicsint的基本使用,在游戏开发中我们经常要使用物理引擎的事件,所以本节我们详细的讲解BEPUphysicsint 的物理事件。此物理引擎会产生了碰撞事件与非碰撞事件,碰撞事件大家好理解,非碰撞事件例如: 物理Entity的update事件,Entity的activation/deactivation事件等。本文主要详解由物理碰撞所导致的事件。

 

如何获取物理事件

 

接下来分析一下如何获得物理事件的delegate。每个可碰撞的物理Entity的有一个Collidable 对象,通过访问它的CollisionInformation属性就能获取得到,每个Collidable 都有一个自己的ContactEventManager, 通过访问Events 的每个Event的属性,就可以往里面添加回调函数,就可以获得该事件。所以获取物理事件的delegate: entity. CollisionInformation.Events.xxxxx事件。这样添加一个物理事件,我们可以做如下操作:

 

当物理引擎有物理事件发生的时候,就会触发回调到你对应的设置函数。

 

碰撞事件的类型

 

在物理Entity的ContactEventManager种我们可以找到所有的事件与事件类型,接下来详细讲解几组关键的物理碰撞相关的事件类型。

 

及时事件与延时事件

我在物理引擎中会有两类事件,一类是及时事件(ing,正在进行时),一类是延时事件(ed,过去式)。上面我们列举出来的事件都式延时事件,例如: ContactRemoved 每个后缀都是ed结束,表示延时事件。与之相对应的还有正在发生的事件(ing, 正在进行时),比如:PairRemoved /RemovingPair,这两个事件的区别在于一个是延时事件,一个是正在进行时事件。

 

在事件回调中安全的处理事件

 

物理事件的回调函数,都是物理引擎执行中回调的,有可能有些操作会改变物理引擎运行环境的Context,导致不安全的操作与异常,如何在回调函数中正确的安全的处理呢?

对于延迟事件,是在处理完所有的物理计算后,再来进行延迟事件处理的,所以相对来说还是安全的。这里你要注意一点,就是在延迟事件处理函数中的数据对象,有可能会在调用完事件函数后回收这些数据对象,所以你自己收集这些数据对象的时候要小心,小心物理引擎内部把传过来的事件对象数据給回收掉。

及时事件,相对于延时事件来说安全性就要小很多,因为它是物理引擎计算过程中调用的。正式由于它们是物理引擎迭代计算交互时调用,所以你可以拦截与修改物理交互。如果引擎使用多线程,即从工作线程(相比物理引擎主线程的另外一个线程)来调用物理引擎的及时事件,就要注意线程处理的上下文。及时事件的处理在回调函数内一次性解决,不应该保留到事件处理函数之外。

 

复合体的事件处理

在BEPU物理引擎中还有复合体(Compound Bodies)的概念,复合体为碰撞的子实体组成,子实体中有可以为子复合体,这样,就形成了一个复合体的树。复合体本身是没有物理几何学,它的非复合子对象是它的物理几何体。

在Compound Body中收集每个孩子的碰撞检测的事件是很不方便的,为了方便处理Compound Body收集孩子的物理事件后,触发到它的事件上。

 

今天的分享就到这里了,关注我们,持续的学习BEPUphysint3D物理引擎实战系列。

 

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

 

标签:BEPUphysicsint,碰撞,引擎,事件,延时,复合体,详解,物理
From: https://www.cnblogs.com/bycw/p/17791839.html

相关文章

  • Health Kit接入资质要求详解,开发不迷路!
    开发运动/健康应用过程中,需要使用HealthKit提供的数据能力,作为独立的个人开发者或是企业开发者,接入时分别需要满足什么样的条件呢?个人开发者接入资质审核要求•个人开发者应用需上架至华为应用市场。个人开发者应用未上架华为应用市场,或者个人开发者应用非移动应用,暂不开放Heal......
  • Unity ECS内存分配器原理详解
    ECS为什么会高效,性能好,Entity的内存布局与分配就是非常重要的部分,今天我们一起来分析一下UnityECS架构里面如何来做高效的内存分配器。这种思路也可以给我们做内存分配提供很好的一个思路。1:ECS 里面基本的一些概念UnityECS框架里面有几个重要的概念:Entity,ComponentD......
  • Go语言函数详解
    函数(1)函数的定义函数使用func进行定义函数是基本的代码块,用于执行一个任务Go语言至少有一个main函数函数声明告诉了编译器函数的名称,返回类型和参数//1.无参数无返回值函数的定义functest1(){fmt.Println("无参数无返回值函数的定义\n")}//2.有参数无返回值函数......
  • 【技术文档】RTSP协议详解
    1 概要RTSP(RealTimeStreamingProtocol)实时流协议:一种流媒体控制协议,可对流媒体进行暂停、快进、快倒等操作。流媒体就是实时在线点播。而流媒体与普通媒体的差别在于:对于普通媒体,在访问它之前要得到全部的内容;对于流媒体,则在完全接收到全部内容之前就开始访问。本文主要介......
  • Java map详解 - 用法、遍历、排序、常用API等
    java.util中的集合类包含Java中某些最常用的类。最常用的集合类是List和Map。Map提供了一个更通用的元素存储方法。Map集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。本文主要介绍javamap的初始化、用法、map的四种常用的遍历方式、map的排序以及常用ap......
  • STL之AVL模拟的实现(万字长文详解)
    STL之AVL模拟的实现AVL树的概念为什么会有AVL树?在STL中对map/multimap/set/multiset其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结......
  • Unity Addressable资源管理方案实战详解
    Unity推出了全新的Addressable的资源管理方案, 全网一夜间觉得不用Addressable感觉自己的资源管理方案会低一个档次,本节我们将详细的分析Addressable资源管理系统。本节主要从以下3个点来进行分析:(1) Addressable的本质是什么?AssetsBundle是否过时了?(2) Assetsbundle使用实......
  • zblog数据库结构 表和字段详解
    表结构说明:表名储存信息zbp_category分类表zbp_comment评论表zbp_config插件配置表zbp_member用户表zbp_module模块表zbp_post文章表zbp_tag标签表zbp_upload附件表分类表:zbp_category表数据结构CREATETABLEzbp_category(......
  • 一文详解多模态大模型发展及高频因子计算加速GPU算力 | 英伟达显卡被限,华为如何力挽狂
    ★深度学习、机器学习、多模态大模型、深度神经网络、高频因子计算、GPT-4、预训练语言模型、Transformer、ChatGPT、GenAI、L40S、A100、H100、A800、H800、华为、GPU、CPU、英伟达、NVIDIA、卷积神经网络、StableDiffusion、Midjourney、FasterR-CNN、CNN随着人工智能技术的快......
  • TestNG+Webdriver 页面自动化详解
    最近学习了一下TestNG+Webdriver的页面自动化,虽然中间遇到了很多问题,也走了不少弯路,不过最终还是运行起来了。下面就详细讲解一下,如何去配置环境及编写测试用例!环境配置1,eclipse+jkd的安装这是基本的开发环境,具体的配置在此就不累述了,网上有很多相关文档,请自行查阅。2,TestNG......