language-agnostic - 以程序方式生成 "blob"二维图形的好方法

标签 language-agnostic graphics noise procedural-generation

我希望以计算速度快的方式创建一个“blob”。这里的 Blob 被定义为可以是任何形状但全部相连的像素的集合。示例:

.ooo....  
..oooo..  
....oo..  
.oooooo.
..o..o..  

...ooooooooooooooooooo...  
..........oooo.......oo..  
.....ooooooo..........o..  
.....oo..................  


......ooooooo....  
...ooooooooooo...  
..oooooooooooooo.  
..ooooooooooooooo  
..oooooooooooo...  
...ooooooo.......  
....oooooooo.....  
.....ooooo.......  
.......oo........  

哪里。是死区,o 是标记像素。我只关心“二进制”生成 - 像素要么打开,要么关闭。例如,这些看起来像一些想象中的番茄酱或虚构的细菌或任何有机物质。

什么样的算法可以实现这一点?我真的很茫然

最佳答案

David Thonley 的评论是正确的,但我假设您想要一个具有“有机”形状和光滑边缘的 Blob 。为此,您可以使用元球。元球是一种作用于标量场的幂函数。标量场可以通过行进立方体算法有效地渲染。通过改变球的数量、位置和半径可以形成不同的形状。

请参阅此处了解 2D 元球的介绍:https://web.archive.org/web/20161018194403/https://www.niksula.hut.fi/~hkankaan/Homepages/metaballs.html

这里是关于移动立方体算法的介绍:https://web.archive.org/web/20120329000652/http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/

请注意,3D 中交叉点的 256 种组合在 2D 中只有 16 种组合。它非常容易实现。

编辑:

我用 GLSL 着色器编写了一个快速示例。这是使用 50 个 Blob 以及 hkankaan 主页上的能量函数得到的结果。 alt text

这是实际的 GLSL 代码,尽管我评估了每个片段。我没有使用行进立方体算法。您需要渲染一个全屏四边形才能工作(两个三角形)。 vec3 统一数组只是通过 glUniform3fv 传递的各个 Blob 的 2D 位置和半径。

/* Trivial bare-bone vertex shader */
#version 150
in vec2 vertex;
void main()
{
    gl_Position = vec4(vertex.x, vertex.y, 0.0, 1.0);
}

/* Fragment shader */
#version 150
#define NUM_BALLS 50
out vec4 color_out;
uniform vec3 balls[NUM_BALLS]; //.xy is position .z is radius

bool energyField(in vec2 p, in float gooeyness, in float iso)
{
    float en = 0.0;
    bool result = false;
    for(int i=0; i<NUM_BALLS; ++i)
    {
        float radius = balls[i].z;
        float denom =  max(0.0001, pow(length(vec2(balls[i].xy - p)), gooeyness));
        en += (radius / denom);
    }
    if(en > iso)
        result = true;
    return result;
}
void main()
{
    bool outside;
    /* gl_FragCoord.xy is in screen space / fragment coordinates */
    outside = energyField(gl_FragCoord.xy, 1.0, 40.0);
    if(outside == true)
        color_out = vec4(1.0, 0.0, 0.0, 1.0);
    else
        discard;
}

关于language-agnostic - 以程序方式生成 "blob"二维图形的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3587704/

相关文章:

algorithm - 如何将重复键插入b树

language-agnostic - 我们可以利用语法高亮功能从 SublimeText 中的源文件中删除所有注释吗?

java - GUI 使用 JFrame 和 JPanel 绘制自定义形状

python - 向 numpy 数组添加噪声

java - 计算行字符串在 vector 中出现的次数,如果计数低于阈值则将其删除

python - 从 Python 数据中去除尖峰噪声

language-agnostic - 进行系统调用,将 stdout 输出作为字符串返回

language-agnostic - 深拷贝和浅拷贝有什么区别?

python - 如何处理networkx图形中的重叠节点

c# - Graphics.DrawImage Logo 在大图像上缩放不正确