I began working on creating a dynamic, 3D terrain that continuously morphs over time. I used WebGL for 3D rendering.
let terrain;
let cols, rows;
let w = 20;
let flying = 0;
function setup() {
createCanvas(windowWidth, windowHeight, WEBGL);
cols = floor(width / w);
rows = floor(height / w);
terrain = new Terrain(cols, rows);
// Set the camera position and orientation
let camX = width / 2;
let camY = height / 2; // Adjust this value for the desired side view
let camZ = (height / 2) / tan(PI / 6); // Adjust this value for the desired zoom
camera(camX, camY, camZ, 0, 0, 0, 0, 1, 0);
}
function draw() {
background(0);
// Center the sketch on the canvas
translate(-width / 2, -height / 2);
terrain.update();
terrain.display();
flying -= 0.05;
}
class Terrain {
constructor(cols, rows) {
this.cols = cols;
this.rows = rows;
this.w = w;
this.terrain = [];
}
update() {
let yoff = flying;
for (let y = 0; y < this.rows; y++) {
let xoff = 0;
this.terrain[y] = [];
for (let x = 0; x < this.cols; x++) {
this.terrain[y][x] = map(noise(xoff, yoff), 0, 1, -100, 100);
xoff += 0.2;
}
yoff += 0.2;
}
}
display() {
stroke(255);
noFill();
for (let y = 0; y < this.rows - 1; y++) {
beginShape(TRIANGLE_STRIP);
for (let x = 0; x < this.cols; x++) {
vertex(x * this.w, y * this.w, this.terrain[y][x]);
vertex(x * this.w, (y + 1) * this.w, this.terrain[y + 1][x]);
}
endShape();
}
}
}
The Terrain class is the core of our terrain generation. It contains methods for updating and displaying the terrain. I want to work on making it aesthetic itself more blocky, since my inspiration for this project is minecraft and I want to replicate its look. I also want to change the colors of the lines depending on their depth, so I can represent land and water.