碰撞算法的设计问题

这是我在《实时碰撞检测算法技术》看的,记录一下~

为什么写这个文章?
做帧同步需要自己实现确定性物理,所以需要对这块有一定了解。


设计碰撞检测系统时,多种因素将会影响设计的选择,包括以下几点:

1.应用程序中对象的表达方式
计算机图形硬件一般都是用三角形作为基本的渲染图元
对于场景中物体一般多为多边形

几个概念:
多边形汤(Polygon Soup):一组无序的多边形构成的集合,并且不包含确定多边形相互关系的连接信息
多边形网格:多边形通过公共边可以连接成一个大型的多边形平面

2.碰撞与几何渲染
设计时最好将渲染系统和碰撞系统分离(也确实是这么做的)
原因:
a)图形平台上的集合体渲染过程很复杂,并且不适合用于碰撞检测晕眩。对于碰撞的精度也存在一定限制,游戏中常用球体、包围盒来表达游戏物体,忽略物体的复杂度
b)对于硬件环境几何图元趋于一种特定的格式加以表达。比如:三角带和索引定点缓存,提高了自身的渲染速度。但是对碰撞家呢系统并不适用
c)数据组织方面,渲染集合体与碰撞几何体而至之间存在着区别:静态渲染数据可以按照材质的特征加以分类排序,而碰撞数据一般按空间的特征加以组织
d)特定游戏需求,有些看着是模型但其实没有碰撞。比如:草地等
e)确保正确的模拟,即使渲染数据不可见。碰撞数据也需要加以保留

同样的这样设计也会存在一些缺点:
a)数据冗余,定点数据重复将导致额外的内存占用
b)需要额外的步骤生成并维护这两类相似的几何体
c)如果构造过程和维护过程分开加以实现,那么渲染集合体之间可以不实现完全匹配

所以,碰撞检测也有一个法则:如果看上去是正确的,它就是正确的!!

3.查询类型
最直接的碰撞查询叫做:冲突检测或相交测试。
也就是两个物体在给定位置和方向上是否产生重叠,返回一个bool值

但是一般游戏中,一个bool值是远远不够用的,还需要计算到具体的相交处数据信息(碰撞点)
如果物体之间彼此穿越,还需要计算该穿越深度(就是分离两个物体的最短位移的向量长度)

4.性能
一般比较屌的游戏能达到每秒60帧,这个帧速度使每个游戏帧运行时间约为16.7ms。
碰撞检测约占用一帧的10%~30%,也就是2ms-5ms(还要根据游戏具体类型确定)
我们要保证算法在最坏情况下,耗时不超出平均值太多

5.健壮性
当出现复杂的数据输入时,健壮的计算程序可以提供相应的期望值,否则系统可能会出现崩溃或者死循环

6.调试
碰撞检测系统也容易收到各种错误的影响,在开发阶段可以采取一些步骤减轻调试过程带来的痛苦!
a)对于最近的n次碰撞查询,保持一个循环缓冲区,对应于若干秒的数据值
b)提供碰撞几何体的可视化方案
c)维护一个测试查询组,当代码改变时,可以对照测试查询组运行碰撞测试代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值