Graphics 确定三角形所在的体素

Graphics 确定三角形所在的体素,graphics,3d,geometry,voxel,Graphics,3d,Geometry,Voxel,给定环境的体素化和具有顶点a、B和C的三角形,确定三角形“占据”或驻留在哪些体素中的最佳方法是什么?换言之,如何枚举三角形任何部分所在的所有体素?首先,需要进行体素/三角形相交测试 为了实现这一点,一种自然的方法是使用立方体六个面的半平面在三角形上重复应用多边形剪裁算法(例如在3D中),然后检查剩下的部分 一个更好的方法在Graphics Gems III,三角形立方体相交,第236-239页中描述(可提供) 然后,需要枚举与三角形相交的所有体素 第一种可能的办法: 计算三角形的三维轴对齐

给定环境的体素化和具有顶点a、B和C的三角形,确定三角形“占据”或驻留在哪些体素中的最佳方法是什么?换言之,如何枚举三角形任何部分所在的所有体素?

首先,需要进行体素/三角形相交测试

  • 为了实现这一点,一种自然的方法是使用立方体六个面的半平面在三角形上重复应用多边形剪裁算法(例如在3D中),然后检查剩下的部分

  • 一个更好的方法在Graphics Gems III,三角形立方体相交,第236-239页中描述(可提供)

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

  • 第一种可能的办法:

  • 计算三角形的三维轴对齐边界框
  • 将此边界框捕捉到体素网格(框的最小/最大顶点的地板/天花板)以获得体素的三维范围
    [xmin,xmax]x[ymin,ymax]x[zmin,zmax]
  • 扫描体素以找出哪些体素与三角形相交:

    • 对于
      [xmin,xmax]

      • 对于
        [ymin,ymax]

        • 对于
          [zmin,zmax]

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

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

  • 体素/三角形相交测试中涉及的数量可以在各种
    for
    循环中递增计算
  • 通过只考虑与三角形支撑平面相交的体素,可以缩小循环的最后一个
    的范围
  • 可以更改循环的顺序,使某些轴优先于另一个轴(以考虑三角形的方向)
  • 第二种可能的办法:

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

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

      有关这两者的CPU比较,请参阅:


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

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