基于cocos2d-x的2D空间中的OBB(Orient Bounding Box)碰撞检测算法

2023-11-10

引言

           最近在与好友聊天的过程中,好友问我如何实现类似这样的游戏。它主要想知道,如何检测旋转过后的物体与其他物体之间的碰撞。

           我们知道,在没有旋转的情况下,对于这样的方块,比较规则的物体,我们完全可以使用AABB(Axie-Align Bonding Box)来进行交叉检测,cocos2d-x内置的交叉检测函数也支持这样的功能。但是,在cocos2d-x中,并没有对旋转过后的物体支持进行检测。好友说,它发现经过旋转过后的AABB盒变的比原图要大,的确是这样的。在旋转之后,cocos2d-x内部会重新计算新的AABB盒。而我们知道AABB盒是和坐标轴平行的盒,所以它自然而然变大。(如果读者不知道为什么会变大了,不必深究,这并不是本文的重点)。

         想要解决这样的问题,我第一个想到的方案就是使用OBB(Orient Bounding Box)碰撞检测算法来实现。下面就来像大家讲述下,如何在2D空间中实现这样的算法,并且在后面给出大家一个使用cocos2d-x来演示的Demo。






OBB包围盒

            OBB,全称是Oriented Bounding Box,也就是带有方向的包围盒。实际上,它和AABB盒一样,也是一个矩形,只不过它具有任意的方向。对OBB进行结构表示,有很多种方法,我在下面的Demo中是使用矩形的四个顶点来定义OBB的。

            好了,我们知道了OBB的具体表现形式之后,我们就需要判断两个OBB是否相互碰撞,也就是是否有相互重叠的部分???这里有两种不同的方法来进行。

            第一种,我们通过判断OBB包围盒的四个顶点,是否都在另一个OBB盒的四条边定义的正半空间内,这样的方法很简单,感兴趣的同学可以自己去实现下。

            另外一种,也是本文将要介绍的方法,称为Seperating Axie Theorem(分离定理),简称为SAT,这是一种一般性的判断基本几何体是否分离的算法。也就是说,对于凸变形,我们都可以使用SAT来判断两个凸多边形是否发生重叠。对于做游戏开发的我们,很有必要掌握这样的理论。






SAT理论解释

            对于两个凸多边形,如果他们之间没有发生重叠,那么就是说,存在一个平面能够将这两个物体进行分离。读者可以看下图:

      

               上面的灰线条就表示一个可以将这两个OBB盒分离的平面(读者可以将这条灰线想象成向屏幕里面深入的平面)。

               在看下图:

                  这个图中的白色线条,它垂直于黑色的平面,我们将这个白色的线条称之为分离轴(Seperating Axie)。

                  在有了分离轴之后,我们需要确定这两个物体是否会发生重叠,也就是说这条潜在的分离轴(注意,这里的分离轴表示的是可能成为这两个OBB之间的分离轴,他们之间是否发生分离,我们需要通过潜在的分离轴来判断是否发生了分离)能够给我们判断两个OBB盒是否分离带来一些便利。

                  如何通过这条潜在的分离轴来判断这两个OBB盒是否发生了分离了???我们需要将物体在这条分离轴上的投影的起点和终点计算出来,也就是下图中在白色线条上的红线和蓝色线条的起点和终点计算出来:


         看到上图,也就是我们需要将A,B,C,D这四个点计算出来。当然,读者需要注意,我这里说的点是在白色直线这条轴上的点,也就是说&#

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于cocos2d-x的2D空间中的OBB(Orient Bounding Box)碰撞检测算法 的相关文章

随机推荐

  • 文本检测算法----DB、DBNet

    多种文本检测算法性能对比及算法介绍 https blog csdn net qq 39707285 article details 108754444 Real time Scene Text Detection with Differen
  • AM、FM、PM调制技术

    AM调制 幅度调制 本博客为转载 原文部分截取 仅供博主自己学习 请点击跳转原文 概念 使载波的振幅按照所需传送信号的变化规律而变化 但频率保持不变的调制方法 优缺点 传播距离远 但是抗干扰能力差 分类 普通调幅 AM 双边带调幅 DSB
  • 文献计量三大定律之一---洛特卡定律及普赖斯定律

    科学生产率是洛特卡定律的基础 科学生产率 Scientific Productivity 是指科学家 科研人员 在科学上所表现出的能力和工作效率 通常用其生产的科学文献的数量来衡量 1926年 洛特卡在一篇论文中提出了科学生产率的频次分布规
  • CentOS 7升级gcc/CentOS 7 yum 安装gcc

    centos7自带的gcc版本是4 8 手动升级安装很锻炼 毕竟已经0202年了 devtoolset 7 Developer Toolset is designed for developers working on CentOS or
  • phpmyadmin打不开500错误

    phpmyadmin打不开500错误 提示500错误 可以去掉友好提示 显示出具体错误 我处理的时候显示的具体错误是白页现象 解决方案 给上级目录一个users写入权限即可 如直接在某个磁盘下 可以给它新建一个上级目录放进去 ps 很多ph
  • c语言指令 mul bl,MUL是进行无符号乘法的指令

    MUL 无符号乘法 指令有三种格式 第一种是将8位的操作数于al相乘 第二种是将16位的操作数与ax相乘 第三种是将32位的操作数与eax进行相乘 乘数和被乘数大小必须相同 乘积的尺寸是乘数 被乘数大小的两倍 三种格式都既接受寄存器操作数
  • 【C语言实现简单数据结构】单链表

    C语言实现简单数据结构 单链表 心有所向 日复一日 必有精进 文章目录 C语言实现简单数据结构 单链表 前言 链表 1 1链表的概念和结构 1 2链表的分类 1 3单链表的实现 1 3 1接口实现 1 3 2动态申请一个结点 1 3 3单链
  • 【Linux】文件目录操作指令(pwd、ls、cd、mkdir、rmdir、touch、cp、rm、mv、cat、echo、tail等)

    目录 1 指定运行级别 1 1 基本介绍 1 2 应用实例 2 帮助指令 2 1 man获得帮助信息 2 2 help指令 3 文件目录类 3 1 pwd指令 3 2 ls指令 3 3 cd指令 3 4 mkdir指令 3 5 rmdir指
  • sort自定义排序方式

    2022 05 14 sort 方式1 结构体内重载运算符 方式2 cmp参数 与优先队列类比 Java和python的处理方式 Java python sort sort a begin a end sort a a n n为数组长度 通
  • C/C++Unix网络编程-IPC简介

    IPC是进程间通信的简称 进程 线程与信息共享 Unix进程间的信息共享的方式 1 左边的两个进程共享存留于文件系统中某个文件上的某些信息 为访问这些信息 每个进程都得穿越内核 例如read write lseek等 当一个文件有待更新时
  • Hadoop MapReduce执行过程详解(带hadoop例子)

    为什么80 的码农都做不了架构师 gt gt gt 分析MapReduce执行过程 MapReduce运行的时候 会通过Mapper运行的任务读取HDFS中的数据文件 然后调用自己的方法 处理数据 最后输出 Reducer任务会接收Mapp
  • UE4_模型_Bound(边界)

    放置在关卡中的每个Actor都有一个bound bound由两部分组成 蓝色的长方体和黄色的球体 Bound是专门用来测试一个物体是否可见的 边界球用于通过简单的距离测试进行快速碰撞检测 而且 通常情况下 它的大小大于它包含的对象 另一方面
  • 逻辑左移、逻辑右移、算术左移、算术右移、循环左移、循环右移的学习

    逻辑左移时 最高位丢失 最低位补0 逻辑右移时 最高位补0 最低位丢失 算术左移时 依次左移一位 尾部补0 最高的符号位保持不变 算术右移时 依次右移一位 尾部丢失 符号位右移后 原位置上复制一个符号位 循环左移时 将最高位重新放置最低位
  • Vue promise的用法

    1 promise是什么 它可以说是异步编程的一种解决方法 就拿传统的ajax发请求来说 单个还好 如果是一个请求回来的数据还要被其他请求调用 不断地嵌套 可想而知 代码看起来是很乱的 promise主要是为了解决这种情景而出现的 2 简单
  • 山东科技大学oj题库1165 打印金字塔 之一

    include
  • vs查看宏展开

    宏在我们的代码中能经常给我们带来很大的便利 但是有些宏会造成意向不到的错误 能够查看宏展开就能够查看宏错误的根源 VS2008对编译是不保存预处理的文件信息的 而宏展开的信息就是在预编译阶段 如下图 工程属性 配置属性 c c 预处理器 生
  • 【数据分析】数据分析方法(七):AARRR 模型分析 & 漏斗分析

    数据分析方法 七 AARRR 模型分析 漏斗分析 1 AARRR 模型分析方法 如果把产品看作一个鱼塘 使用产品的用户看作鱼塘里的鱼 AARRR 模型的五个环节可以描述如下 获取用户 Acquisition 想办法给鱼塘里添加新的鱼 从而扩
  • vue注册自定义指令

    src 新建文件夹directive directive下新建modules文件夹 里面存放指令js文件 新建prevetMultiClick jk 防按钮多次重复点击的指令 export default inserted el bindi
  • python open3d点云可视化(本节会根据实际所用持续更新)

    本文为博主原创文章 未经博主允许不得转载 本文为专栏 python三维点云从基础到深度学习 系列文章 地址为 https blog csdn net suiyingy article details 124017716 为了便于加强对点云数
  • 基于cocos2d-x的2D空间中的OBB(Orient Bounding Box)碰撞检测算法

    引言 最近在与好友聊天的过程中 好友问我如何实现类似这样的游戏 它主要想知道 如何检测旋转过后的物体与其他物体之间的碰撞 我们知道 在没有旋转的情况下 对于这样的方块 比较规则的物体 我们完全可以使用AABB Axie Align Bond