let reacts = [], dt = 1, paused = 1; function setup(){ let craftdata = { fix: [ [1, 1, 1], // 0 [1, 1, -1], // 1 [1, -1, 1], // 2 [1, -1, -1], // 3 [-1, 1, 1], // 4 [-1, 1, -1], // 5 [-1, -1, 1], // 6 [-1, -1, -1] // 7 ], edges: [ [0, 1], [0, 2], [0, 4], [1, 3], [1, 5], [2, 3], [2, 6], [3, 7], [4, 5], [4, 6], [5, 7], [6, 7] ], faces: [ [0, 1, 2], [4, 6, 7], ] }; for(let i=0; i<4; ++i){ reacts.push(new Craft()); for(let fix of craftdata.fix) reacts[reacts.length-1].addFixture(fix); for(let edge of craftdata.edges) reacts[reacts.length-1].addEdge(...edge); for(let face of craftdata.faces) reacts[reacts.length-1].addFace(...face); reacts[reacts.length-1].setup(); reacts[reacts.length-1].reactive.anchor.p[1] = -5 reacts[reacts.length-1].applyForce([Math.random()*10-5, 0, Math.random()*10-5], reacts[reacts.length-1].reactive.absolNormal([0, -Math.random()*10-20, 0])); } createCanvas(400, 400, WEBGL); lt = Date.now(); } function draw(){ background(200); scale(10); for(let i=0; i<10; ++i) point(Math.cos(TWO_PI/10*i)*10, 4, Math.sin(TWO_PI/10*i)*10); for(let react of reacts){ if(!paused){ react.applyForce([0, 0, 0], react.reactive.absolNormal([0, 8, 0])); react.collide(1/dt, [0, 4, 0], [[0, 0, 1], [0, 1, 0]]); react.update(1/dt); } push(); applyMatrix(mlookAt(react.reactive.anchor.p,react.reactive.anchor.a)); if(!react.models||!react.models.length) react.models=genCraftModels(react) strokeWeight(5); push(); translate(...react.p_jt[2]); fill(100, 100, 100); noStroke(); model(react.models[0][0]); noFill(); stroke(255, 255, 0); strokeWeight(1); model(react.models[0][1]); pop(); for(let f=0; f