DebugEnvironment.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import {
  2. BackSide,
  3. BoxGeometry,
  4. Mesh,
  5. MeshLambertMaterial,
  6. MeshStandardMaterial,
  7. PointLight,
  8. Scene,
  9. } from 'three';
  10. /**
  11. * This class represents a scene with a very basic room setup that can be used as
  12. * input for {@link PMREMGenerator#fromScene}. The resulting PMREM represents the room's
  13. * lighting and can be used for Image Based Lighting by assigning it to {@link Scene#environment}
  14. * or directly as an environment map to PBR materials.
  15. *
  16. * This class uses a simple room setup and should only be used for development purposes.
  17. * A more appropriate setup for production is {@link RoomEnvironment}.
  18. *
  19. * ```js
  20. * const environment = new DebugEnvironment();
  21. * const pmremGenerator = new THREE.PMREMGenerator( renderer );
  22. *
  23. * const envMap = pmremGenerator.fromScene( environment ).texture;
  24. * scene.environment = envMap;
  25. * ```
  26. *
  27. * @augments Scene
  28. */
  29. class DebugEnvironment extends Scene {
  30. /**
  31. * Constructs a new debug environment.
  32. */
  33. constructor() {
  34. super();
  35. const geometry = new BoxGeometry();
  36. geometry.deleteAttribute( 'uv' );
  37. const roomMaterial = new MeshStandardMaterial( { metalness: 0, side: BackSide } );
  38. const room = new Mesh( geometry, roomMaterial );
  39. room.scale.setScalar( 10 );
  40. this.add( room );
  41. const mainLight = new PointLight( 0xffffff, 50, 0, 2 );
  42. this.add( mainLight );
  43. const material1 = new MeshLambertMaterial( { color: 0xff0000, emissive: 0xffffff, emissiveIntensity: 10 } );
  44. const light1 = new Mesh( geometry, material1 );
  45. light1.position.set( - 5, 2, 0 );
  46. light1.scale.set( 0.1, 1, 1 );
  47. this.add( light1 );
  48. const material2 = new MeshLambertMaterial( { color: 0x00ff00, emissive: 0xffffff, emissiveIntensity: 10 } );
  49. const light2 = new Mesh( geometry, material2 );
  50. light2.position.set( 0, 5, 0 );
  51. light2.scale.set( 1, 0.1, 1 );
  52. this.add( light2 );
  53. const material3 = new MeshLambertMaterial( { color: 0x0000ff, emissive: 0xffffff, emissiveIntensity: 10 } );
  54. const light3 = new Mesh( geometry, material3 );
  55. light3.position.set( 2, 1, 5 );
  56. light3.scale.set( 1.5, 2, 0.1 );
  57. this.add( light3 );
  58. }
  59. /**
  60. * Frees internal resources. This method should be called
  61. * when the environment is no longer required.
  62. */
  63. dispose() {
  64. const resources = new Set();
  65. this.traverse( ( object ) => {
  66. if ( object.isMesh ) {
  67. resources.add( object.geometry );
  68. resources.add( object.material );
  69. }
  70. } );
  71. for ( const resource of resources ) {
  72. resource.dispose();
  73. }
  74. }
  75. }
  76. export { DebugEnvironment };
粤ICP备19079148号