🚀 Support Field#

Genesis 中凸体形状的碰撞检测严重依赖支持函数。Minkowski Portal Refinement (MPR) 算法的每次迭代都会询问以下形式的问题:

“给定方向 d,哪个顶点具有最大的点积 v·d?”

一个朴素实现每次都必须遍历所有顶点——对于包含数千个点的模型来说是浪费的。为了避免这种情况,Genesis 在场景初始化期间为每个凸体几何体预计算一个 Support Field。实现位于 genesis/engine/solvers/rigid/support_field_decomp.py


工作原理#

  1. 均匀方向网格 – 使用经度/纬度 (θ, ϕ) 将球面离散为 support_res × support_res 个方向。默认 support_res = 180,产生约 32 k 个采样方向。

  2. 离线投影 – 对于每个方向,我们投影所有顶点并记住具有最大点积的索引。结果数组为:

    • support_v ℝ^{N_dir×3}对象空间中的实际顶点位置。

    • support_vid ℕ^{N_dir} – 原始顶点索引(用于热启动 SDF 查询)。

    • support_cell_start[i_g] – 每个几何体扁平数组的前缀和偏移量。

  3. Taichi Fields – 数组被复制到 GPU 驻留的 Taichi 字段中,以便内核无需主机往返即可访问它们。

v_ws, idx = support_field._func_support_world(dir_ws, i_geom, i_batch)

以上以 O(1) 给出任何查询方向的世界空间极值点。


数据布局#

字段

形状

描述

support_v

(N_cells, 3)

顶点位置 (float32/64)

support_vid

(N_cells,)

对应的顶点索引 (int32)

support_cell_start

(n_geoms,)

扁平数组的偏移量

!!! info “内存占用” 使用默认分辨率,每个凸体形状使用约 32 k × (3 × 4 + 4) = 416 kB。对于小基元的集合,这比为每个形状构建 BVH 便宜得多。


优点#

  • 恒定时间查找 在 MPR 期间 ⇒ GPU 上更少的分支发散。

  • GPU 友好 – Support Field 是一个简单的 SOA 数组,没有复杂的指针追踪。

  • 适用于任何凸网格 – 无需标准轴或边界框。

限制与未来工作#

  • 方向网格是各向同性但非自适应的 – 小于角单元大小的特征可能映射到错误的顶点。

  • 如果场景中几何体数量很大,预处理和内存消耗会很昂贵。


API 摘要#

from genesis.engine.solvers.rigid.rigid_solver_decomp import RigidSolver
solver   = RigidSolver(...)
s_field  = solver.collider._mpr._support  # 内部句柄

v_ws, idx = s_field._func_support_world(dir_ws, i_geom, i_env)

v_ws世界空间支持点,而 idx 是原始网格中的顶点 ID(全局索引)。


与碰撞管线的关系#

Support Field 是一个加速结构,专门被凸体-凸体精阶段使用。其他碰撞路径 – SDF、地形、平面-盒体 – 绕过它,因为它们要么依赖解析支持函数,要么依赖距离场。

有关 MPR 如何集成此结构的详细信息,请参见 碰撞、接触与力