var settings = QuickSettings.create(0, 110, "Control Panel")
.addButton("Reset Sketch ", function(value) { reset() })
.addButton("Add More Objects ", function(value) { addobj() })
.addButton("Send To Origin ", function(value) { origin() })
.addButton("Change Dest ", function(value) { change() })
.addButton("Zoom In ", function(value) { zoomin() })
.addButton("Zoom Out ", function(value) { zoomout() })
.addButton("Make Small Cubes", function(value) { smallcubes() })
.addButton("Alter Target Sizes ", function(value) { altarget() })
.addButton("Save Screenshot ", function(value) { saver() })
createCanvas(1112, 844, WEBGL);
createRandomBoxes(random(75, 150))
myCamera.setPosition(50, -100, far);
directionalLight(color(150, 100, 0), createVector(-0.8, -0.5, -0.2));
ambientLight(150, 100, 100);
shapes.forEach((x) => drawBox(x))
shapes.forEach((x) => updateBox(x))
save("img_" + month() + '-' + day() + '_' + hour() + '-' + minute() + '-' + second() + ".jpg");
function setupInstructions() {
let instructions = createDiv(`Instructions: <br>
z = Add more objects <br>
c = Send all objects to origin <br>
v = Change target destination of all objects <br>
n = Make all objects small cubes <br>
m = Change target size of all objects <br>
instructions.position(45, 10)
instructions.style("color", "#ffffff");
myCamera = createCamera();
myCamera.setPosition(50, -100, far);
myCamera.lookAt(0, 0, 0);
const createRandomBoxes = (numberOfShapes) => {
for (i = 0; i < numberOfShapes; i++) {
color: random(colourPalette),
pos: randomWorldPosition(),
posTarget: randomWorldPosition(),
boxTarget: randomDimensions(),
rotation: p5.Vector.random3D(),
rotationTarget: p5.Vector.random3D(),
rotationRate: random(0.01, 0.1)
const drawBox = (shape) => {
ambientMaterial(color(shape.color))
rotateX(shape.rotation.x);
rotateY(shape.rotation.y);
rotateZ(shape.rotation.z);
box(shape.box.x, shape.box.y, shape.box.z)
const updateBox = (shape) => {
shape.pos.lerp(shape.posTarget, 0.005)
shape.box.lerp(shape.boxTarget, 0.005)
shape.rotation.lerp(shape.rotationTarget, shape.rotationRate)
const setPosTargetToOrigin = (shape) => {
shape.posTarget = createVector(0, 0, 0)
const setPosTargetToRandomInWorld = (shape) => {
shape.posTarget = randomWorldPosition()
const setPosTargetToRandomOnShell = (shape) => {
shape.posTarget = p5.Vector.random3D().mult(600)
const setBoxTargetToCube = (shape) => {
shape.boxTarget = createVector(50, 50, 50)
const setBoxTargetToRandom = (shape) => {
shape.boxTarget = randomDimensions()
const setRotationTargetToRandom = (shape) => {
shape.rotationTarget = createVector(
random([0, 1, 2, 3]) * PI / 2,
random([0, 1, 2, 3]) * PI / 2,
random([0, 1, 2, 3]) * PI / 2);
function randomDimensions() {
return createVector(random(50, 250), random(50, 250), random(50, 250))
function randomWorldPosition() {
return p5.Vector.random3D().mult(random(300, 2000));
createRandomBoxes(random(75, 150))
function addobj(){ createRandomBoxes(random(10, 50));}
function origin() {shapes.forEach((s) => setPosTargetToOrigin(s))}
function change() {shapes.forEach((s) => setPosTargetToRandomInWorld(s))}
function zoomin() {far -= 100}
function zoomout() {far += 100}
function smallcubes() {shapes.forEach((s) => setBoxTargetToCube(s))}
function altarget() {shapes.boxTarget = randomDimensions();}