碰撞检测之Sphere-Box检测
检测思路
首先要做的是将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检测相关推荐
- unity 碰撞检测的四种检测模式
四种检测模式 Discrete:离散检测 通过在物理间隔时间中检测碰撞来工作 对场景中的所有其他碰撞体使用离散碰撞检测,其他碰撞体在测试碰撞时会使用离散检测. 用于正常碰撞(默认值) 缺点: 快速移动 ...
- 游戏思考30:技能碰撞检测分类枚举及逆水寒魔兽老兵服副本攻略(英雄武林风云录,后续更新舞阳城、扬州、清明等副本攻略)
文章目录 一.技能碰撞检测方式分类讲解 1)AABB 2)OBB 3)像素检测碰撞 4)矩阵变换检测碰撞(打住,略) 5)Tile地形检测碰撞(其实就是九方格遍历查找攻击对象) 二.武林风云录 1)老 ...
- 【Unity 2D AABB碰撞检测】铸梦之路
作者介绍:铸梦xy.IT公司技术合伙人,IT高级讲师,资深Unity架构师,铸梦之路系列课程创始人. 目录 1.AABB 碰撞介绍 2.常用2D碰撞盒 3.为什么要学习如何编写碰撞检测 4.2D BO ...
- Unity 3D学习笔记(5)物体的碰撞/触发检测
前言 在学习了刚体组件后,我们看到了物体的物理效果,比如重力,碰撞等等,那么该如何检测他们之间的碰撞呢? 在Unity中,有碰撞检测和触发检测两种类型,他们的简单概括如下: 一.碰撞检测 1.如何使用 ...
- Unity3D入门(二):碰撞检测
碰撞器由来 1.系统默认会给每个对象(GameObject)添加一个碰撞组件(ColliderComponent),一些背景对象则可以取消该组件. 2.在unity3d中,能检测碰撞发生的方式有两种, ...
- three.js案例解析之游戏帧碰撞检测
先看效果 threejs.org/examples/ga- 开场白 看到游戏帧这个名字有点奇怪,这个场景其实和碰撞检测有关,为什么又叫游戏帧呢? 引入的新对象 import { Octree } fr ...
- 基于 TensorFlow 在手机端实现文档检测
手机端运行卷积神经网络的一次实践 - 基于 TensorFlow 和 OpenCV 实现文档检测功能 1. 前言 本文不是神经网络或机器学习的入门教学,而是通过一个真实的产品案例,展示了在手机客户端上 ...
- J2ME下的游戏精灵的碰撞检测(转)
碰撞检测又称为冲突检测,是确定精灵之间是否相互冲突的一种方法.碰撞检测用来确定精灵之间何时会发生物理的相互作 用.例如,在游戏中,如果玩家精灵与小飞机精灵发生碰撞,玩家生命值将会降低.碰撞检测就是用来 ...
- Unity3d碰撞检测始终是个问题。
为什么80%的码农都做不了架构师?>>> 无论是用刚体的"持续碰撞检测"或是其他一般检测,都会出现某次或某几次碰撞检测执行时检测不到碰撞. 比如角色控制器的 ...
最新文章
- 企业如何提升管理能力,让企业协作更顺畅?
- centos7重启命令_centos7单用户模式更改root一种方法
- java 文件保存目录结构_java web 实现文件夹上传(保留目录结构)
- 如何处理Docker错误消息:please add——insecure-registry
- Redis基础知识之————如何处理客户端连接
- python中的点的作用_Python基础学习中关键点的作用(三),python,重点,之,函数,3
- 苹果宣布将把语音助手Siri整合到Apple Music服务中
- GB/T2659-2000,ISO 3166-1:1997,ISO 3166-1:2006国家和地区代码列表(已整理)
- 【通信原理 入坑之路】 —— 深入理解BPSK调制和解调的全过程及其Matlab实现
- vue和echarts实现地图航线
- Hspice使用.DATA进行仿真分析
- oracle临时表经常被锁_linux安装oracle
- Python如何设置文件保存位置(txt文件保存位置)
- 安卓街机模拟器对战源码修改详解(1)
- vfp:汉字翻译成拼音
- DDN公司为日本最新人工智能基础设施ABGCI提供大容量存储解决方案
- 负重前行的婚纱线上路 - i天下网商-最具深度的电商知识媒体
- 微信朋友圈点赞测试点【杭州多测师】【杭州多测师_王sir】
- [转载/精华]JAVA中文显示乱码的原因
- Revit 2020发布