floating objects on water
@author
PVector stepSize = new PVector(30, 40);
PVector rectSize = new PVector(20, 30);
float maxZ = 200;
PVector noiseOffset;
float noiseScale = 0.003;
float timeScale = 0.007;
void setup(){
size(640, 640, P3D);
noStroke();
fill(0, 255, 255);
rectMode(CENTER);
noiseOffset = new PVector(random(10000), random(10000), random(10000));
}
void draw(){
background(255);
float t = frameCount * timeScale;
for(float w = 2 * stepSize.x; w <= width - 2 * stepSize.x; w += stepSize.x){
for(float h = 2 * stepSize.y; h <= height - 2 * stepSize.y; h += stepSize.y){
pushMatrix();
float z = map(noise(w * noiseScale + noiseOffset.x + t, h * noiseScale + noiseOffset.y + t, t + noiseOffset.z), 0, 1, -maxZ, maxZ);
translate(w, h, z);
float pxz = map(noise((w - stepSize.x) * noiseScale + noiseOffset.x + t, h * noiseScale + noiseOffset.y + t, t + noiseOffset.z), 0, 1, -maxZ, maxZ);
float nxz = map(noise((w + stepSize.x) * noiseScale + noiseOffset.x + t, h * noiseScale + noiseOffset.y + t, t + noiseOffset.z), 0, 1, -maxZ, maxZ);
float radianY = (atan2(pxz - z, stepSize.x) + atan2(z - nxz, stepSize.x)) / 2.0;
rotateY(radianY);
float pyz = map(noise(w * noiseScale + noiseOffset.x + t, (h - stepSize.y) * noiseScale + noiseOffset.y + t, t + noiseOffset.z), 0, 1, -maxZ, maxZ);
float nyz = map(noise(w * noiseScale + noiseOffset.x + t, (h + stepSize.y) * noiseScale + noiseOffset.y + t, t + noiseOffset.z), 0, 1, -maxZ, maxZ);
float radianX = (atan2(z - pyz, stepSize.y) + atan2(nyz - z, stepSize.y)) / 2.0;
rotateX(radianX);
rect(0, 0, rectSize.x, rectSize.y);
popMatrix();
}
}
}