有关椭球碰撞检测的研究(原创)

原文出处:
http://www.azure.com.cn/article.asp?id=323

如有转载,请注明出处:
http://www.azure.com.cn/

近日突然变得比较清闲这样我就可以仔细想想以前没有想清楚问题

椭球碰撞是现今比较高效种思路方法看了老外篇论文<<ImprovedCollisiondetectionandResponse>>,发现老外说个事情非常罗嗦,最前面还把线性代数知识讲了遍,看完了才发现是大学课本上知识.便马上跳过了.
实际碰撞中,将椭球包裹住角色,能产生比较好吻合.这样碰撞效果更加精确了.
这里我所研究范围还不涉及碰撞后滑动,那是我下步要研究.

这里我主要整理总结下,椭球碰撞几个要点:

1.椭球表示:

这里说椭球都是正椭球,是没有倾斜那种(如果考虑倾斜就超级复杂了),用 3个半径X,Y,Z,和个中心点坐标P来表示.如下图:

\" border=\"0\" _disibledevent=CBM*(c-P\')
其中CBM是个转换矩阵
[1/X00]
[01/Y0]
[001/Z]
还记得吗,X,Y,Z是上图椭球 3个半径.

这样转换后,椭球就变成了个处在原点,半径为1正球了(想不过来,仔细想想)
待检测 3角形(a\'b\'c\')就被变换到原点附近,这样就只用判断其和这个半径为1正球关系就可以知道是否发生碰撞了.

4.开始碰撞检测了

I.首先粗略排除绝对不可能相交.
通过变换后 3点(a\'b\'c\')形成个平面Plane,首先判断此平面到原点距离,如果大于1则绝对不可能和此待检测 3角形发生碰撞,在这里你可以直接从你检测中退出了.当距离小于或者等于1,再跳到步骤II.

II.判断是否有任意点在单位球内.
这也是个快速剔除思路方法,如果a\'b\'c\'任意点到原点距离小于1,则发生碰撞了,如果都不小于1,则我们需要转到第III步,进行次昂贵相交测试运算.

III.边和单位球相交检测
对于 3角形a\'b\'c\',它有 3条边a\'b\',b\'c\',c\'a\',那么我们检测原点到 3条边距离,如果有任意条小于1,则发生了碰撞,如果非常遗憾都不小于1话,我们就进入最昂贵第 4步碰撞检测.

IV.最后
在前面第步,我们已经计算出来了a\'b\'c\'组成平面Plane,这里第步首先计算出从原点作垂线到Plane垂足坐标.然后判断此坐标是否在a\'b\'c\'组成 3角形内.如果在内,则碰撞发生,如果不在内,则无碰撞发生.


5.是否应该移动到下个位置呢.

我们可以把3,4步集成到boolcollide(vec3pos)中,如果我们把P\'传进去发生碰撞了,那么我们第2步坐标改变则不可以发生,如果不考虑滑动话,则不改变位移,停在原地算了.如果没有发生碰撞,则我们可以大大方方改变原来椭球中心坐标了,也就是物体可以向前移动了.当然如果移动速度过快,会发生穿墙问题.这个问题暂时还没有想到如何解决,如果哪位想到了,也可以告诉我.谢谢.

整理总结:

以上讲解,并未提供详细代码,有关如何求到面距离,到直线距离,也不在这里讨论范围内,这些算法网上非常多,在那篇老外论文中,后面也提供了相关代码,大家可以去看看.

www.azure.com.cn



Tags: 

延伸阅读

最新评论

发表评论