face_verts[:, axis]selects one vertex · [F, xyz]

PyTorch3D
—StarsMeta FAIR 面向三维计算机视觉研究构建的 PyTorch 组件库,覆盖异构三角网格、几何变换、可微分渲染、点云与隐式表示,并支持自动微分、批处理和 GPU 加速。
判断面片出界,要看三个顶点的同一坐标
一次维度索引错位同时混淆了 vertex 与 xyz;真正启用剔除后,还必须守住透视相机平面的几何边界。
face_verts[:, :, axis]selects one coordinate · [F, vertex]只有三个顶点位于同一裁剪平面外,面片才会被删除。
xy_cullable = FalseDEFER TO Z CLIPPING[F, vertex, xyz] 的两个轴不能互换
`face_verts` 的布局是 `[F, 3, 3] = [face, vertex, xyz]`,旧视锥剔除却使用 `face_verts[:, axis]`,把 plane axis 当成了顶点索引,随后 `sum(1) == 3` 实际判断的是“一个顶点的三个坐标是否同时越界”,而不是“三个顶点是否在同一裁剪平面之外”。修正索引后又暴露出透视投影边界:跨越相机平面的三角形会因后方顶点经过透视除法被镜像,可能在 XY 上看似全部越界,却仍有前方部分穿过视锥。
三个顶点必须越过同一个平面
面片只有在三个顶点都位于同一个视锥平面外时才能安全删除,因此必须沿坐标维取 `face_verts[:, :, axis]`,再以 `all(dim=1)` 聚合顶点维。对于 perspective-correct 投影,XY 的 NDC 坐标只对完全位于相机前方的面片可直接用于剔除;跨越相机平面的面片应交给后续 Z clipping 处理。正交投影不发生这种镜像,Z 轴也始终使用世界坐标。
跨越相机平面的面片交给 Z clipping
把坐标访问改为 `face_verts[:, :, axis]` 并使用 `all(dim=1)` 明确表达三顶点同侧条件;在关闭剔除时提前返回,并为透视投影建立 `xy_cullable` 掩码:只有全部顶点满足 `z >= z_clip_value`(未设置时为 `z > 0`)才执行 XY 剔除。回归测试覆盖六个视锥平面、三种顶点顺序、透视投影有无 Z clip、正交投影及 Z 轴剔除。
六平面、三顺序与 4,096 个随机三角形
针对 4,096 个固定种子随机三角形的独立 oracle,修复后保持 0 个不一致;旧实现同一输入产生 604 个误剔除与 603 个漏剔除。最终上游版本的定向渲染与裁剪测试 34 项通过、8 项 OpenGL 用例跳过,Meta 内部 Builds & Tests 与 Linter 均通过;PR #2044 经 CodeSync 以提交 `e73a7e7` 合入 main,关闭长期问题 #1936。
