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;
}