碰撞检測之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 equality
return false; //disjoint
}
return true;
}
測试代码
public class SphereBoxTester : MonoBehaviour {
public GameObject sphere;
public GameObject box;
Box _box;
Sphere _sphere;
// Use this for initialization
void Start () {
_box = new Box(); _sphere = new Sphere();
} // Update is called once per frame
void 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检測的更多相关文章
- (各个公司面试原题)在线做了一套CC++综合測试题,也来測一下你的水平吧(二)
刚才把最后的10道题又看了下.也发上来吧. 以下给出试题.和我对题目的一些理解 前10道题地址 (各个公司面试原题)在线做了一套CC++综合測试题.也来測一下你的水平吧(一) 11.设已经有A,B,C ...
- (4.5.4)Android測试TestCase单元(Unit test)測试和instrumentationCase单元測试
Android单元和instrumentation单元測试 Developing Android unit and instrumentation tests Android的单元測试是基于JUnit ...
- 【转】Visual Studio單元測試小應用-測執行時間
[转]Visual Studio單元測試小應用-測執行時間 Visual Studio的單元測試會記錄每一個測試的執行時間,如果有幾個Method要測效能,以前我會用Stopwatch,最近我都改用單 ...
- Maven实现Web应用集成測试自己主动化 -- 測试自己主动化(WebTest Maven Plugin)
近期在appfuse看到使用webtest-maven-plugin实现Web应用的集成測试,研究了下.感觉很不错.对于Web应用自己主动构建很有帮助,在性能測试之前能够保证Web应用的基本功能工作正 ...
- Unity3D入门(二):碰撞检測
碰撞器由来 1.系统默认会给每一个对象(GameObject)加入一个碰撞组件(ColliderComponent),一些背景对象则能够取消该组件. 2.在unity3d中,能检測碰撞发生的方式有两种 ...
- Cocos2d-x教程(34)-三维物体OBB碰撞检測算法
欢迎增加Cocos2d-x 交流群:193411763 个中心点.1个旋转矩阵和3个1/2边长(注:一个旋转矩阵包括了三个旋转轴,若是二维的OBB包围盒则是一个中心点,两个旋转轴,两个1/2边长). ...
- 3D空间中射线与三角形的交叉检測算法
引言 射线Ray,在3D图形学中有非常多重要的应用.比方,pick操作就是使用射线Ray来实现的,还有诸如子弹射线的碰撞检測等等都能够使用射线Ray来完毕. 所以,在本次博客中,将会简单的像大家介绍下 ...
- 目标检測的图像特征提取之(一)HOG特征
1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检測的特征描写叙述子.它通过计算和统计图像局部区 ...
- 【OpenCV新手教程之十二】OpenCV边缘检測:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...
随机推荐
- python3写冒泡排序
1.概念理解: 冒泡排序:可以简单的理解为是列表中相近的元素,两两比较,小的在前面.最多需要len()-1次排序. 2.例子:a=[11,7,4,56,35,0] 3.代码实现: 4.输出结果: 第1 ...
- java内存模型(线程共享部分)
1.元空间(MetaSpace)与永久代(PermGen)的区别? ----> 1.1 元空间使用的是本机内存(这样的好处是,可以使用的内存空间变大了,没有OutOfMemoryError:Pe ...
- idea Error:(65, 27) java: 未结束的字符串文字
今天在使用IDEA的时候,出现了这个错误,原因项目文件编码不一致导致的,解决方法是: 将项目的文件编码全改成一致(UTF-8),如下图所示:
- utf-8 下汉字为什么需要三个字节
Unicode 十六进制码点范围 --> UTF-8 二进制0000 0000 - 0000 007F --> 0xxxxxxx 0000 0080 - 0000 07FF --> ...
- mysql数据库中的索引有那些、有什么用
本文主要讲述了如何加速动态网站的MySQL索引分析和优化. 一.什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第 ...
- 【04】Firebug页面概况查看
Firebug页面概况查看 使用Firebug的概况,你可以测试Web页面导致延迟加载的文件. 通过打开页面 Firebug > Console(控制台)> Profile(概况). 你需 ...
- sql无效字符 执行sql语句报错解决方案
以为是sql中参数赋值有问题,但是将sql语句直接copy到PLSQL中执行,却没问题,纠结了好久,原来是 insert语句多了:唉,坑爹 http://www.jb51.net/article/32 ...
- 使用dd命令快速生成大文件或者小文件的方法
使用dd命令快速生成大文件或者小文件的方法 转载请说明出处:http://blog.csdn.net/cywosp/article/details/9674757 在程序的测试中有些场 ...
- CentOS7中,vnc分辨率设置。
使用geometry参数进行调整 例如,我们需要将分辨率调整到800x600 [root@secdb ~]# vncserver -geometry 800x600 New 'secdb:5 (roo ...
- HDU 1078 dfs+dp
题目大意: 在n*n的矩阵中,每个格子放置了一定数量的食物,一只老鼠每次水平或竖直最多移动k格,每次到的位置食物都要比前一次多,问最后一共能得到多少食物 这道题利用记忆化搜索做,利用nowstate不 ...