球盒与多边形的帧间碰撞

判断球与多边形在帧间是否相交

判断球心在帧间走过的线段与另一多边形上的某个点的距离是否小于半径。算出点到线段所在直线的垂线段,如果垂线段长度小于半径,则继续判断,否则帧间没有相交。算出垂点是否在帧间走过的线段里面,如果是,则继续判断,如果不是,则帧间没有相交。如果是,算出时间点。找出最早相交的时间点。将顶点法线作为球的受力方向。
这适用于球与点相交的情况。

算出从球心沿面法线相反方向射出的射线与球面的交点,判断交点在帧间走过的线段是否与面所在平面相交,将交点与平面的某点相连得到的向量与面法线做余弦,余弦为负则不相交。然后算出线段所在直线与平面的交点,如果点在三角形内,则相交。算出时间点。找出最早相交的时间点。将交点法线作为球的受力方向。
这适用于球与面相交的情况。

球心在帧间走过的线段设为a,几何体上的一条线段设为b。叉乘得出垂直于a, b的向量α,将两线段连线投影到α上,即为a, b所在直线的最短距离m。如果m大于球半径,则不相交。在剩下的情况中,随着球的移动,在球与线段相交前,球心与b的最短距离是一直在缩小,或者一直在变大的。对于后一种情况,如果之前没有相交,这一段时间内就不会相交,算法保证完成物理计算后物体不会相交,所以直接跳过。对于前一种情况可以这样算:叉乘得出垂直于b, α的向量β,将a上的点P连接到b上任一点再投影到β上得到距离n,得到的m和n所在的直线互相垂直,勾股m, n得到点P到b所在直线的最短距离l,令l等于球半径,得到n和P0点,从P0点出发,沿β走n长度,再沿α走m长度,得到球与a所在直线的交点Q0,如果Q0在线段a上,则相交。根据P0算出时间点。找出最早相交的时间点。将线段的两个端点的法线线性插值得到一个向量作为球的受力方向。
这适用于球与线段相交的情况。

以上考虑了球与多边形在帧间是否相交的所有情况。找出三种情况中最早相交的情况,得到球与多边形相交的最早时间点及其受力方向。

posted @ 2021-03-05 21:06  HSS--  阅读(78)  评论(0)    收藏  举报