优化雷声

This commit is contained in:
2026-03-28 14:54:14 +08:00
parent 133b99cf04
commit 949390501c
4 changed files with 15 additions and 8 deletions

Binary file not shown.

View File

@@ -13,7 +13,7 @@ import { DEFAULT_SCENE_PARAMS } from './weatherPresets.js';
import { OffshoreWindTurbineAsset } from './objects/OffshoreWindTurbineAsset.js'; import { OffshoreWindTurbineAsset } from './objects/OffshoreWindTurbineAsset.js';
const RAIN_AUDIO_URL = '/audio/rain-calming.mp3'; const RAIN_AUDIO_URL = '/audio/rain-calming.mp3';
const THUNDER_AUDIO_URL = '/audio/thunder-distant.mp3'; const THUNDER_AUDIO_URL = '/audio/thunder-close.mp3';
export class OceanScene { export class OceanScene {
constructor(container) { constructor(container) {
@@ -61,6 +61,7 @@ export class OceanScene {
this.rainAudioCrossfadeDuration = 1.6; this.rainAudioCrossfadeDuration = 1.6;
this.thunderAudioPool = []; this.thunderAudioPool = [];
this.thunderAudioIndex = 0; this.thunderAudioIndex = 0;
this.thunderVolume = DEFAULT_SCENE_PARAMS.thunderVolume;
this.scheduledThunder = []; this.scheduledThunder = [];
this.params = { ...DEFAULT_SCENE_PARAMS }; this.params = { ...DEFAULT_SCENE_PARAMS };
@@ -1802,6 +1803,12 @@ export class OceanScene {
this.params.lightningIntensity = value; this.params.lightningIntensity = value;
} }
setThunderVolume(value) {
const nextValue = THREE.MathUtils.clamp(value, 0, 1);
this.params.thunderVolume = nextValue;
this.thunderVolume = nextValue;
}
applyParams(nextParams = {}) { applyParams(nextParams = {}) {
const mergedParams = { ...DEFAULT_SCENE_PARAMS, ...nextParams }; const mergedParams = { ...DEFAULT_SCENE_PARAMS, ...nextParams };
@@ -1831,6 +1838,7 @@ export class OceanScene {
this.setStarIntensity(mergedParams.starIntensity); this.setStarIntensity(mergedParams.starIntensity);
this.setStarEnabled(mergedParams.starEnabled); this.setStarEnabled(mergedParams.starEnabled);
this.setLightningIntensity(mergedParams.lightningIntensity); this.setLightningIntensity(mergedParams.lightningIntensity);
this.setThunderVolume(mergedParams.thunderVolume);
this.setLightningEnabled(mergedParams.lightningEnabled); this.setLightningEnabled(mergedParams.lightningEnabled);
this.setRainEnabled(mergedParams.rainEnabled); this.setRainEnabled(mergedParams.rainEnabled);
} }
@@ -1904,7 +1912,7 @@ export class OceanScene {
this.thunderAudioIndex += 1; this.thunderAudioIndex += 1;
audio.pause(); audio.pause();
audio.currentTime = 0; audio.currentTime = 0;
audio.volume = THREE.MathUtils.clamp(volume, 0, 1); audio.volume = THREE.MathUtils.clamp(volume * this.thunderVolume, 0, 1);
audio.playbackRate = playbackRate; audio.playbackRate = playbackRate;
const playPromise = audio.play(); const playPromise = audio.play();
if (playPromise?.catch) { if (playPromise?.catch) {

View File

@@ -70,7 +70,8 @@ function setupControls(oceanScene) {
'starEnabled', 'starEnabled',
'starIntensity', 'starIntensity',
'lightningEnabled', 'lightningEnabled',
'lightningIntensity' 'lightningIntensity',
'thunderVolume'
]; ];
const presetComments = { const presetComments = {
elevation: '太阳高度角', elevation: '太阳高度角',
@@ -100,7 +101,8 @@ function setupControls(oceanScene) {
starEnabled: '是否启用星空', starEnabled: '是否启用星空',
starIntensity: '星空强度', starIntensity: '星空强度',
lightningEnabled: '是否启用雷闪', lightningEnabled: '是否启用雷闪',
lightningIntensity: '雷闪强度' lightningIntensity: '雷闪强度',
thunderVolume: '雷声音量'
}; };
const exportActions = { const exportActions = {
@@ -207,14 +209,10 @@ function setupControls(oceanScene) {
const rainFolder = gui.addFolder('雨效'); const rainFolder = gui.addFolder('雨效');
bindController(rainFolder.add(params, 'rainEnabled').name('启用雨效'), (value) => oceanScene.setRainEnabled(value)); bindController(rainFolder.add(params, 'rainEnabled').name('启用雨效'), (value) => oceanScene.setRainEnabled(value));
bindController(rainFolder.add(params, 'rainScreenIntensity', 0, 1.5, 0.01).name('屏幕雨滴'), (value) => oceanScene.setRainScreenIntensity(value));
bindController(rainFolder.add(params, 'rainVeilIntensity', 0.5, 2.5, 0.01).name('雨线强度'), (value) => oceanScene.setRainVeilIntensity(value)); bindController(rainFolder.add(params, 'rainVeilIntensity', 0.5, 2.5, 0.01).name('雨线强度'), (value) => oceanScene.setRainVeilIntensity(value));
bindController(rainFolder.add(params, 'rainDropSize', 0.4, 1.8, 0.01).name('雨滴尺寸'), (value) => oceanScene.setRainDropSize(value));
bindController(rainFolder.add(params, 'rainSpeed', 0.2, 2.5, 0.01).name('速度'), (value) => oceanScene.setRainSpeed(value));
bindController(rainFolder.add(params, 'rainAudioEnabled').name('启用雨声'), (value) => oceanScene.setRainAudioEnabled(value)); bindController(rainFolder.add(params, 'rainAudioEnabled').name('启用雨声'), (value) => oceanScene.setRainAudioEnabled(value));
bindController(rainFolder.add(params, 'rainAudioVolume', 0, 1, 0.01).name('雨声音量'), (value) => oceanScene.setRainAudioVolume(value)); bindController(rainFolder.add(params, 'rainAudioVolume', 0, 1, 0.01).name('雨声音量'), (value) => oceanScene.setRainAudioVolume(value));
bindController(rainFolder.add(params, 'lightningEnabled').name('启用雷闪'), (value) => oceanScene.setLightningEnabled(value)); bindController(rainFolder.add(params, 'lightningEnabled').name('启用雷闪'), (value) => oceanScene.setLightningEnabled(value));
bindController(rainFolder.add(params, 'lightningIntensity', 0, 1.5, 0.01).name('雷闪强度'), (value) => oceanScene.setLightningIntensity(value));
const snowFolder = gui.addFolder('雪效'); const snowFolder = gui.addFolder('雪效');
bindController(snowFolder.add(params, 'snowEnabled').name('启用降雪'), (value) => oceanScene.setSnowEnabled(value)); bindController(snowFolder.add(params, 'snowEnabled').name('启用降雪'), (value) => oceanScene.setSnowEnabled(value));

View File

@@ -28,6 +28,7 @@ export const DEFAULT_SCENE_PARAMS = {
starIntensity: 0.7, starIntensity: 0.7,
lightningEnabled: true, lightningEnabled: true,
lightningIntensity: 0.75, lightningIntensity: 0.75,
thunderVolume: 1.0,
mieCoefficient: 0.005, mieCoefficient: 0.005,
mieDirectionalG: 0.8 mieDirectionalG: 0.8
}; };