网格和圆锥相交算法

Mesh and cone intersection algorithm

本文关键字:算法 网格      更新时间:2023-10-16

我正在寻找一种有效的网格(三角形集)和圆锥体(由原点、方向和与该方向的角度给出)相交的算法。更准确地说,我想找到最接近圆锥原点的交点。现在我能想到的就是用锥体原点的几条光线相交网格,得到最近的点。(当然会为网格构建一些空间结构,以拒绝不必要的交集)

我还发现了以下带有简要描述的算法:"锥体到网格的交点是在GPU上计算的,方法是用网格绘制圆锥几何体并读取标记交点的最小深度值"。不幸的是,它的实现对我来说并不明显。

那么谁能提出比我更有效的东西,或者更详细地解释如何使用OpenGL在GPU上完成它?

在 GPU 上我会这样做:

  1. 设置视图

    • 到锥体原点
    • 向外引导
    • 覆盖最大的圆形切片
    • 对于无限圆锥,请使用视图坐标系中网格顶点的最大 Z 值
  2. 清除缓冲区

  3. 绘制网格

    • 但在片段着色器中只绘制与圆锥相交的像素
    • |fragment.xyz-screen_middle|=tan(cone_ang/2)*fragment.z
  4. 读取 z 缓冲区

    • 读取片段并从有效(已填充)中选择最接近锥体原点的片段

[注释]

  • 如果您的 GFX 引擎也可以处理片段着色器的输出值
  • 然后,您可以跳过项目符号 4 并在项目符号 3 中进行最小距离搜索,而不是渲染......
  • 这将大大加快该过程(只需要单个XYZ向量)