我遇到的问题是如何使用双重轮廓算法将3D Perlin Noise用作密度函数。我发现很难找到任何使用或讨论如何使用3D Perlin Noise和Dual Contouring生成地形的细节的Dual Contouring实现或博客/写作。
我已经设法用隐式球体实现双轮廓,因此知道它的工作正确并且基本了解密度函数的工作原理(至少在球体情况下),具有Perlin Noise的基本知识(实现了3D)通过纹理输出和基本立方体素地形生成测试版本,并了解如何计算梯度(在这种情况下为分析导数)以用于QEF计算。
我尝试了多种方法来尝试获得相对不错的外观但没有成功:
1)通过Perlin噪声生成网格的密度值(即,值<1在内部,> 1在外部,0在轮廓上),然后生成交叉点值(轮廓与立方体相交)对于立方体,使用Perlin Noise完全分开,使用坐标输入作为我们所处的立方体的索引,具有较小的偏移量。 (基本上只生成一个真正的立方体表面)
2)以与球函数类似的方式使用Perlin Noise,通过Perlin Noise生成密度网格,然后沿着两个附近立方体密度值之间的边缘插入每个交叉点,直到Perlin Noise达到0(即精确指出密度函数与边相交)然后使用触发Perlin Noise输出0的坐标。 (再次生成一个立方体表面,认为可能是因为插值通常在共同点击一个整数值时触发0,即在Perlin latices边缘。)
3)这是我最成功的一个,类似于2),除了我将Perlin Noise的输入值保持在0.1到0.9范围内,即保持在单个格子内。它为某些立方体输出了ok值,但计算QEF(立方体的平均点)会在多维数据集范围之外发送相当数量的点,尽管所有交叉点都在多维数据集内。我认为它与我使用Perlin Gradients的方式有关,基本上我插值以找到为Perlin Noise返回值生成0的坐标,然后我使用此坐标中的渐变(分析导数)和所有这些的高潮使得坐标数英里远。
如果需要我会尽我所能,请随时要求发布更多信息,这是我第一次发帖,如果帖子低于标准,那就很抱歉。
tl; dr如何使用3D Perlin Noise作为密度函数在双轮廓算法中生成地形?特别是在为QEF计算生成边的交点和法线时。
编辑: 我正在尝试(并且失败)使用perlin噪声生成器来填充Perlin Noise以填充初始密度数据的新当前方法,在这个点之后对于任何边缘交点我做一些简单的线性数学来找到0交叉的线上的比率(所以如果一边的密度值是0.5而另一边是-0.5,那么给出的值将是0是他们之间的50%,所以0.5f)。一旦我有了这个值,我只需将它添加到相关的坐标上以获得该边缘上的交点。在此之后,我使用交点作为输入来计算Perlin Noises 3D Gradient(基本上只运行噪声函数,将其作为输入并使用此处的方法计算分析导数:3D Perlin noise analytical derivative)。
完成此操作后,梯度和交点值将输入到QEF函数中,该函数使用SVD分解而不是QR分解描述为在原始双轮廓纸中更准确(发现SVD看起来更简单,并且它也响起比如纸张的性能较差。
一些屏幕截图有望通过显示目前的样子来帮助一点。第一个是对角线代码注释掉,第二个有对角线就位,在“顶点超出界限”的所有打印之后的数字是它们的立方体之外的顶点数。
发生对角线分割的第二个: