Browse Source

RaytracingRenderer: Support camera orientation.

Mr.doob 11 years ago
parent
commit
115af2aa05
1 changed files with 13 additions and 5 deletions
  1. 13 5
      examples/js/renderers/RaytracingRenderer.js

+ 13 - 5
examples/js/renderers/RaytracingRenderer.js

@@ -41,9 +41,13 @@ THREE.RaytracingRenderer = function ( parameters ) {
 	var raycaster = new THREE.Raycaster( origin, direction );
 	var raycasterLight = new THREE.Raycaster();
 
+	var cameraNormalMatrix = new THREE.Matrix3();
+
 	var objects;
 	var lights = [];
 
+	var animationFrameId = null;
+
 	this.domElement = canvas;
 
 	this.autoClear = true;
@@ -91,8 +95,8 @@ THREE.RaytracingRenderer = function ( parameters ) {
 
 			for ( var x = 0; x < blockSize; x ++, index += 4 ) {
 
-				direction.set( x + blockX - canvasWidthHalf, y + blockY - canvasHeightHalf, - 500 );
-				direction.normalize();
+				direction.set( x + blockX - canvasWidthHalf, - ( y + blockY - canvasHeightHalf ), - 1000 );
+				direction.applyMatrix3( cameraNormalMatrix ).normalize();
 
 				var intersections = raycaster.intersectObjects( objects, true );
 
@@ -115,7 +119,8 @@ THREE.RaytracingRenderer = function ( parameters ) {
 
 					}
 
-					if ( material instanceof THREE.MeshLambertMaterial ) {
+					if ( material instanceof THREE.MeshLambertMaterial ||
+						 material instanceof THREE.MeshPhongMaterial ) {
 
 						lightColor.set( 0, 0, 0 );
 
@@ -131,7 +136,7 @@ THREE.RaytracingRenderer = function ( parameters ) {
 
 							if ( intersections.length === 0 ) {
 
-								var dot = 1.0 - Math.max( face.normal.dot( raycasterLight.ray.direction ), 0 );
+								var dot = Math.max( face.normal.dot( raycasterLight.ray.direction ), 0 );
 								var intensity = dot * light.intensity;
 
 								lightColor.r += light.color.r * intensity;
@@ -171,7 +176,7 @@ THREE.RaytracingRenderer = function ( parameters ) {
 
 		context.fillRect( blockX, blockY, blockSize, blockSize );
 
-		requestAnimationFrame( renderBlock );
+		animationFrameId = requestAnimationFrame( renderBlock );
 
 	};
 
@@ -179,9 +184,12 @@ THREE.RaytracingRenderer = function ( parameters ) {
 
 		if ( this.autoClear === true ) this.clear();
 
+		cancelAnimationFrame( animationFrameId );
+
 		blockX = 0;
 		blockY = 0;
 
+		cameraNormalMatrix.getNormalMatrix( camera.matrixWorld );
 		origin.copy( camera.position );
 
 		objects = scene.children;