]> gitweb.ps.run Git - cloth_sim/blob - Scripts/main.js
change material
[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 class Point {\r
13   constructor(x, y) {\r
14     this.x = x;\r
15     this.y = y;\r
16   }\r
17 \r
18   add(that) {\r
19     return new Point(\r
20       this.x + that.x,\r
21       this.y + that.y\r
22     );\r
23   }\r
24 \r
25   sub(that) {\r
26     return new Point(\r
27       this.x - that.x,\r
28       this.y - that.y\r
29     );\r
30   }\r
31 \r
32   dist(that) {\r
33     let a = this.x - that.x;\r
34     let b = this.y - that.y;\r
35     return Math.sqrt(a * a + b * b)\r
36   }\r
37 }\r
38 \r
39 \r
40 /**\r
41  * setup THREE JS Scene, Camera and Renderer\r
42  */\r
43 function setup_scene(canvasSpace) {\r
44   const scene = new THREE.Scene();\r
45   const camera = new THREE.PerspectiveCamera(75, window.innerWidth / (window.innerHeight - canvasSpace), 0.1, 1000);\r
46   const renderer = new THREE.WebGLRenderer();\r
47   /** size canvas to leave some space for UI */\r
48   renderer.setSize(window.innerWidth, window.innerHeight - canvasSpace);\r
49   /** embed canvas in HTML */\r
50   document.getElementById("threejscontainer").appendChild(renderer.domElement);\r
51 \r
52   /** add global light */\r
53   const directionalLight = new THREE.DirectionalLight(0xffffff, 1);\r
54   scene.add(directionalLight);\r
55 \r
56   /** position camera */\r
57   camera.position.y = 5;\r
58   camera.position.z = 10;\r
59 \r
60   return [scene, camera, renderer];\r
61 }\r
62 \r
63 /** call "init" when document is fully loaded */\r
64 document.body.onload = init;\r
65 \r
66 function init() {\r
67   let mousePos = new Point();\r
68   let previousClothSimulation;\r
69   \r
70   /**\r
71    * Space left empty under canvas\r
72    * for UI elements\r
73    */\r
74   const canvasSpace = 200;\r
75 \r
76   /** Constant Frame Time */\r
77   const frameTime = 1000.0 / 60.0;\r
78 \r
79   /** Setup scene */\r
80   let [scene, camera, renderer] = setup_scene(canvasSpace);\r
81   \r
82   /** setup cloth and generate debug mesh */\r
83   let cloth = new Cloth();\r
84   cloth.createBasic(10, 10, 10, 10);\r
85   //cloth.createDebugMesh(scene);\r
86 \r
87   //const material = new THREE.MeshBasicMaterial({ color: 0x0000ff, side: THREE.DoubleSide });\r
88   const material = new THREE.MeshPhongMaterial({ color: 0x0000ff, side: THREE.DoubleSide });\r
89   const mesh = new THREE.Mesh(cloth.geometry, material);\r
90   //const mesh = new THREE.WireframeGeometry(cloth.geometry);\r
91   //const line = new THREE.LineSegments(mesh);\r
92   //line.material.depthTest = false;\r
93   //line.material.opacity = 0.25;\r
94   //line.material.transparent = true;\r
95   scene.add(mesh);\r
96 \r
97   scene.add( new THREE.AmbientLight( 0x666666 ) );\r
98 \r
99   const light = new THREE.DirectionalLight( 0xffffff, 0.5 );\r
100   light.position.set( 0, 1, 0.5 );\r
101   scene.add( light );\r
102 \r
103   /**\r
104    * function called every frame\r
105    * @param {number} dt - time passed since last frame in ms\r
106    */\r
107   function animate(dt) {\r
108     cloth.simulate(dt/1000);\r
109 \r
110     setTimeout(() => {\r
111       animate(frameTime);\r
112     }, frameTime);\r
113     renderer.render(scene, camera);\r
114   }\r
115 \r
116   /** add callback for window resize */\r
117   let canvas = document.getElementsByTagName("canvas")[0];\r
118   let resize = function () {\r
119     let w = window.innerWidth;\r
120     let h = window.innerHeight - 200;\r
121     canvas.width = w;\r
122     canvas.height = h;\r
123   }\r
124   window.onresize = resize;\r
125   resize();\r
126 \r
127   /**\r
128    * if canvas has been successfully initialized\r
129    * start rendering\r
130    */\r
131   if (canvas.getContext) {\r
132     animate(performance.now());\r
133   }\r
134 \r
135   /** add mouse move callback */\r
136   canvas.onmousemove = (evt) => {\r
137     mousePos.x = evt.clientX;\r
138     mousePos.y = evt.clientY;\r
139   };\r
140 }