CityMaker大气特效

[复制链接]
查看232 | 回复1 | 2019-11-6 17:11:38 | 显示全部楼层 |阅读模式
让天气变化、雾霾、大气飘起来
**

一:技术原理
为了使虚拟展示更加的真实,通常需要模拟一些天气的效果,如雨滴、雪花的实时模拟。 本章将介绍如何使一个普通的三维场景更加的真实。

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)。


————————————————
版权声明:本文为CSDN博主「CITYMAKER_小白」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38476447/article/details/86674751


回复

使用道具 举报

Neajeld | 2020-6-9 21:53:03 | 显示全部楼层
Composition Du Viagra  buy cialis online no prescription Achat Viagra Generique Ligne  <a href=https://cheapcialisir.com/#>buy generic cialis online cheap</a> Potenzmittel Viagra Original  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

6

主题

7

帖子

192

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
192