Box2D-Lite源码阅读笔记(5)

本文介绍使用分离轴定理进行矩形碰撞检测的方法。通过计算矩形在各个轴上的投影来判断是否相交,重点在于如何快速找到矩形在变换坐标系下的边界点。

0.简介

前一篇对碰撞检测的准备工作做了阅读,这回我们看第一步,分离轴定理检测矩形是否相交。

1.分离轴定理

这里面简单对分离轴定理做一个说明,这个里面有详细说明分离轴定理详细说明

大概就是比如两个凸多边形,这两个多边形分别向每条边的垂直方向做投影,如果有一个方向上的投影不相交,则两个多边形不相交,反之则相交。

具体就看上面的链接吧。

2.代码阅读

int Collide(Contact* contacts, Body* bodyA, Body* bodyB)
{

    ...    

    //C是一个从B坐标系变换到A坐标系的一个矩阵
	Mat22 C = RotAT * RotB;
	//经过Abs处理,Abs实际就是将矩阵中每个元素都进行求绝对值
	//最后absC中全部都是大于等于0的数字
	Mat22 absC = Abs(C);
	//这里将absC矩阵转置得到逆矩阵
	Mat22 absCT = absC.Transpose();

	//1.分离轴计算碰撞
	// Box A faces
	Vec2 faceA = Abs(dA) - hA - absC * hB;
  	if (faceA.x > 0.0f || faceA.y > 0.0f)
		return 0;

	// Box B faces
	Vec2 faceB = Abs(dB) - absCT * hA - hB;
	if (faceB.x > 0.0f || faceB.y > 0.0f)
		return 0;

    ...
}

上面这段代码,其中,这里就是计算出一个矩阵C,求其绝对值和其逆。

//C是一个从B坐标系变换到A坐标系的一个矩阵
Mat22 C = RotAT * RotB;
//经过Abs处理,Abs实际就是将矩阵中每个元素都进行求绝对值
//最后absC中全部都是大于等于0的数字
Mat22 absC = Abs(C);
//这里将absC矩阵转置得到逆矩阵
Mat22 absCT = absC.Transpose();

如何判断是否相交?

上图是只做A物体分离轴投影的结果,当然物体B也应该做一次,这里没有画出,还是画一下吧。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值