如有转载, 请注明出处: 近日突然变得的比较清闲,这样我就可以仔细想想以前没有想清楚的问题。 椭球碰撞是现今比较高效的一种方法。看了老外的一篇论文,<<Improved Collision detection and Response>>, 发现老外说一个事情非常罗嗦, 最前面还把线性代数的知识讲了一遍, 看完了才发现是大学课本上的知识. 便马上跳过了. 这里我主要总结下, 椭球碰撞的几个要点: 1. 椭球的表示: 这里说的椭球都是正椭球, 是没有倾斜的那种(如果考虑倾斜的就超级复杂了 ), 用三个半径 X, Y, Z, 和一个中心点坐标P来表示.如下图: 在这个图里, 三个半径分别是 X=3, Y=7, Z=3 2. 计算椭球下一次位置 只有发生移动才能发生碰撞, 当然只用把椭球的中心坐标P改变位移即可. 3. 根据新中心坐标P', 把待碰撞检测的三角形变换到椭球空间中来(重点) 假设待碰撞检测的三角形三个顶点为a, b, c. 在那个论文中, 作者大肆炫耀他的数学知识, 总是把一个非常简单的问题解释的又臭又长. 说了半天线性代数中基础基的问题, 赚取了不少的稿费. 那么有 这样转换后, 椭球就变成了一个处在原点, 半径为1的正球了(想不过来,仔细想想 ) 4. 开始碰撞检测了 I. 首先粗略排除绝对不可能相交的. II. 判断是否有任意一点在单位球内. III. 边与单位球的相交检测 IV. 最后一步
我们可以把3,4步集成到一个函数 bool collide(vec3 newpos)中, 如果我们把P'传进去发生碰撞了, 那么我们第2步的坐标改变则不可以发生, 如果不考虑滑动的话, 则不改变位移,停在原地算了.如果没有发生碰撞, 则我们可以大大方方改变原来椭球的中心坐标了, 也就是物体可以向前移动了.当然如果移动速度过快, 会发生穿墙的问题. 这个问题暂时还没有想到如何解决, 如果哪位想到了, 也可以告诉我. 谢谢. 总结: 以上的讲解, 并未提供详细的代码, 关于如何求到面的距离, 到直线的距离, 也不在这里的讨论范围内, 这些算法网上非常多, 在那篇老外的论文中, 后面也提供了相关的代码, 大家可以去看看. [此贴子已经被作者于2007-5-8 22:08:46编辑过]
|
-
2007-07-14
-
2007-07-11
-
2007-06-23