【发布时间】:2016-05-05 04:43:04
【问题描述】:
我正在尝试本文档中概述的 Perlin Noise(3 维):http://lodev.org/cgtutor/randomnoise.html
但是,这就是我得到的。 看起来平滑不起作用。你可以看到'size'参数的块大小。有人能指出我做错了什么吗?
这是我的代码:
%ffp
ctl(1):standard,"Size",range=(1,256), pos=(300,20), size=(120,*),val=64,track, action=preview
onFilterStart:
{
allocArray(9,64,64,64,4); // Array for noise depth
for(int z = 0; z < 64; z++)
for(int y = 0; y < 64; y++)
for(int x = 0; x < 64; x++) {
fputArray(9,x,y,z,(float)(rand() % 32768) / 32768.0);
}
return false;
}
forEveryTile:
{
double fractX,fractY,fractZ,xx,yy,zz;
int x1,y1,z1,x2,y2,z2,col;
double value = 0.0, value2 = 0.0, size, isize=(float)ctl(1);
// int X=screen Width, int Y=screen Height
for(int y = 0; y < Y; y++) {
for(int x = 0; x < X; x++) {
//for(int z = 0; z < 64; z++) {
value2 = 0.0;
size = isize;
while (size >=1.0) {
xx=(float)x/size;
yy=(float)y/size;
zz=(float)clock()/size;
fractX = xx - (int)(xx);
fractY = yy - (int)(yy);
fractZ = zz - (int)(zz);
x1 = ((int)(xx) + 64) % 64;
y1 = ((int)(yy) + 64) % 64;
z1 = ((int)(zz) + 64) % 64;
x2 = (x1 + 64- 1) % 64;
y2 = (y1 + 64- 1) % 64;
z2 = (z1 + 64- 1) % 64;
value=0.0;
value += fractX * fractY * fractZ * fgetArray(9,z1,y1,x1);
value += fractX * (1 - fractY) * fractZ * fgetArray(9,z1,y2,x1);
value += (1 - fractX) * fractY * fractZ * fgetArray(9,z1,y1,x2);
value += (1 - fractX) * (1 - fractY) * fractZ * fgetArray(9,z1,y2,x2);
value += fractX * fractY * (1 - fractZ) * fgetArray(9,z2,y1,x1);
value += fractX * (1 - fractY) * (1 - fractZ) * fgetArray(9,z2,y2,x1);
value += (1 - fractX) * fractY * (1 - fractZ) * fgetArray(9,z2,y1,x2);
value += (1 - fractX) * (1 - fractY) * (1 - fractZ) * fgetArray(9,z2,y2,x2);
value2 += value*size;
size /= 2.0;
}
col=(int)((float)(128.0 * value2 / isize));
col=max(min(col,255),0);
psetp(x,y,RGB(col,col,col));
//} //z
} //x
} //y
return true;
}
【问题讨论】:
-
使用
clock()作为z坐标的动机是什么?显然您想创建一个云动画,但clock可能会为内部循环的每次运行产生不同的z值,这意味着您正在对不同的动画帧进行插值。如果“for each tile”的意思是“for eachz”,只需枚举可能的z值。 -
确实如此,但即使我将 z 完全排除在等式之外,我仍然会得到这些块状的结果。我也在循环中循环 z 以获得真正的 3 维噪声,但为了调试,我将其取出并使其成为 2 维循环。所以我不认为 z 是问题的原因。
-
所以即使是 2d 噪声,结果也是块状的?
-
即使我为 z 分配了一个像 64 这样的静态值,结果仍然是块状的,这让我相信这不是 z 循环的问题。但我可能是错的。如有需要,我可以发布图片。
标签: c graphics perlin-noise