webgl_camera_logarithmicdepthbuffer.html 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title>three.js webgl - cameras</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. color: #808080;
  10. font-family:Monospace;
  11. font-size:13px;
  12. text-align:center;
  13. background-color: #000;
  14. margin: 0px;
  15. overflow: hidden;
  16. }
  17. #info {
  18. position: absolute;
  19. top: 0px; width: 100%;
  20. padding: 5px;
  21. z-index: 100;
  22. }
  23. a {
  24. color: #0080ff;
  25. }
  26. b { color: lightgreen }
  27. #stats { position: absolute; top:0; left: 0 }
  28. </style>
  29. </head>
  30. <body>
  31. <div id="container"></div>
  32. <div id="info">
  33. <a href="http://threejs.org" target="_blank">three.js</a> - cameras - logarithmic depth buffer<br/>
  34. </div>
  35. <script src="../build/three.min.js"></script>
  36. <script src="js/controls/OrbitControls.js"></script>
  37. <script src="js/libs/stats.min.js"></script>
  38. <script src="fonts/helvetiker_regular.typeface.js"></script>
  39. <script>
  40. var SCREEN_WIDTH = window.innerWidth;
  41. var SCREEN_HEIGHT = window.innerHeight;
  42. var container, stats;
  43. var camera, scene, renderer, controls;
  44. var cameraLogZBuf, sceneLogZBuf, rendererLogZBuf;
  45. var labels = [
  46. { size: .000001, label: "microscopic (1µm)" },
  47. { size: .001, label: "minuscule (1mm)" },
  48. { size: .01, label: "tiny (1cm)" },
  49. { size: 1, label: "petite (1m)" },
  50. { size: 10, label: "small (10m)" },
  51. { size: 100, label: "average (100m)" },
  52. { size: 1000, label: "medium (1km)" },
  53. { size: 10000, label: "good-sized (10km)" },
  54. { size: 100000, label: "large (100km)" },
  55. { size: 1000000, label: "extra-large (1Mm)" },
  56. { size: 10000000, label: "mammoth (10Mm)" },
  57. { size: 100000000, label: "enormous (100Mm)" },
  58. { size: 1000000000, label: "stupendous (1Gm)" }
  59. ];
  60. init();
  61. animate();
  62. function init() {
  63. container = document.createElement( 'div' );
  64. document.body.appendChild( container );
  65. scene = new THREE.Scene();
  66. sceneLogZBuf = new THREE.Scene();
  67. // 1 micrometer to 1 parsec in one scene? preposterous! and yet...
  68. var NEAR = 1e-6, FAR = 1e24;
  69. camera = new THREE.PerspectiveCamera( 50, 0.5 * SCREEN_WIDTH / SCREEN_HEIGHT, NEAR, FAR );
  70. camera.position.z = 100;
  71. scene.add(camera);
  72. cameraLogZBuf = new THREE.PerspectiveCamera( 50, 0.5 * SCREEN_WIDTH / SCREEN_HEIGHT, NEAR, FAR );
  73. cameraLogZBuf.position = camera.position;
  74. cameraLogZBuf.quaternion = camera.quaternion;
  75. cameraLogZBuf.matrix = camera.matrix;
  76. camera.setViewOffset( SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, SCREEN_WIDTH/2, SCREEN_HEIGHT );
  77. cameraLogZBuf.setViewOffset( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_WIDTH/2, 0, SCREEN_WIDTH/2, SCREEN_HEIGHT );
  78. var labelmat = new THREE.MeshNormalMaterial();
  79. var labelmatLogZBuf = new THREE.MeshNormalMaterial();
  80. for (var i = 0; i < labels.length; i++) {
  81. var labelgeo = new THREE.TextGeometry(labels[i].label, {
  82. size: labels[i].size,
  83. height: labels[i].size / 2,
  84. font: 'helvetiker',
  85. });
  86. labelgeo.computeBoundingSphere();
  87. var mesh = new THREE.Mesh(labelgeo, labelmat);
  88. mesh.position.x = -labelgeo.boundingSphere.radius;
  89. mesh.position.y = labels[i].size;
  90. mesh.position.z = -labels[i].size * 10;
  91. scene.add(mesh);
  92. var meshLogZBuf = new THREE.Mesh(labelgeo.clone(), labelmatLogZBuf);
  93. meshLogZBuf.position = mesh.position;
  94. sceneLogZBuf.add(meshLogZBuf);
  95. }
  96. renderer = new THREE.WebGLRenderer({antialias: true, logarithmicDepthBuffer: false});
  97. renderer.setSize(SCREEN_WIDTH/2, SCREEN_HEIGHT);
  98. renderer.domElement.style.position = "relative";
  99. container.appendChild(renderer.domElement);
  100. rendererLogZBuf = new THREE.WebGLRenderer({antialias: true, logarithmicDepthBuffer: true});
  101. rendererLogZBuf.setSize(SCREEN_WIDTH/2, SCREEN_HEIGHT);
  102. rendererLogZBuf.domElement.style.position = "relative";
  103. container.appendChild(rendererLogZBuf.domElement);
  104. controls = new THREE.OrbitControls(camera, document);
  105. controls.dollyOut(.0000001);
  106. controls.rotateUp(Math.PI/16);
  107. //controls.addEventListener( 'change', render );
  108. stats = new Stats();
  109. container.appendChild(stats.domElement);
  110. window.addEventListener( 'resize', onWindowResize, false );
  111. render();
  112. }
  113. function onWindowResize( event ) {
  114. SCREEN_WIDTH = window.innerWidth;
  115. SCREEN_HEIGHT = window.innerHeight;
  116. renderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
  117. camera.aspect = 0.5 * SCREEN_WIDTH / SCREEN_HEIGHT;
  118. camera.updateProjectionMatrix();
  119. }
  120. function animate() {
  121. requestAnimationFrame( animate );
  122. render();
  123. }
  124. function render() {
  125. controls.update();
  126. renderer.render( scene, camera );
  127. rendererLogZBuf.render( sceneLogZBuf, cameraLogZBuf );
  128. stats.update();
  129. console.log('up it');
  130. }
  131. </script>
  132. </body>
  133. </html>