其他分享
首页 > 其他分享> > 【二次开发】CityMaker大气特效

【二次开发】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