|
39 | 39 | <script src="../../examples/js/controls/OrbitControls.js"></script> |
40 | 40 |
|
41 | 41 | <script> |
42 | | - |
| 42 | + |
43 | 43 | var gui, scene, camera, renderer, orbit, ambientLight, lights, mesh, bones, skeletonHelper; |
44 | | - |
| 44 | + |
45 | 45 | var state = { |
| 46 | + |
46 | 47 | animateBones : false |
| 48 | + |
47 | 49 | }; |
48 | | - |
| 50 | + |
49 | 51 | function initScene () { |
50 | | - |
| 52 | + |
51 | 53 | gui = new dat.GUI(); |
52 | 54 | scene = new THREE.Scene(); |
53 | | - camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 200 ); |
| 55 | + camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 200 ); |
54 | 56 | camera.position.z = 30; |
55 | 57 | camera.position.y = 30; |
56 | | - |
57 | | - renderer = new THREE.WebGLRenderer({antialias: true}); |
| 58 | + |
| 59 | + renderer = new THREE.WebGLRenderer( { antialias: true } ); |
58 | 60 | renderer.setSize( window.innerWidth, window.innerHeight ); |
59 | 61 | document.body.appendChild( renderer.domElement ); |
60 | | - |
| 62 | + |
61 | 63 | orbit = new THREE.OrbitControls( camera, renderer.domElement ); |
62 | 64 | orbit.noZoom = true; |
63 | 65 |
|
64 | 66 | ambientLight = new THREE.AmbientLight( 0x000000 ); |
65 | 67 | scene.add( ambientLight ); |
66 | 68 |
|
67 | 69 | lights = []; |
68 | | - lights[0] = new THREE.PointLight( 0xffffff, 1, 0 ); |
69 | | - lights[1] = new THREE.PointLight( 0xffffff, 1, 0 ); |
70 | | - lights[2] = new THREE.PointLight( 0xffffff, 1, 0 ); |
71 | | - |
72 | | - lights[0].position.set( 0, 200, 0 ); |
73 | | - lights[1].position.set( 100, 200, 100 ); |
74 | | - lights[2].position.set( -100, -200, -100 ); |
| 70 | + lights[ 0 ] = new THREE.PointLight( 0xffffff, 1, 0 ); |
| 71 | + lights[ 1 ] = new THREE.PointLight( 0xffffff, 1, 0 ); |
| 72 | + lights[ 2 ] = new THREE.PointLight( 0xffffff, 1, 0 ); |
| 73 | + |
| 74 | + lights[ 0 ].position.set( 0, 200, 0 ); |
| 75 | + lights[ 1 ].position.set( 100, 200, 100 ); |
| 76 | + lights[ 2 ].position.set( -100, -200, -100 ); |
| 77 | + |
| 78 | + scene.add( lights[ 0 ] ); |
| 79 | + scene.add( lights[ 1 ] ); |
| 80 | + scene.add( lights[ 2 ] ); |
75 | 81 |
|
76 | | - scene.add( lights[0] ); |
77 | | - scene.add( lights[1] ); |
78 | | - scene.add( lights[2] ); |
79 | | - |
80 | 82 | window.addEventListener( 'resize', function () { |
81 | | - |
| 83 | + |
82 | 84 | camera.aspect = window.innerWidth / window.innerHeight; |
83 | 85 | camera.updateProjectionMatrix(); |
84 | 86 |
|
85 | 87 | renderer.setSize( window.innerWidth, window.innerHeight ); |
86 | | - |
| 88 | + |
87 | 89 | }, false ); |
88 | | - |
| 90 | + |
89 | 91 | initBones(); |
90 | 92 | setupDatGui(); |
| 93 | + |
91 | 94 | } |
92 | 95 |
|
93 | 96 | function createGeometry ( sizing ) { |
94 | | - |
| 97 | + |
95 | 98 | var geometry = new THREE.CylinderGeometry( |
96 | 99 | 5, // radiusTop |
97 | 100 | 5, // radiusBottom |
|
100 | 103 | sizing.segmentCount * 3, // heightSegments |
101 | 104 | true // openEnded |
102 | 105 | ); |
103 | | - |
104 | | - for( var i=0; i < geometry.vertices.length; i++ ) { |
105 | | - |
106 | | - var vertex = geometry.vertices[i]; |
107 | | - var y = (vertex.y + sizing.halfHeight); |
108 | | - |
| 106 | + |
| 107 | + for ( var i = 0; i < geometry.vertices.length; i ++ ) { |
| 108 | + |
| 109 | + var vertex = geometry.vertices[ i ]; |
| 110 | + var y = ( vertex.y + sizing.halfHeight ); |
| 111 | + |
109 | 112 | var skinIndex = Math.floor( y / sizing.segmentHeight ); |
110 | | - var skinWeight = (y % sizing.segmentHeight) / sizing.segmentHeight; |
111 | | - |
112 | | - geometry.skinIndices.push( new THREE.Vector4( skinIndex, skinIndex+1, 0, 0 ) ); |
113 | | - geometry.skinWeights.push( new THREE.Vector4( 1-skinWeight, skinWeight, 0, 0 ) ); |
114 | | - |
| 113 | + var skinWeight = ( y % sizing.segmentHeight ) / sizing.segmentHeight; |
| 114 | + |
| 115 | + geometry.skinIndices.push( new THREE.Vector4( skinIndex, skinIndex + 1, 0, 0 ) ); |
| 116 | + geometry.skinWeights.push( new THREE.Vector4( 1 - skinWeight, skinWeight, 0, 0 ) ); |
| 117 | + |
115 | 118 | } |
116 | | - |
| 119 | + |
117 | 120 | return geometry; |
| 121 | + |
118 | 122 | }; |
119 | | - |
| 123 | + |
120 | 124 | function createBones ( sizing ) { |
121 | | - |
| 125 | + |
122 | 126 | bones = []; |
123 | | - |
| 127 | + |
124 | 128 | var prevBone = new THREE.Bone(); |
125 | 129 | bones.push( prevBone ); |
126 | 130 | prevBone.position.y = -sizing.halfHeight; |
127 | | - |
128 | | - for( var i=0; i < sizing.segmentCount; i++ ) { |
129 | | - |
| 131 | + |
| 132 | + for ( var i = 0; i < sizing.segmentCount; i ++ ) { |
| 133 | + |
130 | 134 | var bone = new THREE.Bone(); |
131 | 135 | bone.position.y = sizing.segmentHeight; |
132 | 136 | bones.push( bone ); |
133 | 137 | prevBone.add( bone ); |
134 | 138 | prevBone = bone; |
135 | | - |
| 139 | + |
136 | 140 | } |
137 | | - |
| 141 | + |
138 | 142 | return bones; |
| 143 | + |
139 | 144 | }; |
140 | 145 |
|
141 | 146 | function createMesh ( geometry, bones ) { |
142 | | - |
143 | | - var material = new THREE.MeshPhongMaterial({ |
| 147 | + |
| 148 | + var material = new THREE.MeshPhongMaterial( { |
144 | 149 | skinning : true, |
145 | 150 | color: 0x156289, |
146 | 151 | emissive: 0x072534, |
147 | 152 | side: THREE.DoubleSide, |
148 | 153 | shading: THREE.FlatShading |
149 | | - }); |
150 | | - |
| 154 | + } ); |
| 155 | + |
151 | 156 | var mesh = new THREE.SkinnedMesh( geometry, material ); |
152 | 157 | var skeleton = new THREE.Skeleton( bones ); |
153 | | - |
154 | | - mesh.add( bones[0] ); |
155 | | - |
| 158 | + |
| 159 | + mesh.add( bones[ 0 ] ); |
| 160 | + |
156 | 161 | mesh.bind( skeleton ); |
157 | 162 | skeleton.calculateInverses(); |
158 | | - |
| 163 | + |
159 | 164 | skeletonHelper = new THREE.SkeletonHelper( mesh ); |
160 | 165 | skeletonHelper.material.linewidth = 2; |
161 | 166 | scene.add( skeletonHelper ); |
162 | | - |
| 167 | + |
163 | 168 | return mesh; |
164 | | - |
| 169 | + |
165 | 170 | }; |
166 | | - |
| 171 | + |
167 | 172 | function setupDatGui () { |
168 | | - |
| 173 | + |
169 | 174 | var folder = gui.addFolder( "General Options" ); |
170 | | - |
| 175 | + |
171 | 176 | folder.add( state, "animateBones" ); |
172 | | - folder.__controllers[0].name("Animate Bones"); |
| 177 | + folder.__controllers[ 0 ].name( "Animate Bones" ); |
173 | 178 |
|
174 | 179 | folder.add( mesh, "pose" ); |
175 | | - folder.__controllers[1].name(".pose()"); |
176 | | - |
| 180 | + folder.__controllers[ 1 ].name( ".pose()" ); |
| 181 | + |
177 | 182 | var bones = mesh.skeleton.bones; |
178 | | - |
179 | | - for( var i=0; i < bones.length; i++ ) { |
180 | | - |
181 | | - var bone = bones[i]; |
182 | | - |
| 183 | + |
| 184 | + for ( var i = 0; i < bones.length; i ++ ) { |
| 185 | + |
| 186 | + var bone = bones[ i ]; |
| 187 | + |
183 | 188 | folder = gui.addFolder( "Bone " + i ); |
184 | | - |
| 189 | + |
185 | 190 | folder.add( bone.position, 'x', -10 + bone.position.x, 10 + bone.position.x ); |
186 | 191 | folder.add( bone.position, 'y', -10 + bone.position.y, 10 + bone.position.y ); |
187 | 192 | folder.add( bone.position, 'z', -10 + bone.position.z, 10 + bone.position.z ); |
188 | 193 |
|
189 | 194 | folder.add( bone.rotation, 'x', -Math.PI * 0.5, Math.PI * 0.5 ); |
190 | 195 | folder.add( bone.rotation, 'y', -Math.PI * 0.5, Math.PI * 0.5 ); |
191 | 196 | folder.add( bone.rotation, 'z', -Math.PI * 0.5, Math.PI * 0.5 ); |
192 | | - |
| 197 | + |
193 | 198 | folder.add( bone.scale, 'x', 0, 2 ); |
194 | 199 | folder.add( bone.scale, 'y', 0, 2 ); |
195 | 200 | folder.add( bone.scale, 'z', 0, 2 ); |
196 | 201 |
|
197 | | - folder.__controllers[0].name("position.x"); |
198 | | - folder.__controllers[1].name("position.y"); |
199 | | - folder.__controllers[2].name("position.z"); |
200 | | - |
201 | | - folder.__controllers[3].name("rotation.x"); |
202 | | - folder.__controllers[4].name("rotation.y"); |
203 | | - folder.__controllers[5].name("rotation.z"); |
204 | | - |
205 | | - folder.__controllers[6].name("scale.x"); |
206 | | - folder.__controllers[7].name("scale.y"); |
207 | | - folder.__controllers[8].name("scale.z"); |
208 | | - |
| 202 | + folder.__controllers[ 0 ].name( "position.x" ); |
| 203 | + folder.__controllers[ 1 ].name( "position.y" ); |
| 204 | + folder.__controllers[ 2 ].name( "position.z" ); |
| 205 | + |
| 206 | + folder.__controllers[ 3 ].name( "rotation.x" ); |
| 207 | + folder.__controllers[ 4 ].name( "rotation.y" ); |
| 208 | + folder.__controllers[ 5 ].name( "rotation.z" ); |
| 209 | + |
| 210 | + folder.__controllers[ 6 ].name( "scale.x" ); |
| 211 | + folder.__controllers[ 7 ].name( "scale.y" ); |
| 212 | + folder.__controllers[ 8 ].name( "scale.z" ); |
| 213 | + |
209 | 214 | } |
210 | | - |
| 215 | + |
211 | 216 | } |
212 | 217 |
|
213 | 218 | function initBones () { |
214 | | - |
| 219 | + |
215 | 220 | var segmentHeight = 8; |
216 | 221 | var segmentCount = 4; |
217 | 222 | var height = segmentHeight * segmentCount; |
218 | 223 | var halfHeight = height * 0.5; |
219 | | - |
| 224 | + |
220 | 225 | var sizing = { |
221 | 226 | segmentHeight : segmentHeight, |
222 | 227 | segmentCount : segmentCount, |
223 | 228 | height : height, |
224 | 229 | halfHeight : halfHeight |
225 | 230 | }; |
226 | | - |
| 231 | + |
227 | 232 | var geometry = createGeometry( sizing ); |
228 | 233 | var bones = createBones( sizing ); |
229 | 234 | mesh = createMesh( geometry, bones ); |
230 | | - |
| 235 | + |
231 | 236 | mesh.scale.multiplyScalar( 1 ); |
232 | 237 | scene.add( mesh ); |
233 | | - |
| 238 | + |
234 | 239 | }; |
235 | | - |
| 240 | + |
236 | 241 | function render () { |
237 | | - |
| 242 | + |
238 | 243 | requestAnimationFrame( render ); |
239 | 244 |
|
240 | 245 | var time = Date.now() * 0.001; |
241 | | - |
| 246 | + |
242 | 247 | var bone = mesh; |
243 | 248 |
|
244 | | - |
| 249 | + |
245 | 250 | //Wiggle the bones |
246 | | - if( state.animateBones ) { |
247 | | - |
248 | | - for( var i=0; i < mesh.skeleton.bones.length; i++ ) { |
249 | | - |
250 | | - mesh.skeleton.bones[i].rotation.z = Math.sin( time ) * 2 / mesh.skeleton.bones.length; |
251 | | - |
| 251 | + if ( state.animateBones ) { |
| 252 | + |
| 253 | + for ( var i = 0; i < mesh.skeleton.bones.length; i ++ ) { |
| 254 | + |
| 255 | + mesh.skeleton.bones[ i ].rotation.z = Math.sin( time ) * 2 / mesh.skeleton.bones.length; |
| 256 | + |
252 | 257 | } |
253 | | - |
| 258 | + |
254 | 259 | } |
255 | 260 |
|
256 | 261 | skeletonHelper.update(); |
257 | | - |
| 262 | + |
258 | 263 | renderer.render( scene, camera ); |
259 | | - |
| 264 | + |
260 | 265 | }; |
261 | | - |
| 266 | + |
262 | 267 | initScene(); |
263 | 268 | render(); |
264 | 269 |
|
|
0 commit comments