智慧城市美术效果Unity实现笔记流程:

参考 对标 效果图:

        参考资料:

                方案一:

                         Blender GIS 获取城市 房屋道路等数据视频教程(B站)

                        安装BlenderGIS插件

                        落叶大师智慧城市效果解析

               方案二:

                     

                    Blender OSM 获取城市房屋道路等数据视频教程(B站)

                   

                    OSM插件Github官方使用文档 + 下载安装BlenderOSM插件

                     Prochitecture.com地图网站(防止打不开时使用)

                   

                     Github 导入地形  出现 403-503 等 报错问题反馈页面 

                               >>对于Terrain和建筑出现Server问题提示,可参考下图:

                

                           

                     Blender 城市生成器:Buildify、Blosm 和 OSM 组合(Blender 中的免费建筑)

                       (在Blender中 利用OSM生成 城市建筑轮廓,再Buildify+Blosm根据轮廓自动化生成完整建筑)

               如图所示:

               方案三:

                        CityEngine2022地块生成

                     

                        

        写实类-参考图:

(以上均为网络搜索效果,有落叶大师,以及其他优秀开发者效果图参考)

        未来类-参考图:

智慧城市可视化-案例

如上图所示,智慧城市基本分为 这两个大类,偏写实风,偏未来风,也有互相结合的效果。

一、实现思路大纲:

二、实操环节(方案1):

1、软件准备/环境配置:
        1)、Blender软件安装:

                软件官方下载地址/使用文档教程:Blender 3.5 参考手册 — Blender Manual

        2)、为Blender安装GIS插件:

                Blender-GIS插件下载地址:                 

                                https://github.com/domlysz/BlenderGIS

                Blender-GIS的安装参考视频:

                                iBlender中文版插件GIS 教程Blender GIS 插件Blender_哔哩哔哩_bilibili

                这里我在安装过程中遇到了,缺少imageIO模组的问题 : "No imageIO module"。也就是点击BaseMap之后,打印窗口提示错误信息,所以翻阅了Domlysz为这个工具开启的BlenderGIS问题反馈页,发现是安装插件后,因缺少.dll的文件引起的。

缺少的.dll文件,可以在这里下载

                (我是吧所有文件夹都下载下来了,防止因为缺少内容继续报错)。

                下载后,需要复制到指定位置下,通常在这个位置下:

替换位置:

C:\Users\你的用户名\AppData\Roaming\BlenderFoundation\Blender\3.5\scripts\addons\BlenderGIS-master\core\lib\imageio\resources\freeimage

将压缩包解压后,找到freeimage的文件夹,整体复制后,替换掉原有文件夹即可。

如果中间没有 某个文件夹结构的话,自己新建一个即可。

2、获取GIS城市数据:
         1)、注册OpenTopographyAPIKey:

                进入网站后根据提示,进行注册即可,注意,这个网站在注册过程中,需要注意IP地址,开始的时候我在电脑的IP下进行注册,区域是大陆IP,邮箱收不到验证码,后来换成在手机上选择非大陆地区的科学入网后,收到了验证码。

           复制API Key 到 下图 API key 文本框 中。

2)、选择GIS下载区域:

        在上述内容配置好后,重启Blender,并开启科学入网后,点击Basemap按钮,进行地图获取。

        单机后,会出现以下窗口,红框框选部分OSM,Bing,Esri经测试,是可用状态,Google选项,不知为何,始终是加载不出来任何数据的。

        这里我们确定,选择Esri的地图数据,会出现下图界面。

        快捷键G 获取地图位置,用拼音即可搜索,这里精度小一些设为12。

        

        定位到指定位置后,需要注意窗口范围不要过大,否则是无法工作的,会报数据太大的错,所以尽量控制城市区域范围。        

        快捷键E 裁切可视区域 ,裁切后,会发现GIS按钮重新出现了,开始进行下一步,生成,建筑,河流,公路等提供数据的内容。

        点击Get OMS按钮,开始下载载入上述数据。

按住Shift + 鼠标左键,进行 填入数据加选。

单击确定后,开始载入 数据,数据量根据每个地区所选不同,完整度也所不同,加载速度也不一样。

        这里以北京城区数据为例,数据相对丰富。 

3)、设置地形高度:

        点击选择地形对象,Get elevation获取地形高度。

这里选择第三个选项,其他选项经测试,没有明显效果。

确定后,根据真实地理情况,会生成地面的高度。

3、非主区域/道路建筑贴图:
        1)、建筑贴图指定:

                1、环境天空贴图:

选择一个全景图。

                 

        选择全景图之后,在切换渲染模式为 视图着色模式, 就可以看到 天空盒了。

       

                2、白膜建筑贴图:

 选择面:

 1、编辑模式下,选择建筑白膜,并在 选择 >>选择相似>>法向按钮,点击后会全选所有白模 建筑。

这个时候  Ctrl + i  进行反选,因为选中白模中墙面的面,才是主要目的,因为我们要对墙面 添加材质和贴图。

创建材质,并赋贴图:

1、打开 材质编辑窗口:并新建一个材质球,为材质球命名。

打开材质编辑窗口,为材质添加一个贴图。

选择一张 建筑外立面的无缝贴图。

选择UV分布方式:为  块面投影  并设置 UV 大小,这里设为15的精度。

(数小UV越大,数大UV越小) 这里实际可以小一些,因为要进unity中可以修改Telline的参数修改。

但是这个时候我们发现,全部的楼都是一个贴图,看起来很别扭,那么Blender中可以通过面来随机选择一些对象,分别指定材质,进行不同楼不同材质的区分。

再次创建一个材质,并赋予其他楼层外立面贴图。

新建好几个不同建筑外立面材质后,按上面操作,指定不同贴图。 

选择>>随机选择 建筑外立面:随机选中个数,这里设为0.002.

为选中部分模型,指定不同 外立面贴图。

     

            Shift+H可以孤立显示,配合材质替换多种建筑贴图。

    2)、道路生成+贴图指定:

        因道路数据原本就是线段,并不是模型,所以,需要先根据线,生成道路。

        注意先切换为对象模式快捷键 TAB.

   创建道路横截面:

        Shift + A  : 创建  曲线 >> Nurbs 曲线。 

查看所选(快速定位) 快捷键  ` 

编辑模式下快捷键V(设置控制柄类型) 切换为>> 矢量.

选中大纲视图中,选择heightway,然后 快捷键 鼠标右键转换到>>曲线。

这时,工具栏会出现这个图标,选中highway,后,为几何数据下,对象中,指定曲线

这样的话,就有了宽度。

选中曲线在物体属性面板中,找到缩放X,并调节参数,会发现 道路变宽了


为道路添加贴图:

        选择曲线,新建一个材质球,并命名,为道路寻找一张 如下图类似的公路贴图。

指定后,选择highway,为路面添加材质贴图。

为路面指定材质。

这个时候就可以看到路面被赋予了公路的贴图。

当然这里可以看到 贴图有拉伸,可以在这个窗口来修改UV拉伸状况。

可以明显看到中间的差别。

        3)、Blender中的操作基本完成,选择需要导出的对象,进行导出,导出FBX或其他unity识别的3D文件,即可。

                那么以上,就是Blender中全部的处理内容,接下来,选中需要导出的网格模型,导出FBX即可导入到Unity中,开始在Unity中处理效果。

4、Unity中为不同内容类型添加shader:
        1)、非主区域shader使用:

       
Shader "Unlit/Sc02_BuildSF"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _EmisTex("EmisTex",2D)="white"{}
        [HDR]_EmisCol("RGB:自发光色彩 A:强度",Color) = (1,1,1,1)
        _Cutout("透贴",Range(0,1))=0.5
    }
    SubShader
    {
        Tags { 
             "Queue"="Transparent"
             "RenderType"="Transparent" 
 
             }
        LOD 100
         //---------------主贴图------------------
        Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
 
            Blend One OneMinusSrcAlpha
 
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_instancing
            #include "UnityCG.cginc"
            #pragma multi_compile_fwdbase_fullshadows
            #pragma target 3.0
            UNITY_INSTANCING_BUFFER_START( Props )
               // UNITY_DEFINE_INSTANCED_PROP( float4, _Color)
            UNITY_INSTANCING_BUFFER_END( Props )
            
            uniform sampler2D _MainTex;uniform float4 _MainTex_ST;
            uniform sampler2D _EmisTex;uniform float4 _EmisTex_ST;
            uniform float4 _EmisCol;
            uniform float _Cutout;
            //输入结构
            struct VertexInput
            {
                float4 vertex : POSITION;
                float2 uv0 : TEXCOORD0;
                float2 uv1 : TEXCOORD1;
            };
            //顶点输出结构
            struct VertexOutput 
            {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
                float2 uv1 : TEXCOORD1;
            };
            //输出结构>>>顶点shader>>>输出结构
            VertexOutput vert (VertexInput v) 
            {
                VertexOutput o = (VertexOutput)0;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv0 = TRANSFORM_TEX (v.uv0,_MainTex);
                o.uv1 = TRANSFORM_TEX (v.uv1,_EmisTex);
                return o ;
            }
            //色彩输出结构
            float4 frag(VertexOutput i) : COLOR 
            {
                float4 var_mainTex = tex2D(_MainTex,i.uv0);
                float4 var_emisTex = tex2D(_EmisTex,i.uv1);
                float4 emisTexCol = var_emisTex * _EmisCol;
                float opacity = var_mainTex.a * _Cutout;
                float3 finalRGB = var_mainTex * emisTexCol * opacity;
                return float4(finalRGB,opacity);//输出最终颜色
            }
            ENDCG
        }

    }
}
2)、道路区域Shader使用:
        3)、主要建筑Shader使用:Fake interior Mapping 实现,室内映射效果

        

        参考资料:

        【Unity奇技】我必须控诉这个粉丝的行为! Fake Interior/ InteriorMapping_哔哩哔哩_bilibili

        案例学习——Interior Mapping 室内映射(假室内效果)_ue室内 漫反射-CSDN博客

        已学习的教程,思路。

        https://www.youtube.com/watch?v=rC4BHR-Cx0s        

        节点SG下载链接:Fake Interior URP Graph for Unity by AETuts

        参考实现方案:https://drive.google.com/file/d/1Oc1wct5qZQVksUkym9pvU_0CaVMM1dke/view?pli=1

        

        [Unity] ShaderGraph实现伪室内效果,性能大解放 | 编程之家

        

        ↑👆↑👆↑👆↑👆↑👆上述源文件下载链接

                超龄魔法少女-CSDN博客

           

        

        窗户内贴图选择下载链接:https://www.artstation.com/artwork/Pm2wo4

        


三、实操环节(方案2):

1、软件准备/环境配置:
        1)、为Blender安装OSM插件:

                Blender-OSM插件下载地址:                 

                          https://prochitecture.gumroad.com/l/blender-osm

                          OSM下载直通车(2.7.5版本)         

                      

                         

                Blender-GIS的安装参考视频 + 官方文档:

                              Blender OSM 获取城市房屋道路等数据视频教程(B站)

                              Documentation · vvoovv/blosm Wiki · GitHub

                           

2、获取OSM城市数据:

         0)、注册Proton.me邮箱 :(xxx_@proton.me)

                   <这里用这个邮箱注册,可以省略掉一些银行卡验证>

                   邮箱申请链接:https://proton.me/mail

                   邮箱申请教程:mapbox注册教程_哔哩哔哩_bilibili

               首先要注意输入网址的域名,需要带mail的后缀,只需要手机号验证即可。

输入手机验证,通过后,邮箱注册完成。

         1)、注册MapBox地图盒子密钥Tokens(超链接为网址)

                   

        输入刚刚申请的邮箱,开始注册,这个邮箱的好处是,可以省去绑定各种银行卡以及繁杂的个人信息。

        创建地图盒子账户>>

 

向你的邮箱发送了验证

在邮箱中确认验证 , 即注册成功。

     
   2)、输入Tokens,修改插件脚本 网址:

        进入个人中心,申请创建一个Tokens:

         

           进入Blnder,在<编辑> <设置偏好>中,打开插件窗口:

   

指定好缓存位置,和输入通行证后,测试插件是否可以正常下载 <地形+道路+贴图>

         3)、测试_划定选择坐标区域,并依次下载    (地形>>道路房屋数据>>贴图数据)

                <为什么要依次下载?是因为,道路房屋数据,是根据Terrain高度来进行放置的,如先下载道路房屋数据,那么他们的放置位置则都为一个平面>

                

                1、选择地图底图和位置:

                2、首先选择 地形文件 进行下载导入,导入后修改视图范围,以免看不全地形:

PS:这里在我测试过程中,在导入Terrain时,出现了 503 sverver 的错误提示,原因有两个方面原因:

                ①、首先检查自己的网络环境是否正常。

                ②、网络环境正常情况下,需要到OSM插件脚本中,测试关联网址是否可以正常访问。

           **          Prochitecture.com地图网站(防止打不开时使用)

           **         Github 导入地形  出现 403-503 等 报错问题反馈页面 

                               >>对于Terrain和建筑出现Server问题提示,可参考下图:

                

脚本的位置,可以在下图的插件中,找到关键脚本位置,但注意脚本名为<blender.py>

打开脚本后测试脚本中的网址,网络环境正常情况下,可以正常访问,则不需要修改,如不能正常访问,则可按照上述问题描述中,在http + s   测试,在加S后,可正常打开网址,即可关闭脚本。

修改完成后,关闭Blender,重新启动。

        3、这时,我们导入了一个区域的地形

         4、地形导入后,切换下载导入项,开始导入 建筑+房屋+道路等等信息

    5、切换选项导入贴图,在下属选项中,可以选择 GIS,也可以选额 OSM, MapBox前提是有对应的密钥,密钥获取我们在本文章也有介绍了。

开始下载提示:

下载完成后,切换现实模式,看到贴图下载完成:

3、利用OSM 城市轮廓数据,使用Buildify+Blosm插件,自动化生成完整建筑

       

        1)、Buildify  插件 下载 Buldify下载直通车

                下载到 固定 插件 存放 位置

        2)、新建场景,并OSM中确认坐标,1-切换2D,2-Nodes填入Buildify,3-名称选Building

确认后点击Import按钮。

                

文件:选择我们下载好的 Buildfy.blend插件。

Import按下后,稍等一会儿加载完成,

这时,我们会发现,建筑物根据2D的标线,生成了建筑物。

3)、对2D标线编辑, 自动同步建筑物:

        视频参考链接:(1:58 编辑部分)

        https://www.youtube.com/watch?v=Ty6lvN_ONXA

        

编辑前先 隐藏建筑物

Tab键,切换编辑模式

1-2-3键 顶点 线段  对象 选择

       这里 我们做一个 小缩放,

开启建筑物显示:

修改前:

修改后:

整体效果:

4)、在 Quixel Megascans 中引用资源,实现定制化房屋效果:(本节3:11分视频参考)

下载后,将新的模型文件,放置在 Blender 的Node文件中,

文件分了,顶 + 中面 + 底面  +  附近,几个组,按照要求放入即可。

四、实操环节(方案3):

1、软件准备/环境配置:

下载Unity工具插件:TerraLand

      链接:

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐