【二次开发】CityMaker大气特效
作者:互联网
**
让天气变化、雾霾、大气飘起来
**
一:技术原理
为了使虚拟展示更加的真实,通常需要模拟一些天气的效果,如雨滴、雪花的实时模拟。 本章将介绍如何使一个普通的三维场景更加的真实。
CityMaker采用粒子特效来模拟天气的效果,有关粒子特效,会在后面逐步介绍。
主要接口:
ISkyBox.Weather属性,主要可以设置以下7种天气:
gviWeatherSunShine 晴天
gviWeatherLightRain 小雨
gviWeatherModerateRain 中雨
gviWeatherHeavyRain 大雨
gviWeatherLightSnow 小雪
gviWeatherModerateSnow 中雪
gviWeatherHeavySnow 大雪
ISkyBox.FogMode属性,主要可以设置以下4种效果:
gviFogNone 不启用雾效(默认值)
gviFogExp 雾效应呈指数增加
gviFogExp2 雾效应随距离的平方呈指数增加
gviFogLinear 雾效应在起始点和终点之间呈线性增加
详情请参考SDKHelp中的ISkyBox接口。
二:实现步骤
1. .Net步骤
(1)设置天气模式
private void setWeatherMode(string modeName)
{
switch(modeName)
{
case "晴天":
this.axRenderControl1.ObjectManager.GetSkyBox(0).Weather = gviWeatherType.gviWeatherSunShine;//设置第一个视口的天气效果为晴天
break;
case "小雨":
this.axRenderControl1.ObjectManager.GetSkyBox(0).Weather = gviWeatherType.gviWeatherLightRain;
break;
case "中雨":
this.axRenderControl1.ObjectManager.GetSkyBox(0).Weather = gviWeatherType.gviWeatherModerateRain;
break;
case "大雨":
this.axRenderControl1.ObjectManager.GetSkyBox(0).Weather = gviWeatherType.gviWeatherHeavyRain;
break;
case "小雪":
this.axRenderControl1.ObjectManager.GetSkyBox(0).Weather = gviWeatherType.gviWeatherLightSnow;
break;
case "中雪":
this.axRenderControl1.ObjectManager.GetSkyBox(0).Weather = gviWeatherType.gviWeatherModerateSnow;
break;
case "大雪":
this.axRenderControl1.ObjectManager.GetSkyBox(0).Weather = gviWeatherType.gviWeatherHeavySnow;
break;
}
}
(2)设置雾效果
private void setFogMode(string modeName)
{
ISkyBox skybox = this.axRenderControl1.ObjectManager.GetSkyBox(0);
switch(modeName)
{
case "在起始点和终点之间呈线性增加":
skybox.FogStartDistance = 0; //雾线性递增开始时的距离,此时雾浓度为0,该距离指场景原点至视点的距离
skybox.FogEndDistance = 500; //雾线性递增结束的的距离(必须大于FogStartDistance),此时雾浓度为100,值越大则表示需在视点越高的情况下才能观察到越浓的雾
skybox.FogMode = gviFogMode.gviFogLinear;
break;
case "呈指数增加":
skybox.FogMode = gviFogMode.gviFogExp;
break;
case "随距离的平方呈指数增加":
skybox.FogMode = gviFogMode.gviFogExp2;
break;
case "关闭雾效":
skybox.FogMode = gviFogMode.gviFogExp2;
break;
}
}
(3)雾霾模拟
改变雾的颜色即可模拟现实中雾霾的效果。
private void setSmog()
{
ISkyBox skybox = this.axRenderControl1.ObjectManager.GetSkyBox(0);
skybox.FogStartDistance = 0;
skybox.FogEndDistance = 500;
skybox.FogMode = gviFogMode.gviFogLinear;
skybox.FogColor = 0xCCCC66; //设置雾颜色
}
2. JS步骤
(1)设置天气模式
function changeWeather(modeName) {
var skyboxObj = __g.objectManager.getSkyBox(0); //获取第一个天空盒子
switch(modeName){
case "晴天":
skyboxObj.weather = 0; // 0:gviWeatherType.gviWeatherSunShine
break;
case "小雨":
skyboxObj.weather = 1; // 1:gviWeatherType.gviWeatherLightRain
break;
case "中雨":
skyboxObj.weather = 2; // 2:gviWeatherType.gviWeatherModerateRain
break;
case "大雨":
skyboxObj.weather = 3; // 3:gviWeatherType.gviWeatherHeavyRain
break;
case "小雪":
skyboxObj.weather = 4; // 4:gviWeatherType.gviWeatherLightSnow
break;
case "中雪":
skyboxObj.weather = 5; // 5:gviWeatherType.gviWeatherModerateSnow
break;
case "大雪":
skyboxObj.weather = 6; // 6:gviWeatherType.gviWeatherHeavySnow
break;
}
}
(2)设置雾效果
/*设置线性的雾效果 */
function setFog(modetype){
var skyboxObj = __g.objectManager.getSkyBox(0); //获取第一个天空盒子
switch(modeName)
{
case "0"://在起始点和终点之间呈线性增加
skyboxObj.fogStartDistance = 0; //雾线性递增开始时的距离,此时雾浓度为0
skyboxObj.fogEndDistance = 500; //雾线性递增结束的的距离(必须大于FogStartDistance),此时雾浓度为100
skyboxObj.fogMode = 3; // 3:gviFogMode.gviFogLinear
break;
case "1"://呈指数增加
skyboxObj.fogMode = 1; // 1:gviFogMode.gviFogExp
break;
case "2"://随距离的平方呈指数增加
skyboxObj.fogMode = 2; // 2:gviFogMode.gviFogExp2
break;
case "3"://关闭雾效
skyboxObj.fogMode = 0; // 0:gviFogMode.gviFogNone
break;
}
}
(3)雾霾模拟
/* 雾霾模拟 */
function setMoge(){
var skyboxObj = __g.objectManager.getSkyBox(0);
skyboxObj.fogStartDistance = 0;
skyboxObj.fogEndDistance = 500;
skybox.fogMode = 3; //设置雾效果为线性增长
skyboxObj.fogColor = 0xCCCC66; //设置雾颜色
}
三:注意事项
具体的雾效果与设置的距离、场景复杂程度有关。
若无法显示雾效果,原因可能是设置了线性递增(gviFogMode.gviFogLinear),而没有设置模拟的起点(fogStartDistance)与终点(fogEndDistance)。
标签:case,特效,CityMaker,gviFogMode,break,skybox,gviWeatherType,skyboxObj,二次开发 来源: https://blog.csdn.net/weixin_38476447/article/details/86674751