椭球碰撞检测

椭球碰撞检测

ID:38061039

大小:30.00 KB

页数:3页

时间:2019-05-28

椭球碰撞检测_第1页
椭球碰撞检测_第2页
椭球碰撞检测_第3页
资源描述:

《椭球碰撞检测》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、关于椭球碰撞检测的思考  近日突然变得的比较清闲,这样我就可以仔细想想以前没有想清楚的问题。  椭球碰撞是现今比较高效的一种方法。看了老外的一篇论文,<>,发现老外说一个事情非常罗嗦,最前面还把线性代数的知识讲了一遍,看完了才发现是大学课本上的知识。便马上跳过了。  实际碰撞中,将椭球包裹住角色,能产生比较好的吻合。这样碰撞效果更加的精确了。  这里我所思考的范围还不涉及碰撞后的滑动,那是我下一步要思考的.  这里我主要总结下,椭球碰撞的几个要点:  1.椭球的表示:  这里说的椭球都是正椭球,是没有倾斜的

2、那种(如果考虑倾斜的就超级复杂了 ),用三个半径X,Y,Z,和一个中心点坐标P来表示。如下图:  在这个图里,三个半径分别是X=3,Y=7,Z=3  2.计算椭球下一次位置  只有发生移动才能发生碰撞,当然只用把椭球的中心坐标P改变位移即可。  P'=P+v  3.根据新中心坐标P',把待碰撞检测的三角形变换到椭球空间中来(重点)  假设待碰撞检测的三角形三个顶点为a,b,c.在那个论文中,作者大肆炫耀他的数学知识,总是把一个非常简单的问题解释的又臭又长。说了半天线性代数中基础基的问题,赚取了不少的稿费。  其实这个椭球空间的转换再简单不过了。  我们假设转换后的顶点为a',b',c

3、'  那么有  a'=CBM*(a-P')  b'=CBM*(b-P')  c'=CBM*(c-P')  其中CBM是一个转换矩阵  [1/X00]  [01/Y0]  [001/Z]  还记得吗,X,Y,Z是上图椭球的三个半径。  这样转换后,椭球就变成了一个处在原点,半径为1的正球了(想不过来,仔细想想 )  待检测的三角形(a'b'c')就被变换到原点附近,这样就只用判断其与这个半径为1正球的关系就可以知道是否发生碰撞了。  4.开始碰撞检测了  I.首先粗略排除绝对不可能相交的。  通过变换后三点(a'b'c')形成一个平面Plane,首先判断此平面到原点的距离,如果大于1则

4、绝对不可能与此待检测的三角形发生碰撞,在这里你可以直接从你的检测函数中退出了。当距离小于或者等于1,再跳到步骤II.  II.判断是否有任意一点在单位球内。  这也是个快速剔除的方法,如果a'b'c'任意一点到原点的距离小于1,则发生碰撞了,如果都不小于1,则我们需要转到第III步,进行次昂贵的相交测试运算。  III.边与单位球的相交检测  对于三角形a'b'c',它有三条边a'b',b'c',c'a',那么我们检测原点到三条边的距离,如果有任意一条小于1,则发生了碰撞,如果非常遗憾的都不小于1的话,我们就进入最昂贵的第四步的碰撞检测。  IV.最后一步  在前面第一步,我们已经计

5、算出来了a'b'c'组成的平面Plane,这里第一步首先计算出从原点作垂线到Plane的垂足的坐标。然后判断此坐标是否在a'b'c'组成的三角形内。如果在内,则碰撞发生,如果不在内,则无碰撞发生。  5.是否应该移动到下个位置呢。  我们可以把3,4步集成到一个函数boolcollide(vec3newpos)中,如果我们把P'传进去发生碰撞了,那么我们第2步的坐标改变则不可以发生,如果不考虑滑动的话,则不改变位移,停在原地算了。如果没有发生碰撞,则我们可以大大方方改变原来椭球的中心坐标了,也就是物体可以向前移动了。当然如果移动速度过快,会发生穿墙的问题。这个问题暂时还没有想到如何解

6、决,如果哪位想到了,也可以告诉我。谢谢。  总结:  以上的讲解,并未提供详细的代码,关于如何求到面的距离,到直线的距离,也不在这里的讨论范围内,这些算法网上非常多,在那篇老外的论文中,后面也提供了相关的代码,大家可以去看看。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。