如何生成随机斑点?
How to generate random blobs?
我想生成随机的 3D 形状。我希望形状是斑点,基本上可以通过取一个球体并将其变形为不太规则但仍然大部分紧凑的形状来获得。想象拿一个粘土球并轻轻捏或推拉它。表面曲率或表面不规则的比例应该可以使用某种参数来控制。我希望输出是由体素组成的体积(内部为 1,外部为 0),尽管可以转换为体积的表面也可以。
我看过高斯随机球体,它是球谐函数的叠加。我不太明白这些的数学原理,而且任何地方都没有示例代码。此外,它们不能生成任何具有悬垂的形状(即,来自球体中心的光线与表面相交不止一次)。
使用 3D metaballs。
随机生成一组 3D 点。 5 或更少应该可以,但您可以改变它。
对于每个体素,计算到每个点的反距离(或体素和点坐标的某些其他函数)并将它们相加。如果总和等于或大于阈值,则它在 blob 中,如果小于它,则它在外部。
您可以改变阈值并有选择地为每个点赋予不同的随机权重(可以是负数)。粗略地说,您希望每个点的阈值距离重叠,否则您将只有一堆单独的球体。
我使用 libnoise ...
http://libnoise.sourceforge.net/
这是一个通用噪声库,用于生成 perlin/单纯形或其他类型的 "seudo random" 数据。
"seudo" 意味着它已播种,因此我们可以通过提供相同的种子值来重新计算完全相同的数据,它适用于程序生成纹理的虚拟世界。
它可以很容易地配置为生成你想要的那种东西。
我想生成随机的 3D 形状。我希望形状是斑点,基本上可以通过取一个球体并将其变形为不太规则但仍然大部分紧凑的形状来获得。想象拿一个粘土球并轻轻捏或推拉它。表面曲率或表面不规则的比例应该可以使用某种参数来控制。我希望输出是由体素组成的体积(内部为 1,外部为 0),尽管可以转换为体积的表面也可以。
我看过高斯随机球体,它是球谐函数的叠加。我不太明白这些的数学原理,而且任何地方都没有示例代码。此外,它们不能生成任何具有悬垂的形状(即,来自球体中心的光线与表面相交不止一次)。
使用 3D metaballs。
随机生成一组 3D 点。 5 或更少应该可以,但您可以改变它。
对于每个体素,计算到每个点的反距离(或体素和点坐标的某些其他函数)并将它们相加。如果总和等于或大于阈值,则它在 blob 中,如果小于它,则它在外部。
您可以改变阈值并有选择地为每个点赋予不同的随机权重(可以是负数)。粗略地说,您希望每个点的阈值距离重叠,否则您将只有一堆单独的球体。
我使用 libnoise ... http://libnoise.sourceforge.net/
这是一个通用噪声库,用于生成 perlin/单纯形或其他类型的 "seudo random" 数据。
"seudo" 意味着它已播种,因此我们可以通过提供相同的种子值来重新计算完全相同的数据,它适用于程序生成纹理的虚拟世界。
它可以很容易地配置为生成你想要的那种东西。