diff --git a/docs/api/en/core/Raycaster.html b/docs/api/en/core/Raycaster.html index 61de6225bc25902feee1560e82365dfcb68b192d..2d15cdbc03c9d7a57acc1a5e5825d64a87caefd6 100644 --- a/docs/api/en/core/Raycaster.html +++ b/docs/api/en/core/Raycaster.html @@ -103,6 +103,14 @@ This value shouldn't be negative and should be smaller than the far property.

+

[property:Camera camera]

+

+ The camera to use when raycasting against view-dependent objects such as billboarded objects like [page:Sprites]. This field + can be set manually or is set when calling "setFromCamera". + + Defaults to null. +

+

[property:Object params]

An object with the following properties: diff --git a/examples/js/shaders/TranslucentShader.js b/examples/js/shaders/TranslucentShader.js index efdbc8e74b34a0b6821f672d9a8c8bdabc6967cb..d3839290aeb5efa3b35a0294889c1e09fec38100 100644 --- a/examples/js/shaders/TranslucentShader.js +++ b/examples/js/shaders/TranslucentShader.js @@ -61,6 +61,7 @@ THREE.TranslucentShader = { ].join( "\n" ), fragmentShader: [ + "#define USE_UV", "#define USE_MAP", "#define PHONG", "#define TRANSLUCENT", @@ -137,7 +138,7 @@ THREE.TranslucentShader = { " RE_Direct( directLight, geometry, material, reflectedLight );", - " #if defined( TRANSLUCENT ) && defined( USE_MAP )", + " #if defined( TRANSLUCENT ) && defined( USE_UV )", " RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);", " #endif", " }", @@ -159,7 +160,7 @@ THREE.TranslucentShader = { " RE_Direct( directLight, geometry, material, reflectedLight );", - " #if defined( TRANSLUCENT ) && defined( USE_MAP )", + " #if defined( TRANSLUCENT ) && defined( USE_UV )", " RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);", " #endif", " }", diff --git a/examples/jsm/shaders/TranslucentShader.js b/examples/jsm/shaders/TranslucentShader.js index 96cd51ca74dd79a2563572acf5a99581e8906175..9a4000b669ffc5635735bd97653045cad868ca19 100644 --- a/examples/jsm/shaders/TranslucentShader.js +++ b/examples/jsm/shaders/TranslucentShader.js @@ -68,6 +68,7 @@ var TranslucentShader = { ].join( "\n" ), fragmentShader: [ + "#define USE_UV", "#define USE_MAP", "#define PHONG", "#define TRANSLUCENT", @@ -144,7 +145,7 @@ var TranslucentShader = { " RE_Direct( directLight, geometry, material, reflectedLight );", - " #if defined( TRANSLUCENT ) && defined( USE_MAP )", + " #if defined( TRANSLUCENT ) && defined( USE_UV )", " RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);", " #endif", " }", @@ -166,7 +167,7 @@ var TranslucentShader = { " RE_Direct( directLight, geometry, material, reflectedLight );", - " #if defined( TRANSLUCENT ) && defined( USE_MAP )", + " #if defined( TRANSLUCENT ) && defined( USE_UV )", " RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);", " #endif", " }", diff --git a/src/core/Raycaster.d.ts b/src/core/Raycaster.d.ts index e182701ffe30a99bca9080ce16a8a1e5f5b60a49..483f7237f58bd3b46f896e3d6399814e1ade657d 100644 --- a/src/core/Raycaster.d.ts +++ b/src/core/Raycaster.d.ts @@ -55,6 +55,12 @@ export class Raycaster { */ far: number; + /** + * The camera to use when raycasting against view-dependent objects such as billboarded objects like Sprites. This field + * can be set manually or is set when calling "setFromCamera". + */ + camera: Camera; + params: RaycasterParameters; /** diff --git a/src/core/Raycaster.js b/src/core/Raycaster.js index 4c98e6df1e2d86789bb6ae45b4a6841fc3bdd77f..926884f24531c7a2f2e9d6302634d0136a724973 100644 --- a/src/core/Raycaster.js +++ b/src/core/Raycaster.js @@ -13,6 +13,7 @@ function Raycaster( origin, direction, near, far ) { this.near = near || 0; this.far = far || Infinity; + this.camera = null; this.params = { Mesh: {}, @@ -79,13 +80,13 @@ Object.assign( Raycaster.prototype, { this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); - this._camera = camera; + this.camera = camera; } else if ( ( camera && camera.isOrthographicCamera ) ) { this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); - this._camera = camera; + this.camera = camera; } else { diff --git a/src/objects/Sprite.js b/src/objects/Sprite.js index ac10bc001e872f11d248b5c66ee2b8b00eaed78d..0518effd7210048bd33c07a96495b6247aebbec0 100644 --- a/src/objects/Sprite.js +++ b/src/objects/Sprite.js @@ -71,14 +71,20 @@ Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), { raycast: function ( raycaster, intersects ) { + if ( raycaster.camera === null ) { + + console.error( 'THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.' ); + + } + _worldScale.setFromMatrixScale( this.matrixWorld ); - _viewWorldMatrix.copy( raycaster._camera.matrixWorld ); - this.modelViewMatrix.multiplyMatrices( raycaster._camera.matrixWorldInverse, this.matrixWorld ); + _viewWorldMatrix.copy( raycaster.camera.matrixWorld ); + this.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld ); _mvPosition.setFromMatrixPosition( this.modelViewMatrix ); - if ( raycaster._camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) { + if ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) { _worldScale.multiplyScalar( - _mvPosition.z );