X-Git-Url: https://gitweb.ps.run/cloth_sim/blobdiff_plain/9866c25fe964b215e0e491638ee541bdf8d29f56..60b7eb713036545e4046a16cfd3d312b8837938c:/Scripts/cloth.js 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);