游戏碰撞表示以及检测的原理
1.首先说一下为什么需要碰撞:*保证游戏内物体不互相穿透*模拟自然物理的运动:引力,弹簧*可破坏的建筑和结构*弹道*行驶的载具*水面,浮力*声音传播2.物理SDK介绍:*I-Collide,SWIFT,RAPID:基础游戏碰撞引擎,不能开箱即用*ODE:免费,开源,方便...
1.首先说一下为什么需要碰撞:
*保证游戏内物体不互相穿透
*模拟自然物理的运动:引力,弹簧
*可破坏的建筑和结构
*弹道
*行驶的载具
*水面,浮力
*声音传播
2.物理SDK介绍:
*I-Collide,SWIFT,RAPID:基础游戏碰撞引擎,不能开箱即用
*ODE:免费,开源,方便调试修改
*Bullet:开源,支持连续碰撞检测
*TrueAxis:非商用免费
*PhysX:付费获取源码
*Havok:商业物理SDK的绝对标准,平台支持加优化
3.碰撞原型表示
*球体:球心+半径
*胶囊体:两点+半径
*AABB包围盒:矩形6个面都与坐标轴平行,由2个点表示,一个是最小坐标,一个最大坐标
*定向包围盒OBB:半尺寸+变换
*定向多胞形:包含k个面,使用k个面方程或者k个点+k个法矢量
*多边形汤:三角形表示,定点顺序表示内外
*复合形状:增加中间形状,包含多个子形状,中间形状碰撞再检测子形状
4.检测方法:
1.点与球相交:
点p到球心o的矢量d,半径r,
d = o - p
,则p位于球内。
2.球与球相交:
球心o1,o2,半径r1,r2,距离d
d = r1 - r2
若,则两球相交。
3.分离轴定理:
用于两个凸多边形相交判断,若找不到一条轴使两个凸多边形在轴上的投影没有重合,则没有碰撞。
4.GJK算法:
闵可夫斯基差:把A图中所有的点与B图所有的点成对相减,得出差的集合,若存在0点,则有碰撞。
GJK:从差减小的方向去检测
5.运动检测:由于高速物体移动,可能直接穿过碰撞体
*扫掠形状,两帧之间物理的位置连接形成的形状
*连续检测,使用位置插值,前后两个位置间,使用时间插值,可以增加精度
*增大碰撞体厚度
*增加运动物体长度
6.碰撞性能优化
*时间一致性:在两时步中,位置接近,跨多帧缓存结果,避免重复计算
*空间划分:切割区域,大幅降低相交测试,例如:八叉树,kd树,BSP树。
*分阶段检测:
<1>AABB检测,
<2>使用复合形状,做中间检测,
<3>碰撞基本原型检测
*碰撞查询:
<1>光线投射:由起点p0以及时间增量d描述
<2>形状投射:p0,d,类型,大小,定向等信息
此处可以有多点碰撞,较为复杂,不是本文论点,可以自行查询资料。
5.其他:
1.碰撞过滤:
2.碰撞掩码(各类型之间可否碰撞用32位的掩码表示)
3.碰撞回调:回调函数检查碰撞的具体信息,自行处理
4.碰撞材质:关联一组属性,音效,粒子,物理(摩擦系数),过滤等
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)