]> gitweb.ps.run Git - cloth_sim/blob - Scripts/main.js
Wind Force added, Cloth dragging added, fix vertex normals and change lighting
[cloth_sim] / Scripts / main.js
1 import { Face, Spring, Cloth } from './cloth.js';\r
2 \r
3 \r
4 /**\r
5  * rendering\r
6  * Einheiten konsistent\r
7  * Wind\r
8  * evtl. an Stoff ziehen\r
9  */\r
10 \r
11 /**\r
12  * setup THREE JS Scene, Camera and Renderer\r
13  */\r
14 function setup_scene(canvasSpace) {\r
15   const scene = new THREE.Scene();\r
16   const camera = new THREE.PerspectiveCamera(75, window.innerWidth / (window.innerHeight - canvasSpace), 0.1, 1000);\r
17   const renderer = new THREE.WebGLRenderer();\r
18   /** size canvas to leave some space for UI */\r
19   renderer.setSize(window.innerWidth, window.innerHeight - canvasSpace);\r
20   /** embed canvas in HTML */\r
21   document.getElementById("threejscontainer").appendChild(renderer.domElement);\r
22 \r
23   /** add global light */\r
24   const directionalLight = new THREE.DirectionalLight(0xffffff, 1);\r
25   scene.add(directionalLight);\r
26 \r
27   /** position camera */\r
28   camera.position.y = 5;\r
29   camera.position.z = 10;\r
30 \r
31   return [scene, camera, renderer];\r
32 }\r
33 \r
34 /** call "init" when document is fully loaded */\r
35 document.body.onload = init;\r
36 \r
37 function init() {\r
38   let mousePos = new THREE.Vector2();\r
39   let previousClothSimulation;\r
40   \r
41   /**\r
42    * Space left empty under canvas\r
43    * for UI elements\r
44    */\r
45   const canvasSpace = 200;\r
46 \r
47   /** Constant Frame Time */\r
48   const frameTime = 1000.0 / 60.0;\r
49 \r
50   /** Setup scene */\r
51   let [scene, camera, renderer] = setup_scene(canvasSpace);\r
52   \r
53   /** setup cloth and generate debug mesh */\r
54   let cloth = new Cloth();\r
55   cloth.createBasic(10, 10, 10, 10);\r
56   //cloth.createDebugMesh(scene);\r
57 \r
58   //const material = new THREE.MeshBasicMaterial({ color: 0x0000ff, side: THREE.DoubleSide });\r
59   const material = new THREE.MeshStandardMaterial({ color: 0xC70039, side: THREE.DoubleSide, flatShading: false });\r
60   const mesh = new THREE.Mesh(cloth.geometry, material);\r
61   //const mesh = new THREE.WireframeGeometry(cloth.geometry);\r
62   //const line = new THREE.LineSegments(mesh);\r
63   //line.material.depthTest = false;\r
64   //line.material.opacity = 0.25;\r
65   //line.material.transparent = true;\r
66   scene.add(mesh);\r
67 \r
68   scene.add( new THREE.AmbientLight( 0x222222 ) );\r
69 \r
70   const light1 = new THREE.PointLight( 0xffffff, 1, 50 );\r
71   light1.position.set( 15, 1, 40 );\r
72   scene.add( light1 );\r
73   const light2 = new THREE.PointLight( 0xffffff, 1, 50 );\r
74   light2.position.set( -15, 0, 40 );\r
75   scene.add( light2 );\r
76   const light3 = new THREE.PointLight( 0xffffff, 1, 50 );\r
77   light3.position.set( 0, -1, 40 );\r
78   scene.add( light3 );\r
79   \r
80   let raycaster = new THREE.Raycaster();\r
81   let intersects;\r
82   let rightMousePressed;\r
83   /**\r
84    * function called every frame\r
85    * @param {number} dt - time passed since last frame in ms\r
86    */\r
87   function animate(dt) {\r
88     cloth.simulate(dt/1000);\r
89 \r
90     raycaster.setFromCamera( new THREE.Vector2((mousePos.x / w) * 2 - 1, ((h - mousePos.y) / h) * 2 - 1), camera );\r
91 \r
92     intersects = raycaster.intersectObject( mesh );\r
93 \r
94     if ( intersects.length > 0 ) {\r
95       cloth.wind(intersects);\r
96     }\r
97     setTimeout(() => {\r
98       animate(frameTime);\r
99     }, frameTime);\r
100     renderer.render(scene, camera);\r
101   }\r
102 \r
103 \r
104   /** add callback for window resize */\r
105   let canvas = document.getElementsByTagName("canvas")[0];\r
106   let w = window.innerWidth;\r
107   let h = window.innerHeight - canvasSpace;\r
108   let resize = function () {\r
109     w = window.innerWidth;\r
110     h = window.innerHeight - canvasSpace;\r
111     canvas.width = w;\r
112     canvas.height = h;\r
113   }\r
114   window.onresize = resize;\r
115   resize();\r
116 \r
117   /**\r
118    * if canvas has been successfully initialized\r
119    * start rendering\r
120    */\r
121   if (canvas.getContext) {\r
122     animate(performance.now());\r
123   }\r
124 \r
125   \r
126 \r
127   /** add mouse move callback */\r
128   canvas.onmousemove = (evt) => {\r
129     mousePos.x = evt.clientX;\r
130     mousePos.y = evt.clientY;\r
131 \r
132     var vec = new THREE.Vector3(); // create once and reuse\r
133     var pos = new THREE.Vector3(); // create once and reuse\r
134 \r
135     vec.set(\r
136       ( evt.clientX / window.innerWidth ) * 2 - 1,\r
137     - ( evt.clientY / window.innerHeight ) * 2 + 1,\r
138       0.5 );\r
139 \r
140     vec.unproject( camera );\r
141 \r
142     vec.sub( camera.position ).normalize();\r
143 \r
144     var distance = - camera.position.z / vec.z;\r
145 \r
146     pos.copy( camera.position ).add( vec.multiplyScalar( distance ) );\r
147 \r
148     cloth.mouseMove(pos);\r
149   };\r
150 \r
151   canvas.onmousedown = (evt) => {\r
152     if(intersects.length > 0){\r
153       cloth.mousePress(intersects);\r
154     }\r
155   }\r
156   \r
157   canvas.onmouseup = (evt) => {\r
158     cloth.mouseRelease();\r
159   }\r
160 }