用于创建Voronoi网格的管道

时间:2015-10-21 16:17:04

标签: python graphics 3d pipeline voronoi

我想实现一个Maya插件(这个问题独立于Maya)来创建3D Voronoi模式,像

enter image description here

我只知道我必须从点采样开始(我实现了this paper中描述的自适应泊松采样算法)。

我认为,从这些方面来说,我应该使用Voronoi创建网格的3D线,但结果与我的预期不同。

以下是我从scipy.spatial.Voronoi这样处理结果的一些示例(如建议的here):

vor = Voronoi(points)
for vpair in vor.ridge_vertices:
    for i in range(len(vpair) - 1):
        if all(x >= 0 for x in vpair):
            v0 = vor.vertices[vpair[i]]
            v1 = vor.vertices[vpair[i+1]]
            create_line(v0.tolist(), v1.tolist())

灰色顶点是采样点(原始形状是一个简单的球体): enter image description here

这是一个更复杂的形状(手臂) enter image description here

我错过了什么?任何人都可以建议我必须实现适当的管道和算法来创建这样的模式吗?

1 个答案:

答案 0 :(得分:1)

我看到你的问题,因为你发布了它,但没有真正的答案,但是因为我看到你仍然没有得到任何回应我至少会写下一些想法。不幸的是,它仍然不是解决问题的完整解决方案。

对我来说,似乎你在这个问题中混合了几个单独的问题所以它有助于将其分解为几个部分:

Voronoi图:

根据定义,图表是无限的,所以当你直接绘制它时,你应该期待你的第二张图像上有类似的混乱,所以这看起来很好。我不知道SciPy是如何做到这一点的,但是我使用的实现将一些边缘标记为“无限”并为我提供了边缘方向,因此我可以将它剪切到一定距离。您需要检查从SciPy获得的确切数据。 在3D世界中,您几乎总是想要移除这些无限区域以获得任何有意义的渲染,或者至少移除包含相机的区域。

积分生成:

Poisson光盘可以作为一些样本数据或早期R& D,但它也是最无聊的:)。您需要更多方法来生成输入点。 我试图想象你的球样示例所需的输入,我想出了类似的东西:

  1. 创建两个点,具有相同的中心但半径不同。
  2. 当你从中创建一个Voronoi图并移除无限区域时,你最终会得到类似足球的东西。

    如果你随机创建了两个球体,你会得到非常不规则的“球”边界,但是如果你缩放一个球体的点,要用于第二个球体,你应该得到一个规则的网格,类似于球。您也可以使用相似的点,但添加一些随机偏移来控制表面不规则的程度。

    1. 获取您的计算图表,并为每条边创建沿此边缘的几个点 - 这将为您提供构建更大区域边缘的小区域。再次使用随机偏移。尝试忽略不会触及任何无限区域的边缘,以获得与图像类似的结果。

    2. 从两个阶段获取积分并再次计算图表。

    3. 网格生成:

      到目前为止它看起来不像你的目标图像。事实上,使用生产质量(对于Maya插件)来说可能真的很难,但我看到了一些可能有用的技巧。

      我首先尝试的是获得所有边缘并沿着它们挤出一些圆圈。您可以调整圆的大小,使其在末端稍微大一些。然后在所有这些网格和最后的一些网格平滑之间做布尔“或”。 这种方式可能会给你类似的结果,但你需要小心网格交叉点,它们可能会变得丑陋,需要一些特殊的处理。