Explorar o código

RaytracingRenderer: Support for MeshLambertMaterial.

Mr.doob %!s(int64=11) %!d(string=hai) anos
pai
achega
477f33b5d7
Modificáronse 2 ficheiros con 21 adicións e 12 borrados
  1. 16 7
      examples/js/renderers/RaytracingRenderer.js
  2. 5 5
      examples/raytracer_sandbox.html

+ 16 - 7
examples/js/renderers/RaytracingRenderer.js

@@ -33,6 +33,7 @@ THREE.RaytracingRenderer = function ( parameters ) {
 	var data = imagedata.data;
 
 	var color = new THREE.Color();
+	var lightColor = new THREE.Color();
 
 	var origin = new THREE.Vector3();
 	var direction = new THREE.Vector3();
@@ -88,7 +89,7 @@ THREE.RaytracingRenderer = function ( parameters ) {
 
 		for ( var y = 0; y < blockSize; y ++ ) {
 
-			for ( var x = 0; x < blockSize; x ++ ) {
+			for ( var x = 0; x < blockSize; x ++, index += 4 ) {
 
 				direction.set( x + blockX - canvasWidthHalf, y + blockY - canvasHeightHalf, - 500 );
 				direction.normalize();
@@ -102,6 +103,7 @@ THREE.RaytracingRenderer = function ( parameters ) {
 					var point = intersection.point;
 					var object = intersection.object;
 					var material = object.material;
+					var face = intersection.face;
 
 					if ( material.vertexColors === THREE.NoColors ) {
 
@@ -109,11 +111,13 @@ THREE.RaytracingRenderer = function ( parameters ) {
 
 					} else if ( material.vertexColors === THREE.FaceColors ) {
 
-						color.copy( intersection.face.color );
+						color.copy( face.color );
 
 					}
 
-					if ( lights.length > 0 ) {
+					if ( material instanceof THREE.MeshLambertMaterial ) {
+
+						lightColor.set( 0, 0, 0 );
 
 						raycasterLight.ray.origin.copy( point );
 
@@ -125,14 +129,21 @@ THREE.RaytracingRenderer = function ( parameters ) {
 
 							var intersections = raycasterLight.intersectObjects( objects, true );
 
-							if ( intersections.length > 0 ) {
+							if ( intersections.length === 0 ) {
+
+								var dot = 1.0 - Math.max( face.normal.dot( raycasterLight.ray.direction ), 0 );
+								var intensity = dot * light.intensity;
 
-								color.multiplyScalar( 0.25 );
+								lightColor.r += light.color.r * intensity;
+								lightColor.g += light.color.g * intensity;
+								lightColor.b += light.color.b * intensity;
 
 							}
 
 						}
 
+						color.multiply( lightColor );
+
 					}
 
 					data[ index ] = color.r * 255;
@@ -141,8 +152,6 @@ THREE.RaytracingRenderer = function ( parameters ) {
 
 				}
 
-				index += 4;
-
 			}
 
 		}

+ 5 - 5
examples/raytracer_sandbox.html

@@ -55,7 +55,7 @@
 
 				}
 
-				torus = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { color: 0x0000ff, vertexColors: THREE.FaceColors } ) );
+				torus = new THREE.Mesh( geometry, new THREE.MeshLambertMaterial() );
 				scene.add( torus );
 
 				// Plane
@@ -68,15 +68,15 @@
 
 				}
 
-				cube = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { color: 0x00ff00, vertexColors: THREE.FaceColors } ) );
+				cube = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { vertexColors: THREE.FaceColors } ) );
 				scene.add( cube );
 
-				var light = new THREE.PointLight( 0xffffff );
+				var light = new THREE.PointLight( 0xffffff, 0.5 );
 				light.position.set( 300, 300, 300 );
 				scene.add( light );
 
-				var light = new THREE.PointLight( 0xffffff );
-				light.position.set( - 300, - 300, 300 );
+				var light = new THREE.PointLight( 0x0000ff );
+				light.position.set( - 300, 300, 300 );
 				scene.add( light );
 
 				renderer = new THREE.RaytracingRenderer();