abouttreesummaryrefslogcommitdiff
path: root/Scripts/cloth.js
diff options
context:
space:
mode:
authorPatrick2021-03-18 13:28:59 +0100
committerPatrick2021-03-18 13:28:59 +0100
commit351f8c1843efc3a49c38f931662d047fd906afea (patch)
tree759cfd841ea877bf72665fa097055cac80c1e0d9 /Scripts/cloth.js
parent44436c7880a40597c7b74151d342ae8092fba499 (diff)
downloadcloth_sim-351f8c1843efc3a49c38f931662d047fd906afea.tar.gz
cloth_sim-351f8c1843efc3a49c38f931662d047fd906afea.zip
rename to match mass spring model
Diffstat (limited to 'Scripts/cloth.js')
-rw-r--r--Scripts/cloth.js74
1 files changed, 37 insertions, 37 deletions
diff --git a/Scripts/cloth.js b/Scripts/cloth.js
index c77fb1c..26a8ffe 100644
--- a/Scripts/cloth.js
+++ b/Scripts/cloth.js
@@ -13,7 +13,7 @@ const options = {
wind: true,
};
-class Constraint {
+class Spring {
constructor(p1, p2, restDist) {
this.p1 = p1;
this.p2 = p2;
@@ -48,7 +48,7 @@ class Constraint {
}
}
-class Particle {
+class Mass {
movableTmp = true;
movable = true;
@@ -99,13 +99,13 @@ class Cloth {
/**
* iterate over the number of vertices in x/y axis
- * and add a new Particle to "particles"
+ * and add a new Particle to "masses"
*/
- this.particles = [];
+ this.masses = [];
for (let y = 0; y < numPointsHeight; y++) {
for (let x = 0; x < numPointsWidth; x++) {
- this.particles.push(
- new Particle(
+ this.masses.push(
+ new Mass(
(x - ((numPointsWidth-1)/2)) * stepWidth,
height - (y + ((numPointsHeight-1)/2)) * stepHeight,
0,
@@ -114,33 +114,33 @@ class Cloth {
}
}
- //this.particles[this.getVertexIndex(0, 0)].movable = false;
+ //this.masses[this.getVertexIndex(0, 0)].movable = false;
const n = 3;
for (let i = 0; i < numPointsHeight; i++)
- this.particles[this.getVertexIndex(0, i)].movable = false;
- //this.particles[this.getVertexIndex(0, numPointsHeight-1)].movable = false;
- //this.particles[this.getVertexIndex(numPointsWidth-1, 0)].movable = false;
+ this.masses[this.getVertexIndex(0, i)].movable = false;
+ //this.masses[this.getVertexIndex(0, numPointsHeight-1)].movable = false;
+ //this.masses[this.getVertexIndex(numPointsWidth-1, 0)].movable = false;
const REST_DIST_X = width / (numPointsWidth-1);
const REST_DIST_Y = height / (numPointsHeight-1);
/**
- * generate constraints (springs)
+ * generate springs (springs)
*/
- this.constraints = [];
+ this.springs = [];
for (let y = 0; y < numPointsHeight; y++) {
for (let x = 0; x < numPointsWidth; x++) {
if (x < numPointsWidth-1) {
- this.constraints.push(new Constraint(
- this.particles[this.getVertexIndex(x, y)],
- this.particles[this.getVertexIndex(x+1, y)],
+ this.springs.push(new Spring(
+ this.masses[this.getVertexIndex(x, y)],
+ this.masses[this.getVertexIndex(x+1, y)],
REST_DIST_X
));
}
if (y < numPointsHeight-1) {
- this.constraints.push(new Constraint(
- this.particles[this.getVertexIndex(x, y)],
- this.particles[this.getVertexIndex(x, y+1)],
+ this.springs.push(new Spring(
+ this.masses[this.getVertexIndex(x, y)],
+ this.masses[this.getVertexIndex(x, y+1)],
REST_DIST_Y
));
}
@@ -154,8 +154,8 @@ class Cloth {
const indices = [];
const uvs = [];
- for (let i in this.particles) {
- let particle = this.particles[i];
+ for (let i in this.masses) {
+ let particle = this.masses[i];
vertices.push(
particle.position.x,
particle.position.y,
@@ -195,8 +195,8 @@ class Cloth {
}
updateGeometry(geometry) {
const positions = geometry.attributes.position.array;
- for (let i in this.particles) {
- let p = this.particles[i];
+ for (let i in this.masses) {
+ let p = this.masses[i];
positions[i*3+0] = p.position.x;
positions[i*3+1] = p.position.y;
positions[i*3+2] = p.position.z;
@@ -207,8 +207,8 @@ class Cloth {
}
simulate(dt) {
let now = performance.now();
- for (let particle of this.particles) {
- let vertex = particle.position;
+ for (let mass of this.masses) {
+ let vertex = mass.position;
let fWind = new THREE.Vector3(
this.windFactor.x * (Math.sin(vertex.x * vertex.y * now)+1),
this.windFactor.y * Math.cos(vertex.z * now),
@@ -216,16 +216,16 @@ class Cloth {
);
// normalize then multiply?
if (options.wind)
- particle.addForce(fWind);
+ mass.addForce(fWind);
// calculate wind with normal?
- particle.addForce(GRAVITY);
+ mass.addForce(GRAVITY);
- particle.verlet(dt);
+ mass.verlet(dt);
}
- for (let constraint of this.constraints) {
+ for (let constraint of this.springs) {
constraint.satisfy();
}
@@ -233,10 +233,10 @@ class Cloth {
}
intersect() {
- for (let i in this.particles) {
- for (let j in this.particles) {
- let p1 = this.particles[i];
- let p2 = this.particles[j];
+ for (let i in this.masses) {
+ for (let j in this.masses) {
+ let p1 = this.masses[i];
+ let p2 = this.masses[j];
p1.movableTmp = true;
p2.movableTmp = true;
@@ -273,13 +273,13 @@ class Cloth {
blow(camPos, intersects) {
let face = intersects[0].face;
let dir = intersects[0].point.clone().sub(camPos).multiplyScalar(100);
- this.particles[face.a].addForce(dir);
- this.particles[face.b].addForce(dir);
- this.particles[face.c].addForce(dir);
+ this.masses[face.a].addForce(dir);
+ this.masses[face.b].addForce(dir);
+ this.masses[face.c].addForce(dir);
}
drag(mousePosWorld, index) {
- let dir = mousePosWorld.clone().sub(this.particles[index].position).multiplyScalar(200);
- this.particles[index].addForce(dir);
+ let dir = mousePosWorld.clone().sub(this.masses[index].position).multiplyScalar(200);
+ this.masses[index].addForce(dir);
}
/**