检测思路

首先要做的是将Box转为AABB,然后判断圆心是否在Box内,用的就是之前的SAT

如果圆心在Box内,肯定相交,

如果不在圆心内,则有四种情况,与顶点相交,与楞相交,与面相交,这里的确定也是通过SAT来确定。

在二维中,如果圆心不box内,有两种情况

只要对比红色线段的长度和圆的半径就可以了。

代码

 public static bool IntersectSphereBox(Sphere sphere, Box box){Vector3 delta = sphere.center - box.center;Matrix4x4 boxRotMatrix = Matrix4x4.TRS(Vector3.zero, box.rotation, Vector3.one);Vector3 dRot = boxRotMatrix.inverse.MultiplyVector(delta);bool outside = false;if (dRot.x < -box.extents.x){outside = true;dRot.x = -box.extents.x;}else if (dRot.x > box.extents.x){outside = true;dRot.x = box.extents.x;}if (dRot.y < -box.extents.y){outside = true;dRot.y = -box.extents.y;}else if (dRot.y > box.extents.y){outside = true;dRot.y = box.extents.y;}if (dRot.z < -box.extents.z){outside = true;dRot.z = -box.extents.z;}else if (dRot.z > box.extents.z){outside = true;dRot.z = box.extents.z;}if (outside)    //if clipping was done, sphere center is outside of box.{Vector3 clippedDelta = boxRotMatrix.MultiplyVector(dRot);   //get clipped delta back in world coords.Vector3 clippedVec = delta - clippedDelta;            //what we clipped away.  float lenSquared = clippedVec.sqrMagnitude;float radius = sphere.radius;if (lenSquared > radius * radius)   // PT: objects are defined as closed, so we return 'true' in case of equalityreturn false;   //disjoint}return true;}

测试代码

public class SphereBoxTester : MonoBehaviour {public GameObject sphere;public GameObject box;Box _box;Sphere _sphere;// Use this for initializationvoid Start () {_box = new Box();_sphere = new Sphere();}// Update is called once per framevoid Update () {_box.center = box.transform.position;_box.rotation = box.transform.rotation;_box.extents = 0.5f * box.transform.localScale;_sphere.center = sphere.transform.position;_sphere.radius = 0.5f * sphere.transform.localScale.x;if (NIntersectTests.IntersectSphereBox(_sphere, _box)){sphere.GetComponent<MeshRenderer>().materials[0].SetColor("_Color", new Color(1, 0, 0));}else{sphere.GetComponent<MeshRenderer>().materials[0].SetColor("_Color", new Color(1, 1, 1));}}
}

运行结果

碰撞检测之Sphere-Box检测相关推荐

  1. unity 碰撞检测的四种检测模式

    四种检测模式 Discrete:离散检测 通过在物理间隔时间中检测碰撞来工作 对场景中的所有其他碰撞体使用离散碰撞检测,其他碰撞体在测试碰撞时会使用离散检测. 用于正常碰撞(默认值) 缺点: 快速移动 ...

  2. 游戏思考30:技能碰撞检测分类枚举及逆水寒魔兽老兵服副本攻略(英雄武林风云录,后续更新舞阳城、扬州、清明等副本攻略)

    文章目录 一.技能碰撞检测方式分类讲解 1)AABB 2)OBB 3)像素检测碰撞 4)矩阵变换检测碰撞(打住,略) 5)Tile地形检测碰撞(其实就是九方格遍历查找攻击对象) 二.武林风云录 1)老 ...

  3. 【Unity 2D AABB碰撞检测】铸梦之路

    作者介绍:铸梦xy.IT公司技术合伙人,IT高级讲师,资深Unity架构师,铸梦之路系列课程创始人. 目录 1.AABB 碰撞介绍 2.常用2D碰撞盒 3.为什么要学习如何编写碰撞检测 4.2D BO ...

  4. Unity 3D学习笔记(5)物体的碰撞/触发检测

    前言 在学习了刚体组件后,我们看到了物体的物理效果,比如重力,碰撞等等,那么该如何检测他们之间的碰撞呢? 在Unity中,有碰撞检测和触发检测两种类型,他们的简单概括如下: 一.碰撞检测 1.如何使用 ...

  5. Unity3D入门(二):碰撞检测

    碰撞器由来 1.系统默认会给每个对象(GameObject)添加一个碰撞组件(ColliderComponent),一些背景对象则可以取消该组件. 2.在unity3d中,能检测碰撞发生的方式有两种, ...

  6. three.js案例解析之游戏帧碰撞检测

    先看效果 threejs.org/examples/ga- 开场白 看到游戏帧这个名字有点奇怪,这个场景其实和碰撞检测有关,为什么又叫游戏帧呢? 引入的新对象 import { Octree } fr ...

  7. 基于 TensorFlow 在手机端实现文档检测

    手机端运行卷积神经网络的一次实践 - 基于 TensorFlow 和 OpenCV 实现文档检测功能 1. 前言 本文不是神经网络或机器学习的入门教学,而是通过一个真实的产品案例,展示了在手机客户端上 ...

  8. J2ME下的游戏精灵的碰撞检测(转)

    碰撞检测又称为冲突检测,是确定精灵之间是否相互冲突的一种方法.碰撞检测用来确定精灵之间何时会发生物理的相互作 用.例如,在游戏中,如果玩家精灵与小飞机精灵发生碰撞,玩家生命值将会降低.碰撞检测就是用来 ...

  9. Unity3d碰撞检测始终是个问题。

    为什么80%的码农都做不了架构师?>>>    无论是用刚体的"持续碰撞检测"或是其他一般检测,都会出现某次或某几次碰撞检测执行时检测不到碰撞. 比如角色控制器的 ...

最新文章

  1. 企业如何提升管理能力,让企业协作更顺畅?
  2. centos7重启命令_centos7单用户模式更改root一种方法
  3. java 文件保存目录结构_java web 实现文件夹上传(保留目录结构)
  4. 如何处理Docker错误消息:please add——insecure-registry
  5. Redis基础知识之————如何处理客户端连接
  6. python中的点的作用_Python基础学习中关键点的作用(三),python,重点,之,函数,3
  7. 苹果宣布将把语音助手Siri整合到Apple Music服务中
  8. GB/T2659-2000,ISO 3166-1:1997,ISO 3166-1:2006国家和地区代码列表(已整理)
  9. 【通信原理 入坑之路】 —— 深入理解BPSK调制和解调的全过程及其Matlab实现
  10. vue和echarts实现地图航线
  11. Hspice使用.DATA进行仿真分析
  12. oracle临时表经常被锁_linux安装oracle
  13. Python如何设置文件保存位置(txt文件保存位置)
  14. 安卓街机模拟器对战源码修改详解(1)
  15. vfp:汉字翻译成拼音
  16. DDN公司为日本最新人工智能基础设施ABGCI提供大容量存储解决方案
  17. 负重前行的婚纱线上路 - i天下网商-最具深度的电商知识媒体
  18. 微信朋友圈点赞测试点【杭州多测师】【杭州多测师_王sir】
  19. [转载/精华]JAVA中文显示乱码的原因
  20. Revit 2020发布

热门文章

  1. 线上展厅核心优势解析
  2. AutoCAD2007下载AutoCAD2007安装教程
  3. 利用有穷自动机去除C语言代码行注释(//)以及块注释(/* */)
  4. 【敏捷2.3】极限编程XP的关键实践(一)
  5. MySQL中如何设置外键
  6. 如何搭建一个自己的网站-服务器篇
  7. COLLATE utf8_general_ci;是什么意思?
  8. 中乾文化,如何树立正确的财富观?
  9. 贝叶斯分类器算法及案例详解
  10. DownloadManager