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

        \left | s \right | \leq d,则p位于球内。

2.球与球相交:

    球心o1,o2,半径r1,r2,距离d

        d = r1 - r2

        若^\left | d \right |{2}\leq \left (r1+r2 \right )^{2},则两球相交。

    3.分离轴定理:

        用于两个凸多边形相交判断,若找不到一条轴使两个凸多边形在轴上的投影没有重合,则没有碰撞。

    4.GJK算法:

        闵可夫斯基差:把A图中所有的点与B图所有的点成对相减,得出差的集合,若存在0点,则有碰撞。

        GJK:从差减小的方向去检测

    5.运动检测:由于高速物体移动,可能直接穿过碰撞体

        *扫掠形状,两帧之间物理的位置连接形成的形状

        *连续检测,使用位置插值,前后两个位置间,使用时间插值,可以增加精度

        *增大碰撞体厚度

        *增加运动物体长度

    6.碰撞性能优化

        *时间一致性:在两时步中,位置接近,跨多帧缓存结果,避免重复计算

        *空间划分:切割区域,大幅降低相交测试,例如:八叉树,kd树,BSP树。

        *分阶段检测:

                <1>AABB检测,

                <2>使用复合形状,做中间检测,

                <3>碰撞基本原型检测

        *碰撞查询:

                <1>光线投射:由起点p0以及时间增量d描述

                        p\left ( t \right ) = p0 + td, t\in \left [ 0,1 \right ]

                <2>形状投射:p0,d,类型,大小,定向等信息

                       此处可以有多点碰撞,较为复杂,不是本文论点,可以自行查询资料。

5.其他:

    1.碰撞过滤:

    2.碰撞掩码(各类型之间可否碰撞用32位的掩码表示)

    3.碰撞回调:回调函数检查碰撞的具体信息,自行处理

    4.碰撞材质:关联一组属性,音效,粒子,物理(摩擦系数),过滤等

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐