xxxxxxxxxx
127
let vertexes = []
let edges = []
let count = 500
let depth = 500
let c = 10
let f = 10
function createBox(x, y, z, h, w) {
let i = vertexes.length
let h2 = h / 2
let w2 = w / 2
let points = [
[-w2, -h2, 0],
[w2, -h2, 0],
[w2, h2, 0],
[-w2, h2, 0],
]
rotate3D(2.5*random(-1,1), -0.5*random(-1,1), -0.3*random(-1,1), points)
points.forEach(p => {
p[0] += x
p[1] += y
p[2] += z
})
vertexes.push(points)
edges.push([i, i + 1], [i + 1, i + 2], [i + 2, i + 3], [i + 3, i])
}
function rotate3D(pitch, roll, yaw, points) {
var cosa = Math.cos(yaw);
var sina = Math.sin(yaw);
var cosb = Math.cos(pitch);
var sinb = Math.sin(pitch);
var cosc = Math.cos(roll);
var sinc = Math.sin(roll);
var Axx = cosa * cosb;
var Axy = cosa * sinb * sinc - sina * cosc;
var Axz = cosa * sinb * cosc + sina * sinc;
var Ayx = sina * cosb;
var Ayy = sina * sinb * sinc + cosa * cosc;
var Ayz = sina * sinb * cosc - cosa * sinc;
var Azx = -sinb;
var Azy = cosb * sinc;
var Azz = cosb * cosc;
for (const point of points) {
var px = point[0]
var py = point[1]
var pz = point[2]
point[0] = Axx * px + Axy * py + Axz * pz;
point[1] = Ayx * px + Ayy * py + Ayz * pz;
point[2].z = Azx * px + Azy * py + Azz * pz;
}
}
function setup() {
createCanvas(400, 400);
background(0)
stroke(255, 255, 255, 10)
vertexes = []
edges = []
for (let j = 0; j < 30; j += 1) {
const bx = random(-10, 300)
const by = random(-10, 300)
const bz = random(-50, -10)
const min = random(5, 10)
const max = random(min + 10, 50)
const aspect = random(0.2, 2)
const sx = random(-20, 30)
const sy = random(-20, 30)
for (let i = 0; i < 10; i += 1) {
const w = random(min, max)
createBox(bx + i * sx, by + i * sy, bz + i * 5, w, w * aspect * cos(i/10))
}
}
}
function draw() {
plot()
noLoop()
}
function distance(a, b) {
return sqrt(pow(a[0] - b[0], 2) + pow(a[1] - b[1], 2) + pow(a[2] - b[2], 2))
}
function lerp3D(a, b, t) {
return [
lerp(a[0], b[0], t),
lerp(a[1], b[1], t),
lerp(a[2], b[2], t),
]
}
function randomSphere(r) {
const rad = random(TAU)
const l = random(r)
return [cos(rad) * l, sin(rad) * l]
}
function plot() {
for (let [ia, ib] of edges) {
const a = vertexes[ia]
const b = vertexes[ib]
const len = distance(a, b) * 15
for (let i = 0; i < len; i++) {
const n = lerp3D(a, b, random())
const d = abs(n[2] - c)
stroke(255, 255, 255, (1 - min(d / depth, 1) * 5) * 20)
const r = 0.25 * pow(abs(f - d), 0.9)
const [x, y] = randomSphere(r)
rect(x + n[0], y + n[1], 0.01, 0.01)
}
}
}