23 let a = this.x - that.x;
\r
24 let b = this.y - that.y;
\r
25 return Math.sqrt(a * a + b * b)
\r
32 constructor(a, b, c, d) {
\r
33 this.indices.push(a);
\r
34 this.indices.push(b);
\r
35 this.indices.push(c);
\r
36 this.indices.push(d);
\r
43 geometry = new THREE.Geometry();
\r
51 getSprings(faceIndex) {
\r
55 static CreateBasic(width, height, numPointsWidth, numPointsHeight) {
\r
59 let stepWidth = width / (numPointsWidth - 1);
\r
60 let stepHeight = height / (numPointsHeight - 1);
\r
62 for (let y = 0; y < numPointsHeight; y++) {
\r
63 for (let x = 0; x < numPointsWidth; x++) {
\r
65 new THREE.Vector3(x * stepWidth, height - y * stepHeight, 0)
\r
70 function getVertexIndex(x, y) {
\r
71 return y * numPointsWidth + x;
\r
74 for (let y = 0; y < numPointsHeight - 1; y++) {
\r
75 for (let x = 0; x < numPointsWidth - 1; x++) {
\r
78 getVertexIndex(x, y),
\r
79 getVertexIndex(x, y + 1),
\r
80 getVertexIndex(x + 1, y),
\r
81 getVertexIndex(x + 1, y + 1),
\r
87 return this.CreateExplicit(vertices, faces);
\r
90 static CreateExplicit(vertices, faces) {
\r
91 let result = new Cloth();
\r
93 for (let i in vertices) {
\r
94 result.geometry.vertices.push(vertices[i]);
\r
95 result.vertexWeights.push(0);
\r
97 for (let i in faces) {
\r
98 let face = faces[i];
\r
100 result.geometry.faces.push(new THREE.Face3(
\r
101 face.a, face.b, face.c
\r
103 result.geometry.faces.push(new THREE.Face3(
\r
104 face.c, face.b, face.d
\r
108 result.geometry.vertices[face.b]
\r
109 .sub(result.geometry.vertices[face.a])
\r
112 result.geometry.vertices[face.c]
\r
113 .sub(result.geometry.vertices[face.a])
\r
115 let weight = xLength * yLength / 2;
\r
118 result.geometry.vertices[face.b]
\r
119 .sub(result.geometry.vertices[face.d])
\r
122 result.geometry.vertices[face.c]
\r
123 .sub(result.geometry.vertices[face.d])
\r
126 weight += xLength * yLength / 2;
\r
128 result.vertexWeights[face.a] += weight / 4;
\r
129 result.vertexWeights[face.b] += weight / 4;
\r
130 result.vertexWeights[face.c] += weight / 4;
\r
131 result.vertexWeights[face.d] += weight / 4;
\r
134 result.geometry.computeBoundingSphere();
\r
140 let mousePos = new Point();
\r
142 const canvasSpace = 200;
\r
144 const scene = new THREE.Scene();
\r
145 const camera = new THREE.PerspectiveCamera(75, window.innerWidth / (window.innerHeight - canvasSpace), 0.1, 1000);
\r
147 const renderer = new THREE.WebGLRenderer();
\r
148 renderer.setSize(window.innerWidth, window.innerHeight - canvasSpace);
\r
149 document.getElementById("threejscontainer").appendChild(renderer.domElement);
\r
151 const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
\r
152 scene.add(directionalLight);
\r
154 let cloth = Cloth.CreateBasic(10, 10, 4, 4);
\r
155 const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
\r
156 const mesh = new THREE.Mesh(cloth.geometry, material);
\r
159 camera.position.y = 5;
\r
160 camera.position.z = 10;
\r
162 function animate(dt) {
\r
163 requestAnimationFrame(animate);
\r
164 renderer.render(scene, camera);
\r
167 let canvas = document.getElementsByTagName("canvas")[0];
\r
168 let resize = function () {
\r
169 w = window.innerWidth;
\r
170 h = window.innerHeight - 200;
\r
174 window.onresize = resize;
\r
176 if (canvas.getContext) {
\r
177 ctx = canvas.getContext('2d');
\r
178 animate(performance.now());
\r
180 canvas.onmousemove = (evt) => {
\r
181 mousePos.x = evt.clientX;
\r
182 mousePos.y = evt.clientY;
\r