物理引擎Box2D
DOTS,软浮点物理引擎:https://github.com/Kimbatt/unity-deterministic-physics?tab=readme-ov-file
Unity底下物理引擎就是Box2D,这里因为项目需要定点数物理引擎,就找了个抄过来
定点数物理引擎:https://github.com/Zonciu/Box2DSharp-deterministic
TrueSync里面的Farseer就是基于Box2D弄的 https://github.com/Genbox/VelcroPhysics
游戏内主要用于碰撞检测,不用计算物理属性(受力、速度等)。
Triangulate生成三角形算法
ChatGPT提供
-
Earclip 算法:(目前游戏内构建多边形使用)
-
介绍:Earclip 算法用于将简单多边形进行三角测量,其中多边形的边界没有重叠或自交。
-
适用场景:适用于简单多边形的三角测量,例如多边形填充和简单的多边形分解。
-
-
Bayazit 算法:
-
介绍:Bayazit 算法用于将复杂的多边形分解为一组简单的三角形。
-
适用场景:适用于多边形分解,特别是在需要将复杂的多边形分解为简单三角形的应用,如碰撞检测、路径规划和切割操作等。
-
-
Flipcode 算法:
-
介绍:Flipcode 算法用于构建具有较好质量的 Delaunay 三角网格。
-
适用场景:适用于构建 Delaunay 三角网格的应用,如计算机图形学、地理信息系统、模型生成和仿真等。
-
-
Seidel 算法和 SeidelTrapezoids 算法:
-
介绍:Seidel 算法和 SeidelTrapezoids 算法用于在平面上进行点集三角测量。
-
适用场景:适用于点集三角测量的应用,特别是在处理动态点集和需要高效点插入和查询的场景中,如实时模拟、可视化和交互式设计等。
-
-
Delaunay 算法:
-
介绍:Delaunay 算法用于构建满足 Delaunay 条件的三角网格。
-
适用场景:适用于构建 Delaunay 三角网格的应用,可以应用于计算机图形学、地理信息系统、计算机辅助设计、模拟和优化等领域,如三维建模、网格生成和点云处理等。
-
碰撞检测
-
遍历所有刚体AABB检测是否相交,相交的加到同一个岛屿
- 遍历刚体接触点,后面计算物理受力情况
-
同个岛屿内Body标记需要检测碰撞计算
-
先AABB检测是否可能相交
-
再根据GJK算法计算碰撞
-
GJK 凸多边形相交检测
https://zhuanlan.zhihu.com/p/511164248
-
初始化:选择两个凸形状(通常是多边形或多面体)以及一个初始方向。
-
迭代:在每一次迭代中,执行以下步骤:
-
在当前方向上计算两个凸形状的支持点,即距离当前原点最远的点。
-
检查原点是否在两个支持点的连线上。如果是,则两个凸形状相交,碰撞检测成功。
-
否则,根据当前支持点的连线方向计算一个新的搜索方向。
-
-
终止条件:迭代过程将继续,直到找到重叠(碰撞)或者确定没有重叠的情况。
游戏应用
游戏内扇形碰撞检测应用
优化
-
构建三角型 Earclip 算法要求顺时针计算顶点,接口有检测逆时针会倒转定点列表(额外产生开销),构造时就按顺时针创建。
-
如果固定多边形,可以提前计算序列化,在运行时,直接取出三角形列表构造多边形,避免运行时计算创建多边形。
-
Body、Fixture、Shape都可以走对象池缓存,尤其是实体碰撞圆圈。