- 简介
到这里就是碰撞检测的最后一个阶段,在前面已经获取了粗略位置点的时候,这里要获取精确的碰撞点。 - 碰撞点筛选
目前位置,待定的碰撞点已经处于A的宽度范围内了,但是是否与A碰撞,或者是否在A内还需要判断。
int numContacts = 0;
for (int i = 0; i < 2; ++i)
{
//计算出相交深度
float separation = Dot(frontNormal, clipPoints2[i].v) - front;
//深度小于等于0的点说明点相交在了矩形内部
if (separation <= 0)
{
//收集碰撞点信息
contacts[numContacts].separation = separation;
contacts[numContacts].normal = normal;
// slide contact point onto reference face (easy to cull)
//原始的点的位置减去反向移动方向上的距离
contacts[numContacts].position = clipPoints2[i].v - separation * frontNormal;
contacts[numContacts].feature = clipPoints2[i].fp;
if (axis == FACE_B_X || axis == FACE_B_Y)
Flip(contacts[numContacts].feature);
++numContacts;
}
}
点a和b是上一篇获得的效果,这里主要就是区分出a和b谁是实际碰撞点,很明显a在形状内部,a是碰撞点,然后根据最短分离距离,调整a的位置,最后如下。
最终a为确定好的碰撞点,然后下一步就是调整矩形位置,退回到刚好相交的那个位置。