From: Patrick Schönberger Date: Fri, 22 Jan 2021 15:16:32 +0000 (+0100) Subject: change material X-Git-Url: https://gitweb.ps.run/cloth_sim/commitdiff_plain/60b7eb713036545e4046a16cfd3d312b8837938c change material --- diff --git a/Scripts/cloth.js b/Scripts/cloth.js index f1ac682..038b235 100644 --- a/Scripts/cloth.js +++ b/Scripts/cloth.js @@ -156,12 +156,12 @@ export class Cloth { getVertexIndex(x + 1, y + 1), ); - newFace.springs.push(new Spring(vertices, getVertexIndex(x, y), getVertexIndex(x + 1, y))); - newFace.springs.push(new Spring(vertices, getVertexIndex(x, y), getVertexIndex(x, y + 1))); - newFace.springs.push(new Spring(vertices, getVertexIndex(x, y), getVertexIndex(x + 1, y + 1))); - newFace.springs.push(new Spring(vertices, getVertexIndex(x + 1, y), getVertexIndex(x, y + 1))); - newFace.springs.push(new Spring(vertices, getVertexIndex(x + 1, y), getVertexIndex(x + 1, y + 1))); - newFace.springs.push(new Spring(vertices, getVertexIndex(x, y + 1), getVertexIndex(x + 1, y + 1))); + newFace.springs.push(new Spring(vertices, getVertexIndex(x, y), getVertexIndex(x + 1, y))); // oben + newFace.springs.push(new Spring(vertices, getVertexIndex(x, y), getVertexIndex(x, y + 1))); // links + newFace.springs.push(new Spring(vertices, getVertexIndex(x, y), getVertexIndex(x + 1, y + 1))); // oben links -> unten rechts diagonal + newFace.springs.push(new Spring(vertices, getVertexIndex(x + 1, y), getVertexIndex(x, y + 1))); // oben rechts -> unten links diagonal + newFace.springs.push(new Spring(vertices, getVertexIndex(x + 1, y), getVertexIndex(x + 1, y + 1))); // rechts + newFace.springs.push(new Spring(vertices, getVertexIndex(x, y + 1), getVertexIndex(x + 1, y + 1))); // unten faces.push(newFace); } @@ -247,6 +247,7 @@ export class Cloth { * needed for View Frustum Culling internally */ this.geometry.computeBoundingSphere(); + this.geometry.computeFaceNormals(); } /** @@ -350,6 +351,7 @@ export class Cloth { this.geometry.verticesNeedUpdate = true; this.geometry.elementsNeedUpdate = true; this.geometry.computeBoundingSphere(); + this.geometry.computeFaceNormals(); } @@ -401,23 +403,69 @@ getAcceleration(vertexIndex, dt) { // Get the bounding springs and add them to the needed springs // TODO: optimize - for (let i in this.faces) { - if (this.faces[i].a == vertexIndex || this.faces[i].b == vertexIndex || this.faces[i].c == vertexIndex || this.faces[i].d == vertexIndex) { - for (let j in this.faces[i].springs) { - if (this.faces[i].springs[j].index1 == vertexIndex || this.faces[i].springs[j].index2 == vertexIndex) { - let spring = this.faces[i].springs[j]; - let springDirection = spring.getDirection(this.geometry.vertices); + const numPointsX = 10; + const numPointsY = 10; + const numFacesX = numPointsX - 1; + const numFacesY = numPointsY - 1; + function getFaceIndex(x, y) { + return y * numFacesX + x; + } - if (this.faces[i].springs[j].index1 == vertexIndex) - springDirection.multiplyScalar(-1); - - springSum.add(springDirection.multiplyScalar(k * (spring.restLength - spring.currentLength))); + let indexX = vertexIndex % numPointsX; + let indexY = Math.floor(vertexIndex / numPointsX); + + let springs = []; + + // 0 oben + // 1 links + // 2 oben links -> unten rechts diagonal + // 3 oben rechts -> unten links diagonal + // 4 rechts + // 5 unten + + let ul = indexX > 0 && indexY < numPointsY - 1; + let ur = indexX < numPointsX - 1 && indexY < numPointsY - 1; + let ol = indexX > 0 && indexY > 0; + let or = indexX < numPointsX - 1 && indexY > 0; + + if (ul) { + let faceUL = this.faces[getFaceIndex(indexX - 1, indexY)]; + springs.push(faceUL.springs[3]); + if (!ol) + springs.push(faceUL.springs[0]); + springs.push(faceUL.springs[4]); + } + if (ur) { + let faceUR = this.faces[getFaceIndex(indexX, indexY)]; + springs.push(faceUR.springs[2]); + if (!or) + springs.push(faceUR.springs[0]); + if (!ul) + springs.push(faceUR.springs[1]); + } + if (ol) { + let faceOL = this.faces[getFaceIndex(indexX - 1, indexY - 1)]; + springs.push(faceOL.springs[2]); + springs.push(faceOL.springs[4]); + springs.push(faceOL.springs[5]); + } + if (or) { + let faceOR = this.faces[getFaceIndex(indexX , indexY - 1)]; + springs.push(faceOR.springs[3]); + if (!ol) + springs.push(faceOR.springs[1]); + springs.push(faceOR.springs[5]); + } - } - } - } + for (let spring of springs) { + let springDirection = spring.getDirection(this.geometry.vertices); + + if (spring.index1 == vertexIndex) + springDirection.multiplyScalar(-1); + + springSum.add(springDirection.multiplyScalar(k * (spring.restLength - spring.currentLength))); } let result = new THREE.Vector3(1, 1, 1); diff --git a/Scripts/main.js b/Scripts/main.js index 8c61f82..4e7c2ef 100644 --- a/Scripts/main.js +++ b/Scripts/main.js @@ -84,7 +84,8 @@ function init() { cloth.createBasic(10, 10, 10, 10); //cloth.createDebugMesh(scene); - const material = new THREE.MeshBasicMaterial({ color: 0x0000ff }); + //const material = new THREE.MeshBasicMaterial({ color: 0x0000ff, side: THREE.DoubleSide }); + const material = new THREE.MeshPhongMaterial({ color: 0x0000ff, side: THREE.DoubleSide }); const mesh = new THREE.Mesh(cloth.geometry, material); //const mesh = new THREE.WireframeGeometry(cloth.geometry); //const line = new THREE.LineSegments(mesh); @@ -93,6 +94,12 @@ function init() { //line.material.transparent = true; scene.add(mesh); + scene.add( new THREE.AmbientLight( 0x666666 ) ); + + const light = new THREE.DirectionalLight( 0xffffff, 0.5 ); + light.position.set( 0, 1, 0.5 ); + scene.add( light ); + /** * function called every frame * @param {number} dt - time passed since last frame in ms