Я пытаюсь мою попытку Перлин шума (3-мерным), как указано в этом документе: http://lodev.org/cgtutor/randomnoise.htmlПерлин шума Попытка
Однако, это то, что я получаю. Похоже, что сглаживание не работает. Вы можете видеть блоки размером с параметром «размер». Может кто-то указать, что я делаю неправильно?
Вот мой код:
%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()' as 'z' координат?Очевидно, что вы хотите создать облачную анимацию, но 'clock' может давать разные значения' z' для каждого прогона внутреннего цикла, что означает, что вы выполняете интерполяцию на разных кадрах анимации. Если «для каждой плитки» означает «для каждого« z », просто перечислите возможные значения« z ». –
Это очень верно, но даже если я полностью выхожу из уравнения, я до сих пор получаю эти блочные результаты. Я зацикливал z на петлю, чтобы получить истинный трехмерный шум, но для отладки я взял его и превратил в двумерный цикл. Поэтому я не думаю, что причина является причиной проблемы. – Rich95
Итак, результат является блочным даже для 2d-шума? –