椭球碰撞检测.doc

上传人:大米 文档编号:545117106 上传时间:2023-05-30 格式:DOC 页数:3 大小:30KB
返回 下载 相关 举报
椭球碰撞检测.doc_第1页
第1页 / 共3页
椭球碰撞检测.doc_第2页
第2页 / 共3页
椭球碰撞检测.doc_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《椭球碰撞检测.doc》由会员分享,可在线阅读,更多相关《椭球碰撞检测.doc(3页珍藏版)》请在金锄头文库上搜索。

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

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

3、 - P)其中CBM是一个转换矩阵 1/X 0 0 0 1/Y 0 0 0 1/Z还记得吗, X,Y,Z是上图椭球的三个半径。这样转换后, 椭球就变成了一个处在原点, 半径为1的正球了(想不过来,仔细想想 )待检测的三角形(a b c)就被变换到原点附近, 这样就只用判断其与这个半径为1正球的关系就可以知道是否发生碰撞了。4. 开始碰撞检测了I. 首先粗略排除绝对不可能相交的。通过变换后三点(a b c)形成一个平面 Plane, 首先判断此平面到原点的距离, 如果大于1则绝对不可能与此待检测的三角形发生碰撞, 在这里你可以直接从你的检测函数中退出了。 当距离小于或者等于1, 再跳到步骤II.

4、II. 判断是否有任意一点在单位球内。这也是个快速剔除的方法, 如果a b c 任意一点到原点的距离小于1, 则发生碰撞了, 如果都不小于1, 则我们需要转到第III步, 进行次昂贵的相交测试运算。III. 边与单位球的相交检测对于三角形 a b c , 它有三条边ab, bc, ca, 那么我们检测原点到三条边的距离, 如果有任意一条小于1, 则发生了碰撞, 如果非常遗憾的都不小于1的话, 我们就进入最昂贵的第四步的碰撞检测。IV. 最后一步在前面第一步, 我们已经计算出来了abc 组成的平面Plane, 这里第一步首先计算出从原点作垂线到Plane的垂足的坐标。 然后判断此坐标是否在abc

5、组成的三角形内。 如果在内, 则碰撞发生, 如果不在内, 则无碰撞发生。5. 是否应该移动到下个位置呢。我们可以把3,4步集成到一个函数 bool collide(vec3 newpos)中, 如果我们把P传进去发生碰撞了, 那么我们第2步的坐标改变则不可以发生, 如果不考虑滑动的话, 则不改变位移,停在原地算了。如果没有发生碰撞, 则我们可以大大方方改变原来椭球的中心坐标了, 也就是物体可以向前移动了。当然如果移动速度过快, 会发生穿墙的问题。 这个问题暂时还没有想到如何解决, 如果哪位想到了, 也可以告诉我。 谢谢。总结:以上的讲解, 并未提供详细的代码, 关于如何求到面的距离, 到直线的距离, 也不在这里的讨论范围内, 这些算法网上非常多, 在那篇老外的论文中, 后面也提供了相关的代码, 大家可以去看看。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号