有人可以解释双重轮廓吗?


9

我一直在尝试了解体素渲染,并一直在研究双重轮廓(DC)。

到目前为止,我对此非常了解:

  1. 对一组网格点运行密度函数(即噪声函数)
  2. 查找网格中哪些边缘包含端点之间的变化
  3. 从这些边缘创建交点(即矢量)

现在这是我遇到的问题,接下来是生成法线,但是如何?在查看此主题时,此图像通常会出现。

                                                   带符号的网格,其边缘由Hermite数据标记

研究表明,法线将从等值面生成。认为我从噪声到等值面再到法线是否正确?如果是这样,我将如何完成每个步骤?

据我了解,下一步将是DC论文中的以下内容;

对于每个显示符号变化的边,生成一个四边形,连接包含该边的四个立方体的最小顶点。

上面的图片代表这个报价吗?

最后,下一步是使用相交点和法线运行QEF,这将生成我的顶点数据。它是否正确?


据我了解,这个过程有点像...噪声>点云>等值面>法线...但我不够聪明,无法声称我可以正确解释此过程,所以我不会尝试给出答案。
战争

Answers:


3

在获得边缘和曲面之间的交点的同时,将基于密度函数的梯度生成法线。如果它是简单且封闭的形状(例如球体),则可以解析地计算法线,但是如果有噪声,则需要采样。

您按错误的顺序进行下一步。首先,为每个显示符号变化的单元生成一个顶点。您要最小化的QEF只是到该单元格的交点/法线对定义的每个平面的总距离。然后,浏览出现符号变化的边缘,并使用四个相邻的顶点(确保已在最后一步中生成)创建了一个四边形。

现在,实现此目标的最大障碍是解决QEF。实际上,我提出了一个简单的迭代解决方案,该解决方案可以在(例如)GPU上并行运行。基本上,您是在单元中心开始顶点。然后,对从顶点到每个平面的所有矢量求平均值,并沿着该结果移动顶点,然后重复此步骤固定次数。我发现将其沿结果移动约70%可使迭代次数最少。


所以可以说我有一个单元格/体素,我知道它有符号变化(例如MC之类的情况),我已经对单元格的每个8个角运行了一个噪声函数以找到其密度。我无法理解的是,如何找到QEF 的变量xnp
Soapy 2014年

x是顶点位置。对于每个相交点,您都有p(位置)和n(法线),它们构成了我所讨论的平面。
jmegaffin 2014年

通过找到沿边缘的两个密度的加权平均值为零的位置来找到p。然后,通过在p处获取密度函数的梯度来计算n
jmegaffin 2014年

因此,基本上,我为每个立方体计算每个12个边的pn,然后将每个像元边缘pn的QEF 转换为x,在您的示例中,它以体素/像元的中心开始?然后,如果四个像元共享同一边,则创建一个四边形,将每个四个像元x?连接起来。生成的四边形是我的多边形数据吗?
Soapy 2014年

并非每个边缘都会有一个相交,所以您不一定要求解12个平面的QEF。除此之外,您还拥有它!
jmegaffin

1

从阅读论文到第2页,似乎体积的权重存储在网格的角落,而不是通常的Marching Cubes样式算法更喜欢立方体本身的重量。这些角权重定义沿2个角之间的边之间的点,每个角之间都有一个符号变化。具有符号变化的边缘也存储该边缘的法线,该法线是OP中2D表示中的斜线。正常信息是在体积创建期间定义的(通过使用任何编辑工具或程序性体积创建方法),而不是在生成等值面之后,如Marching Cubes样式算法所期望的那样。该法线数据“声明”通过点的线/面必须具有预定义的法线值。如果行进立方体会使该点处的线弯曲以与相邻边上的另一个点配合,则扩展行进立方体和双重轮廓将使线/面向外延伸,直到与穿过该点上的线/面相交为止。正常值不同的相邻边。这样可以从体数据中创建尖角,而基本的Marching Cubes算法将在某种程度上完善表面。我不太了解QEF(二次误差函数)如何发挥作用,除了QEF似乎使计算角点将位于的多维数据集中的扩展点更容易之外。扩展的行进立方体和双重轮廓都将线/表面延伸到与穿过相邻边上具有不同法线值的点的线/表面相交。这样可以从体数据中创建尖角,而基本的Marching Cubes算法将在某种程度上完善表面。我不太了解QEF(二次误差函数)如何发挥作用,除了QEF似乎使计算角点将位于的多维数据集中的扩展点更容易之外。扩展的行进立方体和双重轮廓都将线/面向外延伸,直到与穿过相邻边上具有不同法线值的点的线/面相交为止。这样可以从体数据中创建尖角,而基本的Marching Cubes算法将在某种程度上完善表面。我不太了解QEF(二次误差函数)是如何发挥作用的,除了看起来它们使计算角点所在的多维数据集中的扩展点变得更容易之外。

请注意,这里我一直在以OP中的表示形式在2D意义上谈论线条和边缘。我将不得不做更多的阅读和思考,以将其扩展到3D以生成体积网格。

为了解决有关如何生成法线的问题的第二部分,并从噪声驱动的程序角度进行思考,似乎您将用噪声数据填充体积,然后寻找符号变化的边缘,然后检查这四个立方体共享边以找出要生成哪些三角形,并像对多个三角形的任何其他交集一样计算顶点法线,取共享顶点的每个三角形的法线平均值。就我而言,这是非常投机的,因为本文主要涉及由扫描转换的网格生成的CSG操作和体积,两者在表面上均具有明确的法线。

我希望至少答案的第一部分能够解决重量数据的表示和使用方式与基本的Marching Cubes完全不同的区别,以及为什么必须在体积生成过程的早期就创建正常数据,在使用基本行进立方体的情况下,通常在网格生成过程的最后阶段创建法线。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.