Advertisement
Guest User

Untitled

a guest
Dec 3rd, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.45 KB | None | 0 0
  1. console.clear();
  2.  
  3. var gui, scene, camera, renderer, orbit, lights, mesh, bones, skeletonHelper;
  4.  
  5. var state = {
  6.  
  7. animateBones : true
  8.  
  9. };
  10.  
  11. function initScene () {
  12.  
  13. //gui = new dat.GUI();
  14. scene = new THREE.Scene();
  15. camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 200 );
  16. camera.position.z = 30;
  17. camera.position.y = 30;
  18.  
  19. renderer = new THREE.WebGLRenderer( { antialias: true } );
  20. renderer.setPixelRatio( window.devicePixelRatio );
  21. renderer.setSize( window.innerWidth, window.innerHeight );
  22. renderer.setClearColor( 0x000000, 1 );
  23. document.body.appendChild( renderer.domElement );
  24.  
  25. orbit = new THREE.OrbitControls( camera, renderer.domElement );
  26. orbit.enableZoom = false;
  27.  
  28. lights = [];
  29. lights[ 0 ] = new THREE.PointLight( 0xffffff, 1, 0 );
  30. lights[ 1 ] = new THREE.PointLight( 0xffffff, 1, 0 );
  31. lights[ 2 ] = new THREE.PointLight( 0xffffff, 1, 0 );
  32.  
  33. lights[ 0 ].position.set( 0, 200, 0 );
  34. lights[ 1 ].position.set( 100, 200, 100 );
  35. lights[ 2 ].position.set( - 100, - 200, - 100 );
  36.  
  37. scene.add( lights[ 0 ] );
  38. scene.add( lights[ 1 ] );
  39. scene.add( lights[ 2 ] );
  40.  
  41. window.addEventListener( 'resize', function () {
  42. camera.aspect = window.innerWidth / window.innerHeight;
  43. camera.updateProjectionMatrix();
  44. renderer.setSize( window.innerWidth, window.innerHeight );
  45. }, false );
  46.  
  47. initHairs();
  48. }
  49.  
  50. function createGeometry ( sizing ) {
  51.  
  52. var geometry = new THREE.CylinderGeometry(
  53. 0, // radiusTop
  54. 3, // radiusBottom
  55. sizing.height, // height
  56. 8, // radiusSegments
  57. sizing.segmentCount * 3, // heightSegments
  58. true // openEnded
  59. );
  60.  
  61. for ( var i = 0; i < geometry.vertices.length; i ++ ) {
  62.  
  63. var vertex = geometry.vertices[ i ];
  64. var y = ( vertex.y + sizing.halfHeight );
  65.  
  66. var skinIndex = Math.floor( y / sizing.segmentHeight );
  67. var skinWeight = ( y % sizing.segmentHeight ) / sizing.segmentHeight;
  68.  
  69. geometry.skinIndices.push( new THREE.Vector4( skinIndex, skinIndex + 1, 0, 0 ) );
  70. geometry.skinWeights.push( new THREE.Vector4( 1 - skinWeight, skinWeight, 0, 0 ) );
  71.  
  72. }
  73.  
  74. return geometry;
  75.  
  76. };
  77.  
  78. function createBones ( sizing ) {
  79.  
  80. bones = [];
  81.  
  82. var prevBone = new THREE.Bone();
  83. bones.push( prevBone );
  84. prevBone.position.y = - sizing.halfHeight;
  85.  
  86. for ( var i = 0; i < sizing.segmentCount; i ++ ) {
  87.  
  88. var bone = new THREE.Bone();
  89. bone.position.y = sizing.segmentHeight;
  90. bones.push( bone );
  91. prevBone.add( bone );
  92. prevBone = bone;
  93.  
  94. }
  95.  
  96. return bones;
  97.  
  98. };
  99.  
  100. function createMesh ( geometry, bones ) {
  101.  
  102. var material = new THREE.MeshPhongMaterial( {
  103. skinning : true,
  104. color: 0x156289,
  105. emissive: 0x072534,
  106. side: THREE.DoubleSide,
  107. shading: THREE.FlatShading
  108. } );
  109.  
  110. var mesh = new THREE.SkinnedMesh( geometry, material );
  111. var skeleton = new THREE.Skeleton( bones );
  112.  
  113. mesh.add( bones[ 0 ] );
  114.  
  115. mesh.bind( skeleton );
  116.  
  117. skeletonHelper = new THREE.SkeletonHelper( mesh );
  118. skeletonHelper.material.linewidth = 2;
  119. mesh.add( skeletonHelper );
  120.  
  121. return mesh;
  122.  
  123. };
  124.  
  125. function Hair() {
  126.  
  127. THREE.Object3D.apply(this);
  128.  
  129. this.height = this.segmentHeight * this.segmentCount;
  130. this.halfHeight = this.height * 0.5;
  131.  
  132. var sizing = {
  133. segmentHeight : this.segmentHeight,
  134. segmentCount : this.segmentCount,
  135. height : this.height,
  136. halfHeight : this.halfHeight
  137. };
  138.  
  139. this.geometry = createGeometry( sizing );
  140. this.bones = createBones( sizing );
  141. this.mesh = createMesh( this.geometry, this.bones );
  142.  
  143. this.mesh.scale.multiplyScalar( 1 );
  144. this.add( this.mesh );
  145. };
  146.  
  147. Hair.prototype = Object.assign(THREE.Object3D.prototype,
  148. {
  149. constructor: Hair,
  150. segmentHeight: 6,
  151. segmentCount: 5,
  152. animating: true,
  153. animate(count){
  154. //Wiggle the bones
  155. if ( this.animating) {
  156.  
  157. let len = mesh.skeleton.bones.length
  158. for ( var i = 0; i < len; i++){//; i ++ ) {
  159.  
  160. mesh.skeleton.bones[ i ].rotation.z = Math[ i < len/2 ? 'cos' : 'sin' ]( count ) * 2 / mesh.skeleton.bones.length;
  161.  
  162. }
  163.  
  164. }
  165.  
  166. skeletonHelper.update();
  167. }
  168. });
  169.  
  170. let hairs = [];
  171.  
  172. function initHairs(){
  173. var boneCount = 5;
  174.  
  175. for ( let i = 0; i < boneCount; i++){
  176. let hair = new Hair;
  177. hair.position.x += i * 10;
  178. scene.add(hair);
  179. }
  180. }
  181.  
  182. let count = 0;
  183.  
  184. function render () {
  185.  
  186. requestAnimationFrame( render );
  187.  
  188. count += 0.01;
  189.  
  190. var bone = mesh;
  191.  
  192. for ( var i = 0; i < hairs.length; i++){
  193. hairs[i].animate(count);
  194. }
  195.  
  196. renderer.render( scene, camera );
  197.  
  198. };
  199.  
  200. initScene();
  201. render();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement