sky.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import * as THREE from 'https://cdn.jsdelivr.net/npm/[email protected]/build/three.module.js';
  2. import {Sky} from 'https://cdn.jsdelivr.net/npm/[email protected]/examples/jsm/objects/Sky.js';
  3. import {Water} from 'https://cdn.jsdelivr.net/npm/[email protected]/examples/jsm/objects/Water.js';
  4. export const sky = (function() {
  5. class TerrainSky {
  6. constructor(params) {
  7. this._params = params;
  8. this._Init(params);
  9. }
  10. _Init(params) {
  11. const waterGeometry = new THREE.PlaneBufferGeometry(10000, 10000, 100, 100);
  12. this._water = new Water(
  13. waterGeometry,
  14. {
  15. textureWidth: 2048,
  16. textureHeight: 2048,
  17. waterNormals: new THREE.TextureLoader().load( 'resources/waternormals.jpg', function ( texture ) {
  18. texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
  19. } ),
  20. alpha: 0.5,
  21. sunDirection: new THREE.Vector3(1, 0, 0),
  22. sunColor: 0xffffff,
  23. waterColor: 0x001e0f,
  24. distortionScale: 0.0,
  25. fog: undefined
  26. }
  27. );
  28. // this._water.rotation.x = - Math.PI / 2;
  29. // this._water.position.y = 4;
  30. this._sky = new Sky();
  31. this._sky.scale.setScalar(10000);
  32. this._group = new THREE.Group();
  33. //this._group.add(this._water);
  34. this._group.add(this._sky);
  35. params.scene.add(this._group);
  36. params.guiParams.sky = {
  37. turbidity: 10.0,
  38. rayleigh: 2,
  39. mieCoefficient: 0.005,
  40. mieDirectionalG: 0.8,
  41. luminance: 1,
  42. };
  43. params.guiParams.sun = {
  44. inclination: 0.31,
  45. azimuth: 0.25,
  46. };
  47. const onShaderChange = () => {
  48. for (let k in params.guiParams.sky) {
  49. this._sky.material.uniforms[k].value = params.guiParams.sky[k];
  50. }
  51. for (let k in params.guiParams.general) {
  52. this._sky.material.uniforms[k].value = params.guiParams.general[k];
  53. }
  54. };
  55. const onSunChange = () => {
  56. var theta = Math.PI * (params.guiParams.sun.inclination - 0.5);
  57. var phi = 2 * Math.PI * (params.guiParams.sun.azimuth - 0.5);
  58. const sunPosition = new THREE.Vector3();
  59. sunPosition.x = Math.cos(phi);
  60. sunPosition.y = Math.sin(phi) * Math.sin(theta);
  61. sunPosition.z = Math.sin(phi) * Math.cos(theta);
  62. this._sky.material.uniforms['sunPosition'].value.copy(sunPosition);
  63. this._water.material.uniforms['sunDirection'].value.copy(sunPosition.normalize());
  64. };
  65. const skyRollup = params.gui.addFolder('Sky');
  66. skyRollup.add(params.guiParams.sky, "turbidity", 0.1, 30.0).onChange(
  67. onShaderChange);
  68. skyRollup.add(params.guiParams.sky, "rayleigh", 0.1, 4.0).onChange(
  69. onShaderChange);
  70. skyRollup.add(params.guiParams.sky, "mieCoefficient", 0.0001, 0.1).onChange(
  71. onShaderChange);
  72. skyRollup.add(params.guiParams.sky, "mieDirectionalG", 0.0, 1.0).onChange(
  73. onShaderChange);
  74. skyRollup.add(params.guiParams.sky, "luminance", 0.0, 2.0).onChange(
  75. onShaderChange);
  76. const sunRollup = params.gui.addFolder('Sun');
  77. sunRollup.add(params.guiParams.sun, "inclination", 0.0, 1.0).onChange(
  78. onSunChange);
  79. sunRollup.add(params.guiParams.sun, "azimuth", 0.0, 1.0).onChange(
  80. onSunChange);
  81. onShaderChange();
  82. onSunChange();
  83. }
  84. Update(timeInSeconds) {
  85. this._water.material.uniforms['time'].value += timeInSeconds;
  86. this._group.position.x = this._params.camera.position.x;
  87. this._group.position.z = this._params.camera.position.z;
  88. }
  89. }
  90. return {
  91. TerrainSky: TerrainSky
  92. }
  93. })();