|
|
@@ -41,7 +41,11 @@ function s3mlayerAttribute(props) {
|
|
|
snowType: '0',
|
|
|
compass: false,
|
|
|
isCompass: '',
|
|
|
- currentTime: defaultTime
|
|
|
+ currentTime: defaultTime,
|
|
|
+ spring: false,
|
|
|
+ summer: false,
|
|
|
+ autumn: false,
|
|
|
+ winter: false
|
|
|
});
|
|
|
|
|
|
state.skyboxSources = {
|
|
|
@@ -88,6 +92,7 @@ function s3mlayerAttribute(props) {
|
|
|
|
|
|
let cloudBox = new Cesium.CloudBox({ url: state.cloudsUrl });
|
|
|
let skyboxs = {}, defaultSkybox;
|
|
|
+ let savedRainParams = null, savedSnowParams = null;
|
|
|
for (let key in state.skyboxSources) {
|
|
|
let skybox = new Cesium.SkyBox({ sources: state.skyboxSources[key] });
|
|
|
skybox.USpeed = state.uspeed;
|
|
|
@@ -217,6 +222,158 @@ function s3mlayerAttribute(props) {
|
|
|
updateSkyEffect(julianTime);
|
|
|
}
|
|
|
|
|
|
+ // 处理季节变化
|
|
|
+ function handleSeasonChange() {
|
|
|
+ if (!viewer) return;
|
|
|
+
|
|
|
+ // 确保只有一个季节被选中
|
|
|
+ const seasons = ['spring', 'summer', 'autumn', 'winter'];
|
|
|
+ let selectedSeason = null;
|
|
|
+
|
|
|
+ seasons.forEach(season => {
|
|
|
+ if (state[season]) {
|
|
|
+ selectedSeason = season;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 如果选中了一个季节,取消其他季节的选中状态
|
|
|
+ if (selectedSeason) {
|
|
|
+ seasons.forEach(season => {
|
|
|
+ if (season !== selectedSeason) {
|
|
|
+ state[season] = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 根据季节设置天气效果
|
|
|
+ switch(selectedSeason) {
|
|
|
+ case 'spring':
|
|
|
+ // 春季:阴天,小雨
|
|
|
+ setSpringWeather();
|
|
|
+ break;
|
|
|
+ case 'summer':
|
|
|
+ // 夏季:晴天,大气雾比较薄
|
|
|
+ setSummerWeather();
|
|
|
+ break;
|
|
|
+ case 'autumn':
|
|
|
+ // 秋季:阴天
|
|
|
+ setAutumnWeather();
|
|
|
+ break;
|
|
|
+ case 'winter':
|
|
|
+ // 冬季:雪
|
|
|
+ setWinterWeather();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 如果没有选中任何季节,重置天气效果
|
|
|
+ resetWeather();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置春季天气:阴天,小雨
|
|
|
+ function setSpringWeather() {
|
|
|
+ // 设置阴天效果
|
|
|
+ viewer.scene.skyAtmosphere.hueShift = 0.1;
|
|
|
+ viewer.scene.skyAtmosphere.saturationShift = -0.3;
|
|
|
+ viewer.scene.skyAtmosphere.brightnessShift = -0.4;
|
|
|
+
|
|
|
+ // 开启小雨效果(直接操作后处理阶段,不修改state参数)
|
|
|
+ viewer.scene.postProcessStages.snow.enabled = false;
|
|
|
+ viewer.scene.postProcessStages.rain.enabled = true;
|
|
|
+
|
|
|
+ // 保存当前雨雪参数,用于恢复
|
|
|
+ savedRainParams = {
|
|
|
+ speed: viewer.scene.postProcessStages.rain.uniforms.speed,
|
|
|
+ angle: viewer.scene.postProcessStages.rain.uniforms.angle
|
|
|
+ };
|
|
|
+
|
|
|
+ // 小雨:比默认雨更小的速度和角度(直接设置后处理参数,不修改state)
|
|
|
+ viewer.scene.postProcessStages.rain.uniforms.speed = 4;
|
|
|
+ viewer.scene.postProcessStages.rain.uniforms.angle = 20;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置夏季天气:晴天,大气雾比较薄
|
|
|
+ function setSummerWeather() {
|
|
|
+ // 设置晴天效果
|
|
|
+ viewer.scene.skyAtmosphere.hueShift = 0.0;
|
|
|
+ viewer.scene.skyAtmosphere.saturationShift = 0.1;
|
|
|
+ viewer.scene.skyAtmosphere.brightnessShift = 0.2;
|
|
|
+
|
|
|
+ // 设置大气雾比较薄
|
|
|
+ state.fogEffect = true;
|
|
|
+ viewer.scene.fog.enabled = true;
|
|
|
+ viewer.scene.fog.density = 0.0001;
|
|
|
+
|
|
|
+ // 关闭雨雪后处理阶段
|
|
|
+ viewer.scene.postProcessStages.rain.enabled = false;
|
|
|
+ viewer.scene.postProcessStages.snow.enabled = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置秋季天气:阴天
|
|
|
+ function setAutumnWeather() {
|
|
|
+ // 设置阴天效果
|
|
|
+ viewer.scene.skyAtmosphere.hueShift = 0.1;
|
|
|
+ viewer.scene.skyAtmosphere.saturationShift = -0.3;
|
|
|
+ viewer.scene.skyAtmosphere.brightnessShift = -0.4;
|
|
|
+
|
|
|
+ // 关闭雨雪后处理阶段
|
|
|
+ viewer.scene.postProcessStages.rain.enabled = false;
|
|
|
+ viewer.scene.postProcessStages.snow.enabled = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置冬季天气:大雪
|
|
|
+ function setWinterWeather() {
|
|
|
+ // 设置阴天效果
|
|
|
+ viewer.scene.skyAtmosphere.hueShift = 0.1;
|
|
|
+ viewer.scene.skyAtmosphere.saturationShift = -0.3;
|
|
|
+ viewer.scene.skyAtmosphere.brightnessShift = -0.4;
|
|
|
+
|
|
|
+ // 开启大雪效果(直接操作后处理阶段,不修改state参数)
|
|
|
+ viewer.scene.postProcessStages.rain.enabled = false;
|
|
|
+ viewer.scene.postProcessStages.snow.enabled = true;
|
|
|
+
|
|
|
+ // 保存当前雪参数,用于恢复
|
|
|
+ savedSnowParams = {
|
|
|
+ density: viewer.scene.postProcessStages.snow.uniforms.density,
|
|
|
+ speed: viewer.scene.postProcessStages.snow.uniforms.speed,
|
|
|
+ angle: viewer.scene.postProcessStages.snow.uniforms.angle
|
|
|
+ };
|
|
|
+
|
|
|
+ // 大雪:比默认雪更大的密度和速度(直接设置后处理参数,不修改state)
|
|
|
+ viewer.scene.postProcessStages.snow.uniforms.density = 20;
|
|
|
+ viewer.scene.postProcessStages.snow.uniforms.speed = 10;
|
|
|
+ viewer.scene.postProcessStages.snow.uniforms.angle = 10;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 重置天气效果
|
|
|
+ function resetWeather() {
|
|
|
+ // 重置大气效果
|
|
|
+ viewer.scene.skyAtmosphere.hueShift = 0.0;
|
|
|
+ viewer.scene.skyAtmosphere.saturationShift = 0.0;
|
|
|
+ viewer.scene.skyAtmosphere.brightnessShift = 0.0;
|
|
|
+
|
|
|
+ // 重置雾效果
|
|
|
+ state.fogEffect = true;
|
|
|
+ viewer.scene.fog.enabled = true;
|
|
|
+ viewer.scene.fog.density = 0.0002;
|
|
|
+
|
|
|
+ // 关闭雨雪后处理阶段
|
|
|
+ viewer.scene.postProcessStages.rain.enabled = false;
|
|
|
+ viewer.scene.postProcessStages.snow.enabled = false;
|
|
|
+
|
|
|
+ // 恢复雨雪参数到之前保存的值(如果有保存的话)
|
|
|
+ if (savedRainParams) {
|
|
|
+ viewer.scene.postProcessStages.rain.uniforms.speed = savedRainParams.speed;
|
|
|
+ viewer.scene.postProcessStages.rain.uniforms.angle = savedRainParams.angle;
|
|
|
+ savedRainParams = null;
|
|
|
+ }
|
|
|
+ if (savedSnowParams) {
|
|
|
+ viewer.scene.postProcessStages.snow.uniforms.density = savedSnowParams.density;
|
|
|
+ viewer.scene.postProcessStages.snow.uniforms.speed = savedSnowParams.speed;
|
|
|
+ viewer.scene.postProcessStages.snow.uniforms.angle = savedSnowParams.angle;
|
|
|
+ savedSnowParams = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (storeState.isViewer) {
|
|
|
defaultSkybox = viewer.scene.skyBox;
|
|
|
viewer.scene.postRender.addEventListener(initialSkyBox);
|
|
|
@@ -353,7 +510,61 @@ function s3mlayerAttribute(props) {
|
|
|
state.compass = val ? 'Sm3dCompass' : '';
|
|
|
});
|
|
|
|
|
|
- return { ...toRefs(state), handleTimeChange };
|
|
|
+ // 监听季节变化
|
|
|
+ watch(() => state.spring, val => {
|
|
|
+ if (val) {
|
|
|
+ state.summer = false;
|
|
|
+ state.autumn = false;
|
|
|
+ state.winter = false;
|
|
|
+ handleSeasonChange();
|
|
|
+ } else {
|
|
|
+ // 如果所有季节都未选中,重置天气
|
|
|
+ if (!state.summer && !state.autumn && !state.winter) {
|
|
|
+ resetWeather();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ watch(() => state.summer, val => {
|
|
|
+ if (val) {
|
|
|
+ state.spring = false;
|
|
|
+ state.autumn = false;
|
|
|
+ state.winter = false;
|
|
|
+ handleSeasonChange();
|
|
|
+ } else {
|
|
|
+ if (!state.spring && !state.autumn && !state.winter) {
|
|
|
+ resetWeather();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ watch(() => state.autumn, val => {
|
|
|
+ if (val) {
|
|
|
+ state.spring = false;
|
|
|
+ state.summer = false;
|
|
|
+ state.winter = false;
|
|
|
+ handleSeasonChange();
|
|
|
+ } else {
|
|
|
+ if (!state.spring && !state.summer && !state.winter) {
|
|
|
+ resetWeather();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ watch(() => state.winter, val => {
|
|
|
+ if (val) {
|
|
|
+ state.spring = false;
|
|
|
+ state.summer = false;
|
|
|
+ state.autumn = false;
|
|
|
+ handleSeasonChange();
|
|
|
+ } else {
|
|
|
+ if (!state.spring && !state.summer && !state.autumn) {
|
|
|
+ resetWeather();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ return { ...toRefs(state), handleTimeChange, handleSeasonChange };
|
|
|
};
|
|
|
|
|
|
export default s3mlayerAttribute;
|