diff options
Diffstat (limited to 'Scripts')
| -rw-r--r-- | Scripts/cloth.js | 86 | ||||
| -rw-r--r-- | Scripts/main.js | 9 |
2 files changed, 75 insertions, 20 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);
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
|
