Advertisement
Guest User

Untitled

a guest
Oct 3rd, 2013
363
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <!DOCTYPE html>
  2. <html>
  3.     <head>
  4.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5.         <title>Ray Tracing Example</title>
  6.         <style>
  7.         html{
  8.             background: white;
  9.         }
  10.             body{
  11.                 background: white;
  12.                 position: relative;
  13.                 margin: 0 auto;
  14.  
  15.             }
  16.             #viewport{
  17.             width: 100%;
  18.             height: 100%;
  19.             }
  20.            
  21.                 </style>
  22.         <script type="x-shader/x-vertex" id="vertexshader">
  23. #define STEPS 50
  24.      varying float PointIntensity;
  25.      uniform vec3 camera;
  26.      uniform mat4 inverseProjectionMatrix;
  27.     uniform vec3 dimension;
  28.    
  29.    varying vec2 vUv;
  30.    
  31.  
  32.    //determines if the position is inside the volume
  33.     bool inside(vec3 posVec){
  34.             bool value = false;
  35.            
  36.             if(posVec.x <0.0 ||posVec.x > 41.0 ){
  37.                 value = false;
  38.             }
  39.             else if(posVec.y <0.0 ||posVec.y > 41.0 ){
  40.                 value = false;
  41.             }
  42.             else if(posVec.z <0.0 ||posVec.z > 41.0 ){
  43.                 value = false;
  44.          }
  45.          else{
  46.             value = true;
  47.          }
  48.          return value;
  49.         }
  50.    
  51.  
  52.     vec3 unproject( vec2 coord ){
  53.     vec4 screen = vec4( coord, 0, 1.0 );
  54.     mat4 uInvMVProjMatrix = modelViewMatrix *inverseProjectionMatrix;
  55.     vec4 homogenous = uInvMVProjMatrix * 2.0 * ( screen - vec4( 0.5 )  );
  56.     return homogenous.xyz / homogenous.w;
  57.     }        
  58.        
  59.    
  60.     float getDensity(vec3 PointPos){
  61.    
  62.         float stepsize = 1.0;
  63.         float emptyStep = 15.0;
  64.        
  65.         vec3 leap;
  66.         bool hit = false;
  67.         float density = 0.000;
  68.         // Ray direction from the camera through the current point in the Plane
  69.         vec3 dir = unproject(uv);
  70.         vec3 RayDirection = normalize(dir);
  71.         vec3 start = PointPos;  
  72.            
  73.         for(int i = 0; i<STEPS; i++){
  74.              
  75.              vec3 alteredPosition = start;
  76.              alteredPosition.x += 20.5;
  77.              alteredPosition.y += 20.5;
  78.              alteredPosition.z += 20.5;
  79.              
  80.             bool insideTest = inside(alteredPosition);
  81.            
  82.             if(insideTest){
  83.            
  84.              
  85.              // advance from the start position
  86.             start = start + RayDirection * stepsize;
  87.          
  88.               hit = true;
  89.            
  90.          }else{
  91.             leap = start + RayDirection * emptyStep;
  92.             bool tooFar = inside(leap);
  93.             if(tooFar){
  94.                 start = start + RayDirection * stepsize;
  95.             }else{
  96.                 start = leap;
  97.             }
  98.          }
  99.            
  100.         }
  101.         if(hit){
  102.             density = 1.000;
  103.         }
  104.        
  105.         return density;
  106.     }
  107.  
  108.    
  109.             void main() {
  110.      
  111.         vUv = uv;
  112.         PointIntensity = getDensity(position);
  113.         vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
  114.         gl_Position = projectionMatrix * mvPosition;
  115.  
  116.     }
  117.  
  118. </script>
  119.  
  120. <script type="x-shader/x-fragment" id="fragmentshader">
  121.  
  122.  
  123.    
  124.     varying float PointIntensity;
  125.    varying vec2 vUv;
  126.    
  127.     void main() {
  128.        
  129.        //Rays that have traversed the volume (cube) should leave a red point on the viewplane, Rays that just went through empty space a black point
  130.            gl_FragColor= vec4(PointIntensity,0.0, 0.0, 1.0);
  131.          
  132.          
  133.  
  134.     }
  135. </script>      
  136.        
  137.         <script src="ressources/three.min.js"></script>
  138.         <script src="ressources/TrackballControls.js"></script>
  139.         <script src="ressources/jquery-2.0.3.min.js"></script>
  140.        <script src="ressources/keys.js"></script>
  141.        
  142.         </head>
  143. <body>
  144.  
  145. <canvas id="viewport" style=" position: relative;">
  146. </canvas>
  147.  
  148. <script>
  149. //Dimensions of the volume (cube)
  150. var xDimension = 41.0;
  151. var yDimension = 41.0;
  152. var zDimension = 41.0;
  153.  
  154.  
  155.  var browserWidth = window.innerWidth;
  156.   var browserHeight = window.innerHeight;
  157.  
  158. $('#viewport').height(browserHeight);
  159. $('#viewport').width(browserWidth);
  160. var  camera, renderer, scene, Mesh, shaderMaterial;
  161.  
  162. init();
  163. $('body').keydown(function(event) {
  164.         var keycode = event.which;
  165.         handleKeyEvent(keycode);
  166.     });
  167.  
  168.  
  169.  
  170.  
  171.  
  172. function init(){
  173.  camera = new THREE.PerspectiveCamera( 60, browserWidth / browserHeight, 1, 500 );
  174.  
  175.         camera.position.z = 75;
  176.        
  177.         camera.lookAt(new THREE.Vector3(0,0,0));
  178.                  
  179.         scene = new THREE.Scene();
  180.          scene.fog = new THREE.Fog( 0x777777, 1, 500 );
  181.        
  182.        
  183.  
  184.  
  185.  
  186.  
  187.    
  188.     uniforms = {
  189.        
  190.    
  191.         camera: {type: "v3", value: camera.position},
  192.         dimension: {type: "v3", value: new THREE.Vector3(xDimension, yDimension, zDimension)},
  193.         inverseProjectionMatrix: { type: "m4", value: camera.projectionMatrixInverse }
  194.        
  195.        
  196.     };
  197.  
  198.        
  199.  
  200.     shaderMaterial = new THREE.ShaderMaterial( {
  201.        
  202.    
  203.         uniforms:       uniforms,
  204.         vertexShader:   document.getElementById( 'vertexshader' ).textContent,
  205.         fragmentShader: document.getElementById( 'fragmentshader' ).textContent,
  206.         transparent: false,
  207.         wireframe: false
  208.  
  209.     });
  210.  
  211.  
  212.  
  213. shaderMaterial.needsUpdate = true,
  214. viewplane = new THREE.PlaneGeometry(60, 60, 250, 250);
  215.  
  216. Mesh = new THREE.Mesh(viewplane, shaderMaterial);
  217. Mesh.position.z = -55;
  218.  
  219.  
  220.  
  221. camera.add(Mesh);
  222. scene.add(camera);
  223.  
  224.  
  225.  
  226.  
  227.  
  228. renderer = new THREE.WebGLRenderer({canvas: viewport});
  229.        
  230.         renderer.setClearColor( scene.fog.color, 1 );
  231.         renderer.setSize( browserWidth, browserHeight );
  232.    
  233.  
  234.        controls = new THREE.TrackballControls(camera);
  235.                 controls.target.set( 0, 0,0);
  236.              
  237.  
  238.                 controls.rotateSpeed = 0.4;
  239.                 controls.zoomSpeed = 1.2;
  240.                 controls.panSpeed = 0.4;
  241.  
  242.                 controls.noZoom = false;
  243.                 controls.noPan = false;
  244.  
  245.                 controls.staticMoving = true;
  246.                 controls.dynamicDampingFactor = 0.10;
  247.  
  248.                 controls.keys = [ 65, 83, 68 ];
  249.                
  250.                 animate();
  251.              
  252.                
  253. }
  254.  
  255.  function animate() {
  256.  
  257.         requestAnimationFrame( animate );
  258.         uniforms.inverseProjectionMatrix.value = camera.projectionMatrixInverse;
  259.        
  260.        shaderMaterial.uniforms[ 'camera' ].value = camera.position.clone();
  261.    
  262.       controls.update();
  263.        
  264.         renderer.render( scene, camera );
  265.      
  266.      
  267.     }
  268.  
  269.  
  270. </script>
  271. </body>
  272. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement