1.物理模拟相关过程
1) 积分Integrate(物体运动位置和朝向的迭代)
2)碰撞检测 Collision Detect(检测碰撞体间是否接触以及相关碰撞信息)
1.粗略碰撞检测BroadPhase(粗略判断碰撞体间是否接触)
2.精确碰撞检测NarrowPhase(精确计算碰撞体间的接触点,接触法向量和穿透距离,为后续碰撞处理做准备)
3) 碰撞约束Collision Constraint (用约束求解的方法处理碰撞问题)
1.碰撞处理Collision Handling(模拟反弹力和摩擦力以及小球碰撞后的运动)
2.静止接触 Resting Contact(让盒子静止在桌面上,避免穿透)
2.碰撞检测
1.碰撞检测基础算法
1)计算空间中两点间的最小距离
延伸即为球体之间的距离,同时可得出重叠深度,重叠位置,重叠法向量等
2)计算空间中点到平面的最小距离
设 空间中的点是P,平面的单位法向量n,平面上某一个点是Q
则有
延伸即为球体与平面之间的距离
3)计算空间中点到线段的距离(注意这里是线段而不是直线)
延伸即为球体跟胶囊体之间的距离
4)计算空间中点到方盒的最小距离
我们按照图中所示的方式将空间按照方盒划分
空间将会划分成27份,12条边对应12个区域(对应下图中的a),8个顶点分别对应8个区域(对应下图中的b),6个面分别对应6个区域(对应下图中的c),最后一个区域是在方盒内部。
如果在12条边对应的区域的话,距离最近的点是该点在对应边上的投影。(如上图a)
如果空间中的点在8个顶点对应的区域内的话,距离最近的点就是所在区域对应的顶点。(如上图b)
如果在6个面对应的区域的话,距离最近的点是该点在对应平面上的投影。(如上图c)
而如果在方盒内部,需要比较该点到方盒6个面的距离,距离最小的就是最近距离,该点在应面上的投影就是最近点。
延伸即为球体跟立方体之间的距离
5)计算空间中线段到线段的最小距离
设线段 P1P2和Q1Q2,使用叉乘计算出平行与两条线段的平面(见叉乘的几何意义)。将Q1Q2投影在另P1P2线段所在平面。若线段相交,则计算平面之间的距离。不想交则分别计算点与线段的距离。
延伸即为最常见的胶囊体之间的距离
6)凸面体之间的距离(GJK算法)
GJK算法比较关键的一点是需要计算两个形状之间的Minkowski差,Minkowski差可以定义为 A,也就是形状A中的任意一点与形状B中的任意一点的差组合成的形状。该形状有条重要的性质,它与原点的最小距离就是A与B的最小距离,而当原点在该形状内时,A和B发生重叠。
2.空间加速
1) 基于空间树的加速
2) AABB包围盒的粗略计算
3.CCD算法(连续碰撞检测)
1) Sweep-based CCD
基于扫掠的 CCD 采用撞击时间 (TOI) 算法,通过扫掠对象的前向轨迹来计算对象的潜在碰撞(采用对象的当前速度)。如果沿对象移动方向有接触,该算法会计算撞击时间并移动对象直至达到该时间。该算法可从该时间开始执行子步骤,即计算 TOI 之后的速度,然后重新扫掠,代价是需要经历更多的 CPU 周期。
缺点:未考虑角速度计算,运算量大
2) Speculative CCD
推断性 CCD 的工作原理是基于对象的线性运动和角运动增大一个对象的粗筛阶段轴对齐最小包围盒 (AABB)。该算法是一种推测性的算法,因为会选取下一物理步骤中的所有潜在触点。然后将所有触点送入解算器,因此可确保满足所有的触点约束,使对象不会穿过任何碰撞。
缺点1:会产生幽灵碰撞(由于大一号的AABB)
文章来源:https://www.toymoban.com/news/detail-708240.html
缺点2 穿隧现象(解算器只计算扩大的 AABB 的内部触点,在求解和积分阶段不会执行碰撞检测)文章来源地址https://www.toymoban.com/news/detail-708240.html
到了这里,关于物理系统碰撞相关原理及算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!