function init() { class Point { constructor(x, y) { this.x = x; this.y = y; } add(that) { return new Point( this.x + that.x, this.y + that.y ); } sub(that) { return new Point( this.x - that.x, this.y - that.y ); } dist(that) { let a = this.x - that.x; let b = this.y - that.y; return Math.sqrt(a * a + b * b) } } class Cloth { geometry = new THREE.Geometry(); static CreateBasic(width, height, numPointsWidth, numPointsHeight) { let vertices = []; let faces = []; let stepWidth = width / (numPointsWidth - 1); let stepHeight = height / (numPointsHeight - 1); for (let y = 0; y < numPointsHeight; y++) { for (let x = 0; x < numPointsWidth; x++) { vertices.push( new THREE.Vector3(x * stepWidth, height - y * stepHeight, 0) ); } } function getVertexIndex(x, y) { return y * numPointsWidth + x; } for (let y = 0; y < numPointsHeight - 1; y++) { for (let x = 0; x < numPointsWidth - 1; x++) { faces.push( new THREE.Face3( getVertexIndex(x, y), getVertexIndex(x, y + 1), getVertexIndex(x + 1, y), ) ); faces.push( new THREE.Face3( getVertexIndex(x + 1, y), getVertexIndex(x, y + 1), getVertexIndex(x + 1, y + 1), ) ); } } return this.CreateExplicit(vertices, faces); } static CreateExplicit(vertices, faces) { let result = new Cloth(); for (let i in vertices) { result.geometry.vertices.push(vertices[i]); } for (let i in faces) { result.geometry.faces.push(faces[i]); } result.geometry.computeBoundingSphere(); return result; } } let mousePos = new Point(); const canvasSpace = 200; const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(75, window.innerWidth / (window.innerHeight - canvasSpace), 0.1, 1000); const renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight - canvasSpace); document.getElementById("threejscontainer").appendChild(renderer.domElement); const directionalLight = new THREE.DirectionalLight(0xffffff, 1); scene.add(directionalLight); let cloth = Cloth.CreateBasic(10, 10, 4, 4); const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); const mesh = new THREE.Mesh(cloth.geometry, material); scene.add(mesh); camera.position.y = 5; camera.position.z = 10; function animate(dt) { requestAnimationFrame(animate); renderer.render(scene, camera); } let canvas = document.getElementsByTagName("canvas")[0]; let resize = function () { w = window.innerWidth; h = window.innerHeight - 200; canvas.width = w; canvas.height = h; } window.onresize = resize; resize(); if (canvas.getContext) { ctx = canvas.getContext('2d'); animate(performance.now()); } canvas.onmousemove = (evt) => { mousePos.x = evt.clientX; mousePos.y = evt.clientY; }; }