大家好,我试图弄清楚如何在代码中生成可分割的分形(对于游戏地图,但这无关紧要)。我一直在尝试修改GIMP附带的Solid Noise插件(我对如何该代码有效),但我无法让我正常工作。
到目前为止,我修改过的代码(Java)
因此,如果任何人都可以看到我做错了什么,或者有建议我可以做些不同的事情,我将不胜感激。提前致谢。 如果我要问的是很多事情,或者是人生中的巨大失败,我深表歉意。
大家好,我试图弄清楚如何在代码中生成可分割的分形(对于游戏地图,但这无关紧要)。我一直在尝试修改GIMP附带的Solid Noise插件(我对如何该代码有效),但我无法让我正常工作。
到目前为止,我修改过的代码(Java)
因此,如果任何人都可以看到我做错了什么,或者有建议我可以做些不同的事情,我将不胜感激。提前致谢。 如果我要问的是很多事情,或者是人生中的巨大失败,我深表歉意。
Answers:
我没有完全遵循您的代码,但这是对将大致实现此效果的算法的简化描述(基于您发布的图像)。
以下说明不是超级优化的版本,但在概念上很明确(我希望如此)。一旦运行它,就可以对其进行优化(实际上,这是非常大的)。
困难的步骤是采样和内插步骤。假设我们在该层中跳过每第m个像素的采样。这是m> 1的基本思想(如果m为1,则按原样使用图像):
for each pixel x and y
left_sample_coord = m *(x / m) //(integer division, automatically truncated)
right_sample_coord = (left_sample_point + m) % image_width
top_sample_point = m*(y / m)
bottom_sample_coord = (top_sample_point + m) % image_height
horizontal_weight = (x - left_sample_point) / (m - 1)
vertical_weight = (y - top_sample_point) / (m - 1)
sample_top_left = image(left_sample_coord, top_sample_point)
//and the same for the other four corners
//now combine the top two points
top_interpolate = sample_top_left * horizontal_weight + sample_top_right * (1-horizontal_weight)
//now combine the bottom two points
bottom_interpolate = sample_bottom_left * horizontal_weight + sample_bottom_right * (1-horizontal_weight)
//and combine these two last obtained values
smooth_noise(x, y) = top_interpolate * vertical_weight + bottom_interpolate * (1 - vertical_weight)
一些提示:
似乎我的原始pastebin某种程度上已经过期了,所以我无法比较我的无效代码,但是在我当前的游戏中,我经历了一次并将GIMP代码再次转换为Java的方法,现在看来可以正常工作了。
如果有人打算使用此代码,我建议您修改构造函数以修改设置参数(详细信息和大小),以便使其按您希望的方式工作。编辑:我意识到我最初的问题是关于使其可平铺,所以请记住将tilable设置为true!
程式码:http: //pastebin.com/KsfZ99Xa
例:
刚刚浏览了Java和C版本,发现使用noise函数的方式略有不同。这是你的:
int val = Math.abs((int) Math.floor(255.0 * noise(((double)col/(double)width), ((double)row/(double)height))));
C代码:
val = (guchar) floor (255.0 * noise ((col - xoffset) / width,
(row - yoffset) / height));
为什么选择不减去偏移量?(col-xoffset)和(row-yoffset)
就是想。我没有时间对代码进行全面分析。
希望这可以帮助。
我不知道是否有帮助,但是以下技巧对我有效:
http://www.gamedev.net/blog/33/entry-2138456-seamless-noise/
这位同事正在使用4d噪声函数,并简单地提供两个圆的xy值作为4d噪声的xyzw值。结果是完美的循环。
这是1000 * 1000图片的想法(简化):
for(i = 0;i < 1000; i++){
for(j = 0; j < 1000; j++){
nx = cos((i/1000) * 2 * PI);
ny = cos((j/1000) * 2 * PI);
nz = sin((i/1000) * 2 * PI);
nw = sin((j/1000) * 2 * PI);
looped_noise = noise_4D( nx, ny, nz, nw, octaves, persistence, lacunarity, blah...);
noise_buffer[(i*1000)+j] = looped_noise;
}
}
您还应该看看Simplex Noise,它是Ken Perlin开发的,用于解决Perlin noise的一些缺点。
我一直在为C ++游戏实现Simplex Noise。它支持多倍频程1D / 2D / 3D / 4D噪声。目前,唯一的内置纹理是大理石,但是您可以轻松添加更多:
(http://code.google.com/p/battlestar-tux/source/browse/trunk/src/lib/procedural/)