游戏开发论坛

 找回密码
 立即注册
搜索
查看: 18516|回复: 22

关于椭球碰撞检测的思考(原创)

[复制链接]

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
发表于 2007-4-7 12:44:00 | 显示全部楼层 |阅读模式
原文出处:
http://www.azure.com.cn/article.asp?id=323

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

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

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

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

1. 椭球的表示:

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



在这个图里, 三个半径分别是 X=3, Y=7, Z=3

2. 计算椭球下一次位置

只有发生移动才能发生碰撞, 当然只用把椭球的中心坐标P改变位移即可.
P' = P + v

3. 根据新中心坐标P', 把待碰撞检测的三角形变换到椭球空间中来(重点)

假设待碰撞检测的三角形三个顶点为a, b, c. 在那个论文中, 作者大肆炫耀他的数学知识, 总是把一个非常简单的问题解释的又臭又长. 说了半天线性代数中基础基的问题, 赚取了不少的稿费.  
其实这个椭球空间的转换再简单不过了.
我们假设转换后的顶点为a', b', c'

那么有
a' = CBM * (a - P')
b' = CBM * (b - P')
c' = CBM * (c - 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.

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

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

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


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

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

总结:

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

www.azure.com.cn

54

主题

2916

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2007-4-7 16:56:00 | 显示全部楼层

Re:关于椭球碰撞检测的思考(原创)

谢谢分享,
我比较喜欢看讲技术原理的文章。

52

主题

637

帖子

1420

积分

金牌会员

Rank: 6Rank: 6

积分
1420
发表于 2007-4-7 20:05:00 | 显示全部楼层

Re:关于椭球碰撞检测的思考(原创)

经过实际使用,该东西不如胶囊好用。

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
 楼主| 发表于 2007-4-7 21:37:00 | 显示全部楼层

Re:关于椭球碰撞检测的思考(原创)

在前三步的筛选后, 第四步发生的可能性, 已经非常小了。
应该比较高效。

10

主题

219

帖子

236

积分

中级会员

Rank: 3Rank: 3

积分
236
QQ
发表于 2007-4-7 22:16:00 | 显示全部楼层

Re:关于椭球碰撞检测的思考(原创)

椭圆判断做视锥预裁减非常好,我原来用球,远裁减面远时,冗余比较大
这样能少做不少求交判断

52

主题

637

帖子

1420

积分

金牌会员

Rank: 6Rank: 6

积分
1420
发表于 2007-4-8 13:11:00 | 显示全部楼层

Re:关于椭球碰撞检测的思考(原创)

不是效率问题,主要是椭球包围不够精确,中间太鼓,两头太尖

5

主题

52

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2007-4-9 22:32:00 | 显示全部楼层

Re: 关于椭球碰撞检测的思考(原创)

这篇文章主要介绍的是角色控制和场景的碰撞检测,以及简单的反弹或者滑动反映,在irrlicht3d 就是用的这篇介绍的方法制作的角色控制碰撞技术
这种碰撞计算可以说是碰撞检测和碰撞反映中最简单的技术,使用椭球也是因为比较符合人物的外形,而且在计算的时候,会变换到球空间进行计算,碰撞的时候进行多次迭代,一般3到5次吧
这种方法的优点就是简单
缺点就是使用受限,首先角色控制,只能和静态场景进行碰撞,不可能去影响场景中的动态物体,当然如果你加上了物理效果除外,其次就是控制的这个角色不会受到碰撞反映,比如另外一个物体碰撞你控制的角色时(这种假设基于object-object碰撞检测建立 的基础)用这种方法模拟的受控角色是不会有任何碰撞反映的,游戏中看来只能用动画来模拟了(这个是我猜的)
有没有好的解决方案,我也在寻觅中,看了Ageia,里面也是这种,只不过用了sweet box和capsule 而没有用椭球
PS:这个算法中的精彩的部分就是判断一个点是否在三角形内的算法了,当然这个点事先知道是在这个平面上的
如果大家有兴趣,可以去看看irrlict,里面就是这个算法,呵呵,而且泥古拉丝在写注释的时候还特意著名,看来老外的版权意识还是比较重的,呵呵

0

主题

228

帖子

285

积分

中级会员

Rank: 3Rank: 3

积分
285
发表于 2007-4-11 09:53:00 | 显示全部楼层

Re:关于椭球碰撞检测的思考(原创)

好方法,学IRRLICHT的时候学过

3

主题

13

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2007-4-11 12:25:00 | 显示全部楼层

Re:关于椭球碰撞检测的思考(原创)

安全看不懂。不甚了了知道这种碰?_有什么用?

5

主题

52

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2007-4-12 14:21:00 | 显示全部楼层

Re:关于椭球碰撞检测的思考(原创)

这种碰撞是用来描述 角色控制的,比如你控制一个角色或者摄像机,那么这种碰撞检测就可以用上了
其实这种碰撞检测和反映并不是真正基于物理系统的,比如你控制的角色是不可能和地面有摩擦力的,碰撞检测方法也是计算终点位置,和起点形成一个sweep volume,然后检测这个sweep中是否有相交三角形,如果没有就直接用setposition的方法去设置objec的位置,在计算终点位置的时候会用到两个方向的速度,一个是重力方向,一个是你控制的方向,一般都是设定死的,不能像物理引擎中的rigidbody可以受到force和impulse的影响
在模拟的时候,可以把两个方向的运动合在一起,也可以分开计算,各有优缺点
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 14:25

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表