ArtSketch 3d Terrain

Preview image for Sketch 3d Terrain

sketch_3d_terrain.pde

boolean animating = true;
boolean wireframe = false;

int cols, rows;
int scl = 8;
int w = 1600;
int h = 1200;
float xyoffstep;

float flightSpeedPS = 2;
float flying = 0;
float framescl = 0;

float[][] terrain;

void setup() {
  size(600, 600, P3D);
  
  cols = ceil( (w / scl) );
  rows = ceil( (h / scl) );
  
  xyoffstep = 0.05;
  
  terrain = new float[cols][rows];
}

void draw() {
  float delta = ((frameRate / 60.0) / 60.0);
  
  flying -= (flightSpeedPS * delta);
  
  float yoff = flying;
  
  for(int y = 0; y < rows; y++) {
    float xoff = 0;
    
    for(int x = 0; x < cols; x++) {
      terrain[ x ][ y ] = map(noise(xoff, yoff), 0, 1, -100, 100);
      
      xoff += xyoffstep;
    }
    
    yoff += xyoffstep;
  }
  
  background(0);
  
  text("scl = "+ Integer.toString(scl), 15, 15);
  text("xyoffstep = "+ Float.toString(xyoffstep), 15, 30);
  text("xyoffstep/scl  = "+ Float.toString(xyoffstep/scl), 15, 45);
  
  translate(width/2, height/2+50);
  rotateX(PI/3);
  
  
  if(wireframe) {
    stroke(200);
    noFill();
  } else {
    fill(255);
    noStroke();
    //directionalLight(51, 250, 126, 0, 1, 0);
    //pointLight(51, 250, 126, width/2, height/2, 1000);
    
    //
    
    
    // set light
    pushMatrix();
    translate(-width/2, -height/2+50);
    
    float plX = (width / 2);//float plX = (mouseX - (width / 2));
    float plY = height;//float plY = (mouseY - (height / 2));
    float plZ = (200);
    
    translate(plX, plY, plZ);
    stroke(255);
    noFill();
    box(15);
    
    pointLight(51, 250, 126, 0, 0, 0);
    popMatrix();
    
    noStroke();
    fill(255);
    
    
    /*
    // draw dummy boxes
    pushMatrix();
    translate(width/2 - (12 * 10), height/2 - (12 * 5));
    
    stroke(100);
    fill(255);
    
    for(int yy = 0; yy < 10; yy++) {
      for(int xx = 0; xx < 20; xx++) {
        pushMatrix();
        translate((xx * 12), (yy * 12), 0);
        box(10);
        popMatrix();
      }
    }
    popMatrix();
    */
  }
  
  /*
  translate(width/2, height/2+50);
  rotateX(PI/3);
  */
  
  translate((-w / 2), (-h / 2));
  
  for(int y = 0; y < (rows - 1); y++) {
    beginShape(TRIANGLE_STRIP);
    
    for(int x = 0; x < cols; x++) {
      vertex((x * scl), (y * scl), terrain[ x ][ y ]);
      vertex((x * scl), ((y + 1) * scl), terrain[ x ][ (y + 1) ]);
    }
    
    endShape();
  }
  
  if(!animating) {
    noLoop();
  }
  
  if(frameCount == 50) { save("preview.png"); }
}

void mouseClicked() {
  if(mouseButton == LEFT) {
    loop();
  } else if(mouseButton == RIGHT) {
    animating = !animating;
    loop();
  } else if(mouseButton == CENTER) {
    wireframe = !wireframe;
    loop();
  }
}

void mouseWheel(MouseEvent event) {
  float d = event.getCount();
  
  if(d < 0) {
    xyoffstep += 0.01;
  } else if(d > 0) {
    xyoffstep -= 0.01;
  }
}
pyxol © 2023
built with React + Next.js