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