Kaynağa Gözat

Examples: Rename GroundProjectedEnv to GroundProjectedSkybox. (#25645)

Michael Herzog 2 yıl önce
ebeveyn
işleme
e83758285b

+ 0 - 174
examples/jsm/objects/GroundProjectedEnv.js

@@ -1,174 +0,0 @@
-import { Mesh, IcosahedronGeometry, ShaderMaterial, DoubleSide } from 'three';
-
-/**
- * Ground projected env map adapted from @react-three/drei.
- * https://github.com/pmndrs/drei/blob/master/src/core/Environment.tsx
- */
-export class GroundProjectedEnv extends Mesh {
-
-	constructor( texture, options = {} ) {
-
-		const isCubeMap = texture.isCubeTexture;
-
-		const defines = [
-			isCubeMap ? '#define ENVMAP_TYPE_CUBE' : ''
-		];
-
-		const vertexShader = /* glsl */ `
-        varying vec3 vWorldPosition;
-
-        void main() 
-        {
-
-            vec4 worldPosition = ( modelMatrix * vec4( position, 1.0 ) );
-            vWorldPosition = worldPosition.xyz;
-            
-            gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
-
-        }
-        `;
-		const fragmentShader = defines.join( '\n' ) + /* glsl */ `
-
-        varying vec3 vWorldPosition;
-
-        uniform float radius;
-        uniform float height;
-        uniform float angle;
-
-        #ifdef ENVMAP_TYPE_CUBE
-
-            uniform samplerCube map;
-
-        #else
-
-            uniform sampler2D map;
-
-        #endif
-
-        // From: https://www.shadertoy.com/view/4tsBD7
-        float diskIntersectWithBackFaceCulling( vec3 ro, vec3 rd, vec3 c, vec3 n, float r ) 
-        {
-
-            float d = dot ( rd, n );
-            
-            if( d > 0.0 ) { return 1e6; }
-            
-            vec3  o = ro - c;
-            float t = - dot( n, o ) / d;
-            vec3  q = o + rd * t;
-            
-            return ( dot( q, q ) < r * r ) ? t : 1e6;
-
-        }
-
-        // From: https://www.iquilezles.org/www/articles/intersectors/intersectors.htm
-        float sphereIntersect( vec3 ro, vec3 rd, vec3 ce, float ra ) 
-        {
-
-            vec3 oc = ro - ce;
-            float b = dot( oc, rd );
-            float c = dot( oc, oc ) - ra * ra;
-            float h = b * b - c;
-            
-            if( h < 0.0 ) { return -1.0; }
-            
-            h = sqrt( h );
-            
-            return - b + h;
-
-        }
-
-        vec3 project() 
-        {
-
-            vec3 p = normalize( vWorldPosition );
-            vec3 camPos = cameraPosition;
-            camPos.y -= height;
-
-            float intersection = sphereIntersect( camPos, p, vec3( 0.0 ), radius );
-            if( intersection > 0.0 ) {
-                
-                vec3 h = vec3( 0.0, - height, 0.0 );
-                float intersection2 = diskIntersectWithBackFaceCulling( camPos, p, h, vec3( 0.0, 1.0, 0.0 ), radius );
-                p = ( camPos + min( intersection, intersection2 ) * p ) / radius;
-
-            } else {
-
-                p = vec3( 0.0, 1.0, 0.0 );
-
-            }
-
-            return p;
-
-        }
-
-        #include <common>
-
-        void main() 
-        {
-
-            vec3 projectedWorldPosition = project();
-            
-            #ifdef ENVMAP_TYPE_CUBE
-
-                vec3 outcolor = textureCube( map, projectedWorldPosition ).rgb;
-
-            #else
-
-                vec3 direction = normalize( projectedWorldPosition );
-                vec2 uv = equirectUv( direction );
-                vec3 outcolor = texture2D( map, uv ).rgb;
-
-            #endif
-
-            gl_FragColor = vec4( outcolor, 1.0 );
-
-            #include <tonemapping_fragment>
-            #include <encodings_fragment>
-
-        }
-        `;
-
-		const uniforms = {
-			map: { value: texture },
-			height: { value: options.height || 15 },
-			radius: { value: options.radius || 100 },
-		};
-
-		const geometry = new IcosahedronGeometry( 1, 16 );
-		const material = new ShaderMaterial( {
-			uniforms,
-			fragmentShader,
-			vertexShader,
-			side: DoubleSide,
-		} );
-
-		super( geometry, material );
-
-	}
-
-	set radius( radius ) {
-
-		this.material.uniforms.radius.value = radius;
-
-	}
-
-	get radius() {
-
-		return this.material.uniforms.radius.value;
-
-	}
-
-	set height( height ) {
-
-		this.material.uniforms.height.value = height;
-
-	}
-
-	get height() {
-
-		return this.material.uniforms.height.value;
-
-	}
-
-}

+ 172 - 0
examples/jsm/objects/GroundProjectedSkybox.js

@@ -0,0 +1,172 @@
+import { Mesh, IcosahedronGeometry, ShaderMaterial, DoubleSide } from 'three';
+
+/**
+ * Ground projected env map adapted from @react-three/drei.
+ * https://github.com/pmndrs/drei/blob/master/src/core/Environment.tsx
+ */
+class GroundProjectedSkybox extends Mesh {
+
+	constructor( texture, options = {} ) {
+
+		const isCubeMap = texture.isCubeTexture;
+
+		const defines = [
+			isCubeMap ? '#define ENVMAP_TYPE_CUBE' : ''
+		];
+
+		const vertexShader = /* glsl */ `
+			varying vec3 vWorldPosition;
+
+			void main() {
+
+				vec4 worldPosition = ( modelMatrix * vec4( position, 1.0 ) );
+				vWorldPosition = worldPosition.xyz;
+
+				gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
+
+			}
+			`;
+		const fragmentShader = defines.join( '\n' ) + /* glsl */ `
+
+				varying vec3 vWorldPosition;
+
+				uniform float radius;
+				uniform float height;
+				uniform float angle;
+
+				#ifdef ENVMAP_TYPE_CUBE
+
+					uniform samplerCube map;
+
+				#else
+
+					uniform sampler2D map;
+
+				#endif
+
+				// From: https://www.shadertoy.com/view/4tsBD7
+				float diskIntersectWithBackFaceCulling( vec3 ro, vec3 rd, vec3 c, vec3 n, float r ) 
+				{
+
+					float d = dot ( rd, n );
+
+					if( d > 0.0 ) { return 1e6; }
+
+					vec3 o = ro - c;
+					float t = - dot( n, o ) / d;
+					vec3 q = o + rd * t;
+
+					return ( dot( q, q ) < r * r ) ? t : 1e6;
+
+				}
+
+				// From: https://www.iquilezles.org/www/articles/intersectors/intersectors.htm
+				float sphereIntersect( vec3 ro, vec3 rd, vec3 ce, float ra ) {
+
+					vec3 oc = ro - ce;
+					float b = dot( oc, rd );
+					float c = dot( oc, oc ) - ra * ra;
+					float h = b * b - c;
+
+					if( h < 0.0 ) { return -1.0; }
+
+					h = sqrt( h );
+
+					return - b + h;
+
+				}
+
+				vec3 project() {
+
+					vec3 p = normalize( vWorldPosition );
+					vec3 camPos = cameraPosition;
+					camPos.y -= height;
+
+					float intersection = sphereIntersect( camPos, p, vec3( 0.0 ), radius );
+					if( intersection > 0.0 ) {
+
+						vec3 h = vec3( 0.0, - height, 0.0 );
+						float intersection2 = diskIntersectWithBackFaceCulling( camPos, p, h, vec3( 0.0, 1.0, 0.0 ), radius );
+						p = ( camPos + min( intersection, intersection2 ) * p ) / radius;
+
+					} else {
+
+						p = vec3( 0.0, 1.0, 0.0 );
+
+					}
+
+					return p;
+
+				}
+
+				#include <common>
+
+				void main() {
+
+					vec3 projectedWorldPosition = project();
+
+					#ifdef ENVMAP_TYPE_CUBE
+
+						vec3 outcolor = textureCube( map, projectedWorldPosition ).rgb;
+
+					#else
+
+						vec3 direction = normalize( projectedWorldPosition );
+						vec2 uv = equirectUv( direction );
+						vec3 outcolor = texture2D( map, uv ).rgb;
+
+					#endif
+
+					gl_FragColor = vec4( outcolor, 1.0 );
+
+					#include <tonemapping_fragment>
+					#include <encodings_fragment>
+
+				}
+				`;
+
+		const uniforms = {
+			map: { value: texture },
+			height: { value: options.height || 15 },
+			radius: { value: options.radius || 100 },
+		};
+
+		const geometry = new IcosahedronGeometry( 1, 16 );
+		const material = new ShaderMaterial( {
+			uniforms,
+			fragmentShader,
+			vertexShader,
+			side: DoubleSide,
+		} );
+
+		super( geometry, material );
+
+	}
+
+	set radius( radius ) {
+
+		this.material.uniforms.radius.value = radius;
+
+	}
+
+	get radius() {
+
+		return this.material.uniforms.radius.value;
+
+	}
+
+	set height( height ) {
+
+		this.material.uniforms.height.value = height;
+
+	}
+
+	get height() {
+
+		return this.material.uniforms.height.value;
+
+	}
+
+}
+
+export { GroundProjectedSkybox };

+ 11 - 9
examples/webgl_materials_envmaps_groundprojected.html

@@ -37,7 +37,7 @@
 
 
 			import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
 			import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
 			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
 			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
-			import { GroundProjectedEnv } from 'three/addons/objects/GroundProjectedEnv.js';
+			import { GroundProjectedSkybox } from 'three/addons/objects/GroundProjectedSkybox.js';
 			import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
 			import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
 			import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';
 			import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';
 			import { RGBELoader } from 'three/addons/loaders/RGBELoader.js';
 			import { RGBELoader } from 'three/addons/loaders/RGBELoader.js';
@@ -47,7 +47,7 @@
 				radius: 440
 				radius: 440
 			};
 			};
 
 
-			let camera, scene, renderer, env;
+			let camera, scene, renderer, skybox;
 
 
 			init().then( render );
 			init().then( render );
 
 
@@ -68,9 +68,9 @@
 				const envMap = await hdrLoader.loadAsync( 'textures/equirectangular/blouberg_sunrise_2_1k.hdr' );
 				const envMap = await hdrLoader.loadAsync( 'textures/equirectangular/blouberg_sunrise_2_1k.hdr' );
 				envMap.mapping = THREE.EquirectangularReflectionMapping;
 				envMap.mapping = THREE.EquirectangularReflectionMapping;
 
 
-				env = new GroundProjectedEnv( envMap );
-				env.scale.setScalar( 100 );
-				scene.add( env );
+				skybox = new GroundProjectedSkybox( envMap );
+				skybox.scale.setScalar( 100 );
+				scene.add( skybox );
 
 
 				scene.environment = envMap;
 				scene.environment = envMap;
 
 
@@ -148,8 +148,8 @@
 				controls.update();
 				controls.update();
 
 
 				const gui = new GUI();
 				const gui = new GUI();
-				gui.add( params, 'height', 20, 50, 0.1 ).onChange( render );
-				gui.add( params, 'radius', 200, 600, 0.1 ).onChange( render );
+				gui.add( params, 'height', 20, 50, 0.1 ).name( 'Skybox height' ).onChange( render );
+				gui.add( params, 'radius', 200, 600, 0.1 ).name( 'Skybox radius' ).onChange( render );
 
 
 				//
 				//
 
 
@@ -165,14 +165,16 @@
 
 
 				renderer.setSize( window.innerWidth, window.innerHeight );
 				renderer.setSize( window.innerWidth, window.innerHeight );
 
 
+				render();
+
 			}
 			}
 
 
 			function render() {
 			function render() {
 
 
 				renderer.render( scene, camera );
 				renderer.render( scene, camera );
 
 
-				env.radius = params.radius;
-				env.height = params.height;
+				skybox.radius = params.radius;
+				skybox.height = params.height;
 
 
 			}
 			}
 		</script>
 		</script>