分离轴法是根据两个多边形的几何中心在任意矢量方向的法线上的投影存在交叉的条件来做出的方法
[32]
。
换而言之,如果可以找出这样一个方向,将两个多边形投影在此方向的法线上的投影不交叉,则说明碰撞未发生,如图
5-3
所示。
图中
A
、
B
为两个矩形局域,矢量
C
为随意的一个方向,
D
为
C
的法线,
A+
和
B+
分别是
A
和
B
在法线
D
上的投影,可见
A+
和
B+
并未相交,说明存在这样的
一个
矢量,使得矩形区域
A
和
B
在其法线上的投影不想交。在实际运用中,我们需要判断所有的多边形边的方向,来判断是否存在一个这样的边,如果不存在则说明碰撞发生,如图
5-4
所示。
图中
A
和
B
是两个三角形,
C
、
D
和
E
分别是方向与三角形三条边平行的三条直线,
C+
、
D+
和
E+
分别是它们的法线。
A1
和
B1
是分别是三角形
A
和
B
在法线
C+
上的投影,
A2
和
B2
分别是三角形
A
和
B
在法线
D+
上的投影,
A3
和
B3
分别是三角形
A
和
B
在法线
E+
上的投影。可见三角形
A
和
B
在三角形的三条边平行的矢量的法线上的投影都不满足不发生碰撞时的条件,所以由此断定,
A
和
B
发生了碰撞。对于这种方法可以推广到任意的凸多边形
[20]
。
在实际运算过程中,为子精灵配置长宽值,即矩形区域的面积大小和矩形中心点,
为了加快弹幕射击游戏中碰撞检测的效率,使得游戏体验性更强,我们可以先判断两个矩形区域的外接圆是否存在交叉,如果没有则两个矩形区域是肯定没有交叉的
。
图中为了再次方便计算两个投影是否交叉可以计算两个适量在X
轴上的投影,如果适量垂直X轴,则计算在Y轴上的投影,即可判断,对于矩形来说,法线只有两个方向,计算起来比较方便。
分离轴法是根据两个多边形的几何中心在任意矢量方向的法线上的投影存在交叉的条件来做出的方法[32]。换而言之,如果可以找出这样一个方向,将两个多边形投影在此方向的法线上的投影不交叉,则说明碰撞未发生,如图5-3所示。 图中A、B为两个矩形局域,矢量C为随意的一个方向,D为C的法线,A+和B+分别是A和B在法线D上的投影,可见A+和B+并未相交,说明存在这样的一个矢量,使得矩形区域A和B在
对于两个多边形,如果存在一个轴,使得两个多边形的在该轴上的投影不重叠,则多边形之间没有
碰撞
发生。所有可能的轴为垂直于多边形每个边的轴。
对于
矩形
的参考轴比较简单,只要是两邻的两条边就可以了。
1、获取
矩形
的顶点坐标
首先得出
矩形
的四个点的坐标(可参考本博文章《根据
矩形
的位置和大小获取顶点位置》)。
2、
计算
一个矩的顶点在另一个矩边上的投影
计算
两个
矩形
中
的...
在网上可以找到很多关于
旋转
矩形
碰撞检测
的方法,砖家也有文章对这种
碰撞检测
作过分析:方向包围盒(OBB)
碰撞检测
。本文主要是对其
中
的细节加上一些自己的分析,并结合网上另外一些关于
旋转
矩形
碰撞检测
的资料,和大家一起探讨实现的技术细节。
首先推荐一个参考资料,里面对
旋转
矩形
碰撞检测
的解释还是挺不错的,并且同样适用于其他多边形
碰撞检测
,点击下载。
demo预览:
(拖动条调整
矩形
...
转载注明:http://www.scottcgi.com/?p=121
如何进行2D
旋转
矩形
的
碰撞检测
,可以使用一种叫OBB的检测
算法
(Oriented bounding box)方向包围盒。这个
算法
是基于SAT(Separating Axis Theorem)分离轴定律的。而OBB不仅仅是
计算
矩形
的
碰撞检测
,而是一种
算法
模型。简单解释一下概念,包围盒和分离轴定律。
包围盒:是根据物体的集合形
一,原理介绍
这回有点复杂,不过看懂了还是很好理解的。当然,我不敢保证这种
算法
在任何情况下都会起效果,如果有同学测试时,发现出现错误,请及时联系我。
我们首先来建立一个以圆心为原点的坐标系:
然后要检测
碰撞
就只有两种情况了。
情况一,
矩形
全部都在一个象限内,如图:
当然,图
中
只是举个例子,不一定是只在第二象限,任何一个象限都行,只要是
矩形
全在该象限。
这种情况比较好解决,...
任意角度的
矩形
与圆形的
碰撞检测
(js)下面介绍的是 无
旋转
角度的
矩形
与圆形的
碰撞检测
:函数ComputeCollision,当相对距离小于圆形半径的时候为
碰撞
。
参数介绍(w:
矩形
的宽,h:
矩形
的高,r:圆形半径,rx:圆形
中
心与
矩形
中
心相对坐标X,ry:圆形
中
心与
矩形
中
心相对坐标Y)function ComputeCollision(w, h, r, rx, ry) {
var dx =
有两个
矩形
rectA(x,y,width,height)、rectB (x,y,width,height)
检测A,B是否发生重叠,在讨论是否发生重叠时我们可以先看看没有重叠的四种情况,如下图:
以下是对这四种状态的判断:
1、rectB.y+rectB.height < rectA.y
2、rectB.x > rectA.x +rectA.width
3、rectB.y > rectA.y + rectA.height
4、rectB.x+rectB.width < rectA.