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

0.简介

前面我们发现了物体碰撞检测的函数,这回我将来读物体碰撞检测函数的代码。

1.碰撞检测

这个碰撞检测主要是针对矩形与矩形的碰撞检测,以为例子中只给了矩形的物理碰撞。这里先对开始部分做一个阅读和注释。

这段代码是一些准备工作,主要目的是获取物体在空间中的姿态和基本位置信息。

int Collide(Contact* contacts, Body* bodyA, Body* bodyB)
{
	// Setup
	//取A B两个物体的半径,width中存储的是边长
	//这里获取到的是一半的长度,也可以认为是在
	//矩形自身的坐标系下的第一象限的点,自身坐标系以矩形中心为(0,0)点
	//那么hA和hB是右上角第一象限的点
	Vec2 hA = 0.5f * bodyA->width;
	Vec2 hB = 0.5f * bodyB->width;

	//取A B两个物体的世界坐标,物体本身坐标是自身的局部坐标
	//position存储的就是物体在实际世界坐标的位置,这里的世界坐标就是
	//我们认为的全局屏幕坐标,也是我们实际看到的坐标
	Vec2 posA = bodyA->position;
	Vec2 posB = bodyB->position;

	//获取A B两个物体旋转角,然后构造成旋转矩阵
	//因为是二维空间中的旋转,所以矩阵是2x2的,
	//而且矩阵构造好了后直接就是正交矩阵,正交矩阵的
	//转置就是其逆
	Mat22 RotA(bodyA->rotation), RotB(bodyB->rotation);

	//将两个旋转矩阵转置,这样能直接得到逆矩阵,矩阵本身就是正交矩形
	//如果向量a乘以矩阵RotA,就是将a从自己的局部坐标系A变换到世界坐标,
	//变换后的a在乘以RotBT就是将a变换到局部坐标系B下。最终的效果就是将
	//向量a从A坐标系变换到B坐标系下。
	Mat22 RotAT = RotA.Transpose();
	Mat22 RotBT = RotB.Transpose();

	Vec2 dp = posB - posA;//两个物体的中心点做差,得到的就是两个矩形中心连线的向量
	//中心连线分别乘以物体各自的逆矩阵,
	//就会将连线向量dp变换到各自的局部坐标系下
	Vec2 dA = RotAT * dp;
	Vec2 dB = RotBT * dp;
    
    ...
    ...
    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值