webgl_math_spherical_distribution.html 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title>three.js webgl - geometries</title>
  5. <meta charset="utf-8">
  6. <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  7. <style>
  8. body {
  9. font-family: Monospace;
  10. background-color: #000;
  11. margin: 0px;
  12. overflow: hidden;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <script src="../build/three.js"></script>
  18. <script src="js/Detector.js"></script>
  19. <script src="js/libs/stats.min.js"></script>
  20. <script>
  21. if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
  22. var container, stats;
  23. var camera, scene, renderer;
  24. init();
  25. animate();
  26. function init() {
  27. container = document.createElement( 'div' );
  28. document.body.appendChild( container );
  29. camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 2000 );
  30. camera.position.y = 300;
  31. camera.position.z = 300;
  32. scene = new THREE.Scene();
  33. camera.lookAt( scene.position );
  34. var light, object;
  35. scene.add( new THREE.AmbientLight( 0x808080 ) );
  36. light = new THREE.DirectionalLight( 0xffffff );
  37. light.position.set( 0, 1, 0 );
  38. scene.add( light );
  39. // var material = new THREE.MeshLambertMaterial( {
  40. var material = new THREE.MeshPhongMaterial( {
  41. vertexColors: THREE.VertexColors,
  42. side: THREE.DoubleSide
  43. } );
  44. // create sphere colored with sphericalDist values
  45. var numSphereSegments = 100;
  46. var dist;
  47. var geom;
  48. var baseDist = new THREE.CosineSphericalDistribution();
  49. dist = new THREE.LinearlyTransformedSphericalDistribution(baseDist)
  50. .shear(-0.5, 0.0, 0.0);
  51. geom = new THREE.SphereGeometry( 20, numSphereSegments, numSphereSegments );
  52. colorSphereWithDistributionValues(geom, dist);
  53. object = new THREE.Mesh( geom, material );
  54. object.position.set( -100, 0, 0 );
  55. object.rotation.set( -Math.PI / 2.0, 0.0, 0.0 );
  56. scene.add( object );
  57. dist = new THREE.LinearlyTransformedSphericalDistribution(baseDist)
  58. .scale(0.5, 1.0, 1.0);
  59. geom = new THREE.SphereGeometry( 20, numSphereSegments, numSphereSegments );
  60. colorSphereWithDistributionValues(geom, dist);
  61. object = new THREE.Mesh( geom, material );
  62. object.position.set( -50, 0, 0 );
  63. object.rotation.set( -Math.PI / 2.0, 0.0, 0.0 );
  64. scene.add( object );
  65. dist = new THREE.CosineSphericalDistribution();
  66. geom = new THREE.SphereGeometry( 20, numSphereSegments, numSphereSegments );
  67. colorSphereWithDistributionValues(geom, dist);
  68. object = new THREE.Mesh( geom, material );
  69. object.position.set( 0, 0, 0 );
  70. object.rotation.set( -Math.PI / 2.0, 0.0, 0.0 );
  71. scene.add( object );
  72. dist = new THREE.LinearlyTransformedSphericalDistribution(baseDist)
  73. .scale(1.0, 0.5, 1.0);
  74. geom = new THREE.SphereGeometry( 20, numSphereSegments, numSphereSegments );
  75. colorSphereWithDistributionValues(geom, dist);
  76. object = new THREE.Mesh( geom, material );
  77. object.position.set( 50, 0, 0 );
  78. object.rotation.set( -Math.PI / 2.0, 0.0, 0.0 );
  79. scene.add( object );
  80. dist = new THREE.LinearlyTransformedSphericalDistribution(baseDist)
  81. .shear(0.0, -0.5, 0.0);
  82. geom = new THREE.SphereGeometry( 20, numSphereSegments, numSphereSegments );
  83. colorSphereWithDistributionValues(geom, dist);
  84. object = new THREE.Mesh( geom, material );
  85. object.position.set( 100, 0, 0 );
  86. object.rotation.set( -Math.PI / 2.0, 0.0, 0.0 );
  87. scene.add( object );
  88. //
  89. renderer = new THREE.WebGLRenderer( { antialias: true } );
  90. renderer.setPixelRatio( window.devicePixelRatio );
  91. renderer.setSize( window.innerWidth, window.innerHeight );
  92. container.appendChild( renderer.domElement );
  93. stats = new Stats();
  94. container.appendChild( stats.dom );
  95. //
  96. window.addEventListener( 'resize', onWindowResize, false );
  97. }
  98. function colorSphereWithDistributionValues(geom, dist) {
  99. var maxVal = 0.65;
  100. var sum = 0.0;
  101. var values = [];
  102. // calc dist values, and note max value to map colors
  103. for ( var i = 0; i < geom.faces.length; i ++ ) {
  104. values.push({});
  105. var face = geom.faces[ i ];
  106. for ( var j = 0; j < 3; j ++ ) {
  107. var faceIdx = [ 'a', 'b', 'c' ][ j ];
  108. var pos = geom.vertices[ face[ faceIdx ] ];
  109. var distValue = dist.valueAtPosVec3( pos );
  110. // sum += distValue;
  111. // maxVal = Math.max(maxVal, distValue);
  112. values[i][faceIdx] = distValue;
  113. }
  114. }
  115. console.log('max: ' + maxVal);
  116. console.log('sum: ' + sum);
  117. // set colors using maxValue to interpolate properly
  118. for ( var i = 0; i < geom.faces.length; i ++ ) {
  119. var face = geom.faces[ i ];
  120. for ( var j = 0; j < 3; j ++ ) {
  121. var red = new THREE.Color( 'red' );
  122. var blue = new THREE.Color( 'blue' );
  123. var white = new THREE.Color( 'white' );
  124. var faceIdx = [ 'a', 'b', 'c' ][ j ];
  125. var distValue = values[i][faceIdx] / maxVal;
  126. var color;
  127. if (distValue > 0.5) {
  128. // 1.0 -> 0.5: red -> white
  129. color = red.lerp( white, 1.0 - ( ( distValue - 0.5 ) * 2.0 ) );
  130. } else {
  131. // 0.5 -> 0.0: white -> blue
  132. color = blue.lerp( white, distValue * 2.0 );
  133. }
  134. face.vertexColors[ j ] = color;
  135. }
  136. }
  137. geom.colorsNeedUpdate = true;
  138. }
  139. function onWindowResize() {
  140. camera.aspect = window.innerWidth / window.innerHeight;
  141. camera.updateProjectionMatrix();
  142. renderer.setSize( window.innerWidth, window.innerHeight );
  143. }
  144. //
  145. function animate() {
  146. requestAnimationFrame( animate );
  147. render();
  148. stats.update();
  149. }
  150. function render() {
  151. var timer = Date.now() * 0.0001;
  152. // camera.position.x = Math.cos( timer ) * 800;
  153. // camera.position.z = Math.sin( timer ) * 800;
  154. // camera.lookAt( scene.position );
  155. // for ( var i = 0, l = scene.children.length; i < l; i ++ ) {
  156. // var object = scene.children[ i ];
  157. // object.rotation.x = timer * 5;
  158. // object.rotation.y = timer * 2.5;
  159. // }
  160. renderer.render( scene, camera );
  161. }
  162. </script>
  163. </body>
  164. </html>