]> gitweb.ps.run Git - cloth_sim/blob - Scripts/main.js
fix spring force calculation
[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, 50, 50);\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: 0x0000ff, 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, 100 );\r
71   light1.position.set( 2, 1, 80 );\r
72   scene.add( light1 );\r
73   const light2 = new THREE.PointLight( 0xffffff, 1, 100 );\r
74   light2.position.set( -2, 1, 80 );\r
75   scene.add( light2 );\r
76   const light3 = new THREE.PointLight( 0xffffff, 1, 100 );\r
77   light3.position.set( 0, -1, 80 );\r
78   scene.add( light3 );\r
79   \r
80   let raycaster = new THREE.Raycaster();\r
81 \r
82   /**\r
83    * function called every frame\r
84    * @param {number} dt - time passed since last frame in ms\r
85    */\r
86   function animate(dt) {\r
87     cloth.simulate(dt/1000);\r
88 \r
89     raycaster.setFromCamera( new THREE.Vector2((mousePos.x / w) * 2 - 1, ((h - mousePos.y) / h) * 2 - 1), camera );\r
90 \r
91     const intersects = raycaster.intersectObject( mesh );\r
92 \r
93     if ( intersects.length > 0 ) {\r
94       cloth.wind(intersects);\r
95     }\r
96     setTimeout(() => {\r
97       animate(frameTime);\r
98     }, frameTime);\r
99     renderer.render(scene, camera);\r
100   }\r
101 \r
102 \r
103   /** add callback for window resize */\r
104   let canvas = document.getElementsByTagName("canvas")[0];\r
105   let w = window.innerWidth;\r
106   let h = window.innerHeight - canvasSpace;\r
107   let resize = function () {\r
108     w = window.innerWidth;\r
109     h = window.innerHeight - canvasSpace;\r
110     canvas.width = w;\r
111     canvas.height = h;\r
112   }\r
113   window.onresize = resize;\r
114   resize();\r
115 \r
116   /**\r
117    * if canvas has been successfully initialized\r
118    * start rendering\r
119    */\r
120   if (canvas.getContext) {\r
121     animate(performance.now());\r
122   }\r
123 \r
124   /** add mouse move callback */\r
125   canvas.onmousemove = (evt) => {\r
126     mousePos.x = evt.clientX;\r
127     mousePos.y = evt.clientY;\r
128   };\r
129 }