【问题标题】:Determine voxels that a triangle is in [closed]确定三角形所在的体素[关闭]
【发布时间】:2014-03-05 12:00:04
【问题描述】:

给定环境的体素化和具有顶点 A、B 和 C 的三角形,确定三角形“占据”或驻留在哪些体素的最佳方法是什么?换句话说,我怎样才能枚举三角形的任何部分所在的所有体素?

【问题讨论】:

    标签: graphics 3d geometry voxel


    【解决方案1】:

    首先,您需要一个体素/三角形相交测试。

    • 要实现这一点,一种自然的方法是使用立方体六个面的半平面在三角形上重复应用多边形裁剪算法(例如 3D 中的 Sutherland-Hodgman)并检查什么是之后就离开了。

    • Graphics Gems III, Triangle-Cube Intersection, pp. 236-239 中描述了更好的方法(implementation 可用)。

    然后,您需要枚举与三角形相交的所有体素。

    • 第一种可能的方法:

      1. 计算三角形的 3D 轴对齐边界框。
      2. 将此边界框捕捉到体素网格(将框的最小/最大顶点放在地板/天花板上)以获得体素的 3D 范围[xmin,xmax]x[ymin,ymax]x[zmin,zmax]
      3. 扫描体素以找出三角形相交的体素:

        • 对于x 中的[xmin, xmax]

          • 对于y 中的[ymin, ymax]

            • 对于z 中的[zmin, zmax]

              检查体素(x, y, z)是否与三角形相交

      至少可以通过以下几种方式进行优化:

      1. 体素/三角形相交测试中涉及的数量可以在各种for 循环中增量计算。
      2. 最后一个for 循环的范围可能会通过仅考虑与三角形的支撑平面相交的体素来减少。
      3. 可能会更改循环的顺序,以使某个轴优先于另一个轴(考虑到三角形的方向)。
    • 第二种可能的方法:

      1. 选择三角形的一个顶点并找出包含它的体素。该体素将用作种子。
      2. 从此种子体素开始,对与三角形相交的体素进行广度优先搜索 (BFS) 或深度优先搜索 (DFS),即:
        • 跟踪已测试哪些体素与三角形相交,
        • 处理相交体素的所有未测试的相邻体素,但是
        • 仅队列 (BFS) 或推送 (DFS) 与三角形相交的体素。

    【讨论】:

    • 感谢您提供的信息!可能是一个基本问题:但对于第一种可能的方法,三角形的 3D 轴对齐边界框是否只是一个以三角形极值点 (min/max (x, y, z)) 作为其边缘的立方体?另外,另一种可能的方法是使用 Bresenham 的算法填充三角形(应用于 3D):sunshine2k.de/coding/java/TriangleRasterization/… ?
    • 是的,三角形的 3D 轴对齐边界框是具有三角形最小/最大 x/y/z 坐标的 8 种可能组合作为顶点的框。
    • 不确定我是否会将其定性为 Bresenham 的 3D 模型,但您也可以尝试在 3D 中沿三角形的两条边(从一个顶点开始)同时使用光线行走并报告所有相交的体素在连接边缘中间点的线段上(要搜索的关键字是 ray walk 3D DDA)。
    • 感谢您的帮助!我知道这是一个有点旧的帖子,但我正在尝试实现“检查体素(x,y,z)是否与三角形相交”步骤,我对来自 Graphics Gems III 的代码有点困惑体素/三角形相交测试。该代码似乎面向与单位立方体的交集,修改它以使其适用于任意立方体/体素的最佳方法是什么?再次感谢。
    • @CenkBaykal 代码实现了一个以原点为中心的单位立方体的三角形/立方体相交测试。要将它与边界框[xmin,xmax]x[ymin,ymax]x[zmin,zmax] 的体素一起使用:对三角形应用平移,使立方体((xmin+xmax)/2,(ymin+ymax)/2,(zmin+zmax)/2) 的中心位于原点,然后对(xmax-xmin,ymax-ymin,zmax-zmin) 的三角形应用非均匀缩放,然后最后调用提供的实现(即不要更改代码,而是转换您的三角形)。
    【解决方案2】:

    最好的方法是使用 DDA 进行光栅化,因为它比任何盒装三角形测试都要快几倍。光栅化是一种散射技术,所以它只触及三角形表面上的体素。盒子测试是收集技术,因此它们要求每个体素检查哪些三角形接触它。前者(分散)是O(n^2),后者是聚集,是O(n^3)。

    有关两者的 CPU 比较,请参阅: https://github.com/ramakarl/voxelizer

    此代码演示了两种聚集技术,Schwarz-Seidel 和 Akenine-Moller,以及一种散射技术,基于边缘的 2D DDA。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 2017-07-20
    • 2011-01-04
    • 2021-07-12
    • 2014-07-05
    • 2011-09-23
    • 1970-01-01
    相关资源
    最近更新 更多