深入分析物理引擎后,他写了一个轻量的 Cocos 3D 碰撞检测优化方案

这篇具有很好参考价值的文章主要介绍了深入分析物理引擎后,他写了一个轻量的 Cocos 3D 碰撞检测优化方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言:碰撞检测是游戏开发中一个非常重要的技术点,优化碰撞检测性能,是提升游戏体验不可或缺的一环。开发者「我叫98K」写了一个轻量碰撞系统,用以改善 3D 游戏在不同平台遇到的碰撞性能问题和包体问题。下载和在线体验地址见文末。

98K物理-轻量碰撞系统是一个高性能轻量 3D 碰撞管理器,适用于 Cocos Creator 3.4 及以上版本,对 Mesh 模型和基本几何体提供高效的碰撞系统和射线检测系统,以提升游戏在不同平台上的 3D 碰撞检测性能,减少包体大小(尤其是 H5 平台)。

先通过在线体验,看几组应用效果:

http://www.cocospro.com/98K/

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

场景1,碰撞测试

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

场景1,1000射线测试

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

场景2,碰撞测试

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

场景2,1000射线测试

本文主要和大家详细介绍 98K 中最为重要的自定义碰撞系统的功能与使用、及其实现思路与技术要点,感兴趣的小伙伴可以深入了解。

功能特点

98K 的主要功能特点有:

  • 多物体场景管理:Octree,对场景物体进行高效划分查询。

  • 模型三角化管理:Kdtree,对物体表面进行高效划分查询。

  • 通用 3D 碰撞计算:GJK+EPA,精确计算修正碰撞后的物体。

  • 3D 角色控制器:3D 物体在场景碰撞系统下的自由移动。

  • 高效射线检测:基于 Octree 和 Kdtree 对射线检测加速。

我们在 H5 环境下,对比 98K 和 Bullet,PhysX(由于 Cannon 对 mesh collider 支持不完善,不参与比较)。

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

虽然和 Bullet、PhysX 相比,98K 的功能还不够全面,但是在需要使用 3D 碰撞检测和射线检测的 MMO、SLG、FPS 等 3D 场景的游戏中,目前 98K 提供的功能已经可以满足需求,并且 98K 更加轻量,使用也更简单一些,可以替代 Bullet、PhysX。

使用方法

前一段时间孙二喵制作的 3D 跑酷游戏 Demo 就使用了 98K,我们以此为例,看看这一系统在实际游戏项目中的使用方法与效果。

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

源码下载:

https://store.cocos.com/app/detail/4084

在线体验:

http://learncocos.com/jare/?v=1.01

该游戏场景超过100万面,而且地形较不规则,使用 Bullet+Mesh Collider 整体开销会比较高,所以孙二喵使用了 98K,以获得更好性能。

相对于 Bullet Mesh Collider 初始化满和设置麻烦的缺点,98K 的 Mesh Collider 可以说是键设置。

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

我们可以制作1个小脚本,在编辑器环境下,给所有的 Mesh 都加上 98K 的碰撞组件。

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

然后把所有有 Object3D 碰撞组件的物体都加到我们的主场景下面。

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

进入场景后,再进行构建。

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

后续有需要增加和删减碰撞体,也可以通过 World 里的方法进行操作。

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

同时 98K 也提供了射线检测功能。我们可以通过射线检测地面,来处理跳跃等逻辑。

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

98K 的另外一个特点是使用了简单的数学公式,这部分可以进行定点数的处理,方便联机游戏处理帧同步,目前也已经有开发者进行了二次开发。

技术要点

接下来简单介绍一下 98K 中自定义碰撞系统的技术实现要点,以及我选择现在这个优化方案的思路与原因。

在造轮子前,得先了解轮子是怎么构成,才能更好的去改造。

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

功能分层结构图

物理引擎进行碰撞检测的基本流程包含三个环节:

  • Board-Phase(粗略筛选碰撞对)

  • Narrow-Phase(精确计算碰撞对)

  • Resolve-Phase(修正碰撞速度位置)

Board-Phase

Board-Phase 的目标是快速排除掉不可能发生碰撞的物体对,以此提高后续碰撞检测的效率。空间划分是这一阶段最重要的部分。在游戏开发中,我们常用各种空间数据结构来加速计算。

多叉树:四叉树与八叉树

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

四叉树

四叉树是很常见的一种 2D 碰撞检测方法,实现手段也五花八门。不过在具体实现中要注意优化细节,控制建树时间消耗与建树空间大小,特别是在 JS 语言环境下。但四叉树的射线检测、区域检测效率比较高,树更新很快,会产生物体多次划分,空间占用大。

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

八叉树

八叉树虽然包围精确性没 BVH 高(可用状态压缩改善)、占用空间较大(过度划分),但是建树和增删非常快,很适合用作物体的筛选。目前 98K 使用了八叉树对模型包围盒进行空间划分,简单高效的建树比精确计算建树(比如 BVH 建树会有大量计算消耗)更加划算。缺点和四叉树一样,射线检测、区域检测较快,树更新很快, 会产生物体多次划分,空间占用大。

二叉树:BVH,BSP,k-d

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

BVH

四叉树和八叉树是以平均空间来划分物体,划分算法简单,而 BVH 是对当前物体集合进行空间的划分,追求左右空间大小相对均衡且无相交。BVH 构建的一般是二叉树,划分算法复杂。

主流物理引擎都有采用 BVH,因为其功能支持完备、查找精确性高、性能不俗。但是其在建树和增删改时要维护平衡树,消耗很大。针对这个问题,有一些时序性的空间优化方法,通过减少增删改达到优化目的,感兴趣的朋友可以参考各大物理引擎中的实现方法。

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

BSP

BSP(Binary Space Partitioning Tree),二维空间分割树,非常经典,1993年在知名游戏 DOOM 里第一次被应用,早期 CS 也是用 BSP 来做地形碰撞。BSP 通常通过计算得到一个合理的任意角度片面或者法线,然后对空间进行划分。标准的 BSP 虽然高效,但树构建非常消耗时间,通常都是编辑器预处理,比较适合静态模型或者静态场景使用。

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

k-d 树

k-d 树是一种特殊的 BSP 树,它基于动态计算的三个轴进行划分。k-d 树相比 BSP 可能精确性没那么高,但是建树时间大大减少,因为对轴划分算法简单,所以很适合使用。目前 98K 用 k-d 树方式来维护模型的三角形数据,用于碰撞和射线检测。

其他:SAP

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

SAP

SAP(Sweep And Prune) 又称为扫掠法,也是物理引擎的一种常用碰撞检测方式。SAP 比较轻便,增删改比较快,物体不会被多次划分,对静态模型是非常快。它唯一缺点是性能不太稳定,每次只能对单个轴进行扫描,有时会有大量物体投影重叠,导致查询不稳定。而且射线检测和区域检测,需要额外的扩展来优化,性能也一般,没上面各种树结构的方便和高效。

Narrow-Phase

在这个阶段,我们需要对筛选后的这些可能发生的碰撞进行精确计算,判定他们是否发生了碰撞,如果发生碰撞,还需计算出碰撞点、碰撞法线等细节。

几何计算

数学方法,从分离角度来判断碰撞,一般用于常见的几何图形之间的碰撞计算,速度非常快。良好的物理引擎必不可少这些数学方法,各大引擎都能找到它们的身影。

GJK + EPA

凸包算法,从重叠角度来探索碰撞。GJK 的原理核心是,当两个物体发生重叠时,它们必然有一个坐标相减为原点。GJK 检测出碰撞后,再用 EPA 在 GJK 构建的数据下,进一步计算出穿透的距离碰撞点和碰撞法线。

基本上主流物理引擎都有使用 GJK+EPA,和前面几何数学方法混合使用,可以大幅提升碰撞计算性能。98K 也是同时混合使用以上两种方法,支持基本几何模型计算,也能支持三角化 mesh 或者凸包化 mesh 的计算。

Resolve-Phase

在上一个阶段,我们已经确定了是否发生碰撞和碰撞的细节,最后阶段即是修正他们的位置和速度。这一过程非常耗时,目前 98K 只提供了简单高效的修正处理,更多重心还是放在解决现有的碰撞性能问题上。

98K 优化方案

物理引擎是一套复杂完整的过程,没办法在功能上做分割,所以一定程度上会造成不必要的性能消耗,例如 Resolve 阶段消耗就很大,过程中还有大量的必要变量缓存的计算也会带来一定消耗。而考虑到健壮和可读性,物理引擎代码的写法和缓存的用法也不会过于激进。

在某些项目——比如轻量化的 RPG、MMO、FPS 中,我们很多时候需要的是高效碰撞和修正,而并不需要完全真实的物理模拟效果(如果只需要简单重力效果或者碰撞效果,通常直接自己实现模拟)。

因此,98K 在算法、写法、缓存上对物理引擎几大模块进行了优化,使之更加精简高效。经过一系列的评估,98K 最终采用了以下方案:

  • 优化1:八叉树,筛选物体

  • 优化2:kdtree,筛选三角形

  • 优化3:几何体,筛选三角形

  • 优化4:GJK + EPA,筛选和计算

选用八叉树和 kdtree 做优化,不仅是因为它们性能较好,还因为它们可以为射线检测加速做支持,所以 98K 也实现了高性能的射线检测系统

资源链接

  • 点击文末【阅读原文】下载源码

https://store.cocos.com/app/detail/4035

  • 在线试玩(注:该 Demo 性能并不是最优,最新优化工程的运行性能要快1倍以上)

http://www.cocospro.com/98K/

限于篇幅,98K 中定制的 octree、kdtree、GJK/EPA 的实现过程和优化细节就不在本文展开了,可以先参看实际源码,后续有机会再详细展开分析,同时欢迎大家试用、反馈和提供好的建议。

往期精彩

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎

kdtree 做碰撞检测,3d,cocos2d,unity,vr,游戏引擎文章来源地址https://www.toymoban.com/news/detail-772976.html

到了这里,关于深入分析物理引擎后,他写了一个轻量的 Cocos 3D 碰撞检测优化方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 教你使用PHP实现一个轻量级HTML模板引擎

    🏆作者简介,黑夜开发者,全栈领域新星创作者✌,2023年6月csdn上海赛道top4。多年电商行业从业经验,对系统架构,数据分析处理等大规模应用场景有丰富经验。 🏆本文已收录于PHP专栏:PHP进阶实战教程。 🏆另有专栏PHP入门基础教程,希望各位大佬多多支持❤️。 在 W

    2024年02月15日
    浏览(46)
  • DOTS Unity.Physics物理引擎碰撞查询核心分析

      最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们给大家分享和介绍一下这个物理引擎的碰撞查询以及核心相关概念。 Unity.Physics碰撞查询概述   碰撞查询(Collison Qurey)是Unity.Physics物理引擎中的一个很重要的功能。很多游戏逻辑都需

    2024年04月25日
    浏览(46)
  • DOTS Unity.Physics物理引擎的核心分析与详解

    最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们来给大家分享和介绍一下这个物理引擎的使用。 Unity.Physics 的设计哲学 Unity.Physics是基于DOTS设计思想的一个高性能C#物理引擎的实现,  包含了物理刚体的迭代计算与碰撞检测等查询。Unity.

    2024年03月18日
    浏览(53)
  • 解密Elasticsearch:深入探究这款搜索和分析引擎

    作者:京东保险 管顺利 最近使用Elasticsearch实现画像系统,实现的dmp的数据中台能力。同时调研了竞品的架构选型。以及重温了redis原理等。特此做一次es的总结和回顾。网上没看到有人用Elasticsearch来完成画像的。我来做第一次尝试。 背景说完,我们先思考一件事,使用内存

    2024年02月03日
    浏览(36)
  • cocos游戏引擎--cocos creater2.4.10

    新建项目 打开其他项目 在 Dashboard 中,打开 新建项目 选项卡,选中 Hello World 项目模板。js   资源管理器 Scene 场景编辑器 Node Tree 层级管理器 属性检查器(Properties) 控件库 控制台(Console) 最左边选择预览窗口的比例大小,来模拟在不同移动设备上的显示效果 Rotate 按钮决

    2024年01月24日
    浏览(53)
  • 从0开始做游戏—-cocos引擎

    最近小游戏做完了,记录一下。开发工具cocos creator,纯前端。 游戏介绍 小游戏一共只有两个游戏场景,分别是开始界面和游戏界面。 开始界面 游戏界面 游戏实现 游戏背景无限滚动(用两张背景图交替往上滚动,实现游戏背景一直在动) 自动生成新的阶梯以及小球和阶梯

    2024年02月13日
    浏览(44)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(62)
  • 全新适配鸿蒙生态,Cocos引擎助力3D应用开发

    原文链接: 全新适配鸿蒙生态,Cocos引擎助力3D应用开发,点击链接查看更多技术内容; 一、适配HarmonyOS背景 HarmonyOS 3.1版本自发布以来,备受广大开发者的好评,同时也吸引了鸿蒙生态众多伙伴的青睐。 鸿蒙生态所强调的智慧全场景、多端联动与跨设备流转等能力,与Coc

    2024年02月09日
    浏览(50)
  • 使用“Cocos引擎”创建的cpp工程如何在VS中调试Cocos2d-x源码

    前段时间Cocos2d-x更新了一个Cocos引擎,这是一个集合源码,IDE,Studio这一家老小的整合包,我们可以使用这个Cocos引擎来创建我们的项目。 在Cocos2d-x被整合到Cocos引擎之前,我们可以不那么方便地在我们创建的工程里调试Cocos2d-x的代码,当我们使用了整合后的Cocos引擎,调试

    2024年02月12日
    浏览(54)
  • cocos游戏引擎制作的滚动框地图防止误点操作的简单方法

    本篇文章主要讲解,使用cocos creator 来解决在我们日常滚动框开发中,滚动和触摸存在冲突的情况,导致的误触行为的解决办法。 日期:2023年11月25日 说明:在我们滚动滚动框时,会出现误点的情况,这时我们用代码解决需要进行上锁,但实际上cocos引擎给出了很简单的解决

    2024年02月03日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包