gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:02:12 24 4
gpt4 key购买 nike

我希望以计算速度快的方式创建一个“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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com