particles_billboards_gl.html 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. <!DOCTYPE HTML>
  2. <html lang="en">
  3. <head>
  4. <title>three.js - particles - billboards - webgl</title>
  5. <meta charset="utf-8">
  6. <style type="text/css">
  7. body {
  8. background-color: #000000;
  9. margin: 0px;
  10. overflow: hidden;
  11. font-family:Monospace;
  12. font-size:13px;
  13. text-align:center;
  14. font-weight: bold;
  15. text-align:center;
  16. }
  17. a {
  18. color:#0078ff;
  19. }
  20. #info {
  21. color:#fff;
  22. position: absolute;
  23. top: 0px; width: 100%;
  24. padding: 5px;
  25. z-index:100;
  26. }
  27. #oldie {
  28. font-family:monospace;
  29. font-size:13px;
  30. text-align:center;
  31. background:#eee;
  32. color:#000;
  33. padding:1em;
  34. width:475px;
  35. margin:5em auto 0;
  36. display:none;
  37. }
  38. </style>
  39. </head>
  40. <body>
  41. <div id="info">
  42. <a href="http://github.com/mrdoob/three.js" target="_blank">three.js</a> - webgl particle billboards example
  43. </div>
  44. <center>
  45. <div id="oldie">
  46. Sorry, your browser doesn't support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation">WebGL</a>
  47. and <a href="http://www.whatwg.org/specs/web-workers/current-work/">Web Workers</a>.<br/>
  48. <br/>
  49. Please try in
  50. <a href="http://www.chromium.org/getting-involved/dev-channel">Chrome 9+</a> /
  51. <a href="http://www.mozilla.com/en-US/firefox/all-beta.html">Firefox 4+</a> /
  52. <a href="http://nightly.webkit.org/">Safari OSX 10.6+</a>
  53. </div>
  54. </center>
  55. <script type="text/javascript" src="../build/ThreeExtras.js"></script>
  56. <script type="text/javascript" src="js/Stats.js"></script>
  57. <script type="text/javascript">
  58. if ( !is_browser_compatible() ) {
  59. document.getElementById( "oldie" ).style.display = "block";
  60. }
  61. var container, stats;
  62. var camera, scene, renderer, particles, geometry, material, i, h, color, sprite, size, x, y, z;
  63. var mouseX = 0, mouseY = 0;
  64. var windowHalfX = window.innerWidth / 2;
  65. var windowHalfY = window.innerHeight / 2;
  66. init();
  67. setInterval( loop, 1000 / 60 );
  68. //loop();
  69. function init() {
  70. container = document.createElement( 'div' );
  71. document.body.appendChild( container );
  72. camera = new THREE.Camera( 55, window.innerWidth / window.innerHeight, 1, 3000 );
  73. camera.position.z = 1000;
  74. scene = new THREE.Scene();
  75. scene.fog = new THREE.FogExp2( 0x000000, 0.001 );
  76. geometry = new THREE.Geometry();
  77. sprite = ImageUtils.loadTexture( "textures/sprites/circle.png" );
  78. for ( i = 0; i < 5000; i++ ) {
  79. x = 2000 * Math.random() - 1000;
  80. y = 2000 * Math.random() - 1000;
  81. z = 2000 * Math.random() - 1000;
  82. vector = new THREE.Vector3( x, y, z );
  83. geometry.vertices.push( new THREE.Vertex( vector ) );
  84. }
  85. material = new THREE.ParticleBasicMaterial( { size: 35, map: sprite, blending: THREE.BillboardBlending } );
  86. material.color.setHSV( 1.0, 0.2, 0.8 );
  87. particles = new THREE.ParticleSystem( geometry, material );
  88. particles.sortParticles = true;
  89. particles.updateMatrix();
  90. scene.addObject( particles );
  91. var light = new THREE.DirectionalLight( 0xffffff );
  92. light.position.x = 0;
  93. light.position.y = 0;
  94. light.position.z = 1;
  95. scene.addLight( light );
  96. renderer = new THREE.WebGLRenderer( { clearAlpha: 1 });
  97. renderer.setSize( window.innerWidth, window.innerHeight );
  98. container.appendChild( renderer.domElement );
  99. stats = new Stats();
  100. stats.domElement.style.position = 'absolute';
  101. stats.domElement.style.top = '0px';
  102. container.appendChild( stats.domElement );
  103. document.addEventListener( 'mousemove', onDocumentMouseMove, false );
  104. document.addEventListener( 'touchstart', onDocumentTouchStart, false );
  105. document.addEventListener( 'touchmove', onDocumentTouchMove, false );
  106. }
  107. function onDocumentMouseMove( event ) {
  108. mouseX = event.clientX - windowHalfX;
  109. mouseY = event.clientY - windowHalfY;
  110. }
  111. function onDocumentTouchStart( event ) {
  112. if ( event.touches.length == 1 ) {
  113. event.preventDefault();
  114. mouseX = event.touches[ 0 ].pageX - windowHalfX;
  115. mouseY = event.touches[ 0 ].pageY - windowHalfY;
  116. }
  117. }
  118. function onDocumentTouchMove( event ) {
  119. if ( event.touches.length == 1 ) {
  120. event.preventDefault();
  121. mouseX = event.touches[ 0 ].pageX - windowHalfX;
  122. mouseY = event.touches[ 0 ].pageY - windowHalfY;
  123. }
  124. }
  125. function loop() {
  126. var time = new Date().getTime() * 0.00005;
  127. camera.position.x += ( mouseX - camera.position.x ) * 0.05;
  128. camera.position.y += ( - mouseY - camera.position.y ) * 0.05;
  129. /*
  130. for( i = 0; i < scene.objects.length; i++ ) {
  131. scene.objects[i].rotation.y = 5*time * ( i < 4 ? i+1 : - (i+1) );
  132. }
  133. */
  134. h = ( 360 * ( 1.0 + time ) % 360 ) / 360;
  135. material.color.setHSV( h, 0.75, 0.8 );
  136. renderer.render( scene, camera );
  137. stats.update();
  138. }
  139. function is_browser_compatible() {
  140. // WebGL support
  141. try { var test = new Float32Array(1); } catch(e) { return false; }
  142. // Web workers
  143. return !!window.Worker;
  144. }
  145. </script>
  146. </body>
  147. </html>
粤ICP备19079148号