diff options
| author | Patrick Schönberger | 2021-01-22 16:16:32 +0100 |
|---|---|---|
| committer | Patrick Schönberger | 2021-01-22 16:16:32 +0100 |
| commit | 60b7eb713036545e4046a16cfd3d312b8837938c (patch) | |
| tree | 34d88a7616bf0b49db0ac8f42fbc78e3ab1aed87 /Scripts/cloth.js | |
| parent | 9866c25fe964b215e0e491638ee541bdf8d29f56 (diff) | |
| download | cloth_sim-60b7eb713036545e4046a16cfd3d312b8837938c.tar.gz cloth_sim-60b7eb713036545e4046a16cfd3d312b8837938c.zip | |
change material
Diffstat (limited to 'Scripts/cloth.js')
| -rw-r--r-- | Scripts/cloth.js | 86 |
1 files changed, 67 insertions, 19 deletions
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);
|
