ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DEM数据到三维地形:Blender全流程制作教程

DEM数据到三维地形:Blender全流程制作教程 1. 核心思路为什么能用DEM搞出三维地形1.1 DEM到底存了什么先花一分钟把概念讲清楚因为很多从Blender这边过来的朋友第一次拿到DEM数据时完全是懵的——这不就是一张黑白图吗怎么就成地形了DEM数字高程模型本质上是一个栅格数据每个像素存储的不是颜色而是这一格地面距离参考面通常是海平面的高度值。一个像素对应地面上一个真实的范围比如30米乘30米或者90米乘90米这个尺寸叫分辨率。所以DEM图面上每个点的明暗代表的是这一格地势的高低越亮越高越暗越低。你用看图软件打开一张DEM的TIF文件看到的只是一张灰蒙蒙的图这是正常的因为它的“rgb”通道被映射成了高度值显示。这里就引出第一个关键点TIF格式在这里不是一个花瓶容器。它可能是GeoTIFF里面除了像素高度数据之外还记录了坐标系、投影参数、地面分辨率、地图范围等一整套地理参考信息。也就是说它不只是一张图而是一张带着空间坐标的图。这个特性对后续的比例处理非常关键后面我会单独讲。顺便也把概念理一下DSM数字表面模型和DEM不太一样。DEM是裸露地表的高程DSM是包含建筑、树木等地物顶部的高程。做地形三维模型一般用DEM如果要做城市建筑群或者植被覆盖地区的表面模型那用DSM也可以但出来的边缘会比较乱因为树冠和房顶会连成一片。我们这篇文章以DEM为主线DSM的处理逻辑基本一样就是表面细节变多置换出来会更毛糙。1.2 为什么选Blender做这事而不是ArcScene或QGIS做三维地形传统GIS软件也能干。ArcScene能做QGIS装个插件也能看个大概但它们的渲染能力、材质系统和输出控制都太弱了出来的模型大多是灰扑扑的色块想做一张像样的地形图或者交互动画非常吃力。Blender的优势在于它本身就是一个完整的数字内容创作工具链。模型、材质、灯光、动画、渲染甚至视频剪辑都在一个软件里。地形建完之后你不是只能干瞪眼看一个静态模型而是可以直接给它合成卫星影像贴图、做早晚光照变化动画、输出带有海拔配色的分析图、导出给游戏引擎或3D打印。代价是什么Blender完全不认识地理坐标。它不知道经纬度不理解UTM投影更不懂“这个DEM范围是东西10公里、南北8公里”是什么意思。它只知道你给我一张黑白图我按灰度值把顶点抬起来。所以我们需要在进入Blender之前把地理信息处理成Blender能理解的东西——一张比例正确、宽高比正确的灰度图。这是整个流程里最核心的一步。1.3 整个流程一句话总结先下载DEM数据在GIS软件里做投影转换、裁剪、灰度拉伸导出成一张比例正确的黑白图然后导入Blender用置换或顶点位移的方式把灰度图变成地形网格再叠加卫星图或风格化配色最后渲染或导出。每一个环节都不难但顺序错了或者比例没控制好后面返工的滋味非常酸爽。提示论文、工程汇报或地形分析场景下建议保留原始DEM数据经投影转换信息后续用Blender做出模型后再回贴标注或坐标参考避免甲方问“你这个小山头在哪个位置”时无法回答。2. 数据准备与预处理一半时间花在这关2.1 DEM数据从哪里获取做这个项目第一步是拿到数据。常用公开数据源其实不少我按易用程度排个序。首推USGS EarthExplorer这是美国地质调查局的地学数据下载平台全球很多区域的DEM数据都能在这里找到。它有点像一个地学数据超市你画一个范围框选好卫星或数据集比如SRTM、ASTER GDEM以及一些更高分辨率的高程数据集它就列出该区域可下载的影像和DEM。下载时注意选“GeoTIFF”格式选好投影信息一并用压缩包得到不要下载成JPEG或PNG——那会丢失高程精度和坐标信息。其次是NASA EarthdataNASA的很多地形数据比如NASADEMSRTM的再处理版本就在这上面。它跟USGS有点像检索体系更科研一些第一次上手可能需要一点耐心。如果不想折腾注册和选框下载还有一个相对偷懒的办法AWS Terrain Tiles。这是一个把全球地形数据切成了瓦片、可以直接按需要的区域拼接下载的数据服务。对做可视化来说非常好用得到的文件已经是处理好的高程瓦片省掉了很多裁剪合并的功夫。但它面向的对象更偏开发者和数据工程师命令行的操作方式可能劝退一部分纯设计背景的朋友。下载的时候注意看几个要素分辨率一般有30米、90米可选更高精度数据有10米甚至1米的但覆盖范围小下载量大、坐标系很多原始数据是WGS84经纬度坐标系需要后续处理、以及云量或空洞情况有些地区原始数据有NoData空洞显示为黑色区域。我个人的选择习惯是如果只是做可视化展示90米分辨率足够用了一个范围不大的流域几兆文件搞定Blender处理起来毫无压力。如果要做高精度的地形分析或近景特写那就上30米甚至更高分辨率的。具体取舍看你的目标用途没有绝对标准。2.2 坐标与比例设置比例不对一切白费拿到DEM后最容易被忽略的就是坐标系和宽高比问题。如果你下载的DEM是经纬度坐标地理坐标系那么它的X方向经度和Y方向纬度的实际地面距离是不等价的。在低纬度地区1度经度约等于111公里但到了北纬60度1度经度只有约55公里。如果你不看投影直接拿经纬度DEM去Blender置换出来的模型东西方向会被拉长或压缩山体形状全被扭曲。解决方法是在GIS软件里做一步投影转换——把地理坐标系的DEM转成投影坐标系比如UTM通用横轴墨卡托。UTM坐标系的单位是米X和Y都是真实地面距离这样转换后再导出灰度图宽高比就真实了。操作很简单。假设你用的是QGIS加载DEM图层后右键图层选择“导出”或“另存为”在“CRS”选项里选择你所在区域的UTM投影带以中央经线确定带号然后确认输出格式是GeoTIFF。导出的新文件就是米制坐标的DEM。为什么要做这一步因为在Blender里你没办法告诉它“这个东西是经纬度数据你按球面展开”它只能用平面坐标。你给它的XY比例不对山就歪了。而且这步处理还有另一个好处后续从灰度图计算尺寸或缩放比例时你可以直接在投影坐标下量出数据范围的东西距离和南北距离填进Blender的平面尺寸里。注意如果你的DEM只是一个小范围的示例数据而你并不追求真实地理空间精度只想快速出个山形地貌看看效果那经纬度直接导入也不是绝对不能做出形状来只是比例会失真不能用于需要精确比例尺的分析或展示。意识到这个区别你就知道什么时候可以偷懒什么时候必须处理。2.3 把DEM转成Blender能用的灰度图投影转换完成后接下来就是导出灰度图。这一步的核心逻辑是让每个像素的亮度值真实反映该处的高程。用QGIS操作的话先把你转好投影的DEM加载进来在图层上右键选择“导出”或“另存为”格式选“GeoTIFF”然后在“渲染类型”或“渲染模式”里选“单波段灰度”Singleband gray在做这个之前最好先用“拉伸”方式把灰度范围拉开即使用2%到98%的线性拉伸方式把高程值的最小和最大的极值排除让山体阴影的细节充分拉开。这里有个关键操作灰度图输出时建议选8位或16位8位标准PNG/JPEG16位TIF精度更高但要看后续软件支持情况——Blender支持但贴图导入和显示上麻烦一些。一般可视化项目我用8位灰度PNG就够了输出时注意不要选为JPG因为JPG有损压缩会在灰度渐变区域产生条纹和色块细节会丢。输出PNG是无损的。做完这步你会得到一张灰度的PNG文件亮的地方高暗的地方低。把这个文件放进Blender它就是地形的“脚手架”。3. 实操走起在Blender里从零造出一座山系3.1 两条路线插件导入还是手动置换进入Blender后地形建模有两条主路线分别适合不同情况。第一条是插件路线Blender自带了一个叫“A.N.T. Landscape”的插件在“编辑-偏好设置-插件”里搜索enable即可。这个插件提供了一整套程序化地形生成方案里面有一个“Import DEM”功能可以直接加载DEM灰度图并生成地形网格。好处是快选个文件、点几下就能出一个地形坏处是可控性相对差一些贴图UV、网格密度、置换强度的调整逻辑有点绕如果你要做非常精准的尺寸控制plugin默认帮你做的一些缩放反而成了麻烦。第二条是手动路线创建一个平面给平面足够细分然后添加一个Displace置换修改器把灰度图作为置换纹理加载进去。所有参数自己控制逻辑透明出了问题也知道在哪改。缺点是步骤稍微多一点但真的很直观尤其对新手理解“用什么数据做出什么结果”这件事帮助巨大。我个人实际操作中90%的情况都用手动路线一是心里踏实二是Displace修改器后面还可以实时叠加其他纹理来做细节灵活性高。本文重点讲手动路线因为会的人多了插件的坑也能避开。3.2 从平面到地形创建物体、细分和置换第一步新建一个平面Plane默认是2米乘2米。这一步的关键是比例。假设你的DEM投影后范围是东西5000米、南北4000米那就把平面的X轴缩放设为5Y轴缩放设为4。注意这里的比例是相对的你可以用1个单位代表1000米也可以用1个单位代表100米只要XY比例跟DEM一致就行Z方向的强度是另一个独立参数后面单独调整。第二步细分。选中平面进入编辑模式右键选择“细分”Subdivide细分次数决定了网格密度。这里有一个实际体验如果之后还要用Subdivision Surface细分表面修改器可以先用较少的细分次数比如2到3次让平面网格稀疏一点后面用修改器统一控制精度省得直接细分后修改困难。如果不用细分表面修改器直接用右键细分到足够密度那建议至少细分7到10次让网格规模接近百万级实际取决于电脑配置。顶点数量越大置换细节越丰富但电脑越吃力。我的建议是先从低细分开始测试参数调好后再提高分辨率做最终输出。第三步添加置换修改器。给平面添加Displace修改器在Texture面板里新建一个图像纹理加载我们的灰度PNG。如果平面尺寸和图片比例不对置换图案会出现拉伸变形这就回到前面说的宽高比问题——所以先把XY比例调正确再置换纹理坐标才会对得上。加载后Displace修改器的Strength强度参数先设为默认1这时候你可能会看到地形像一个小土包或者一个大窟窿因为强度还没有按比例缩放到真实高度范围。3.3 置换强度怎么算高差与单位的换算置换强度的计算其实不复杂。换到前一步的例子里如果DEM范围内的最高海拔减去最低海拔等于800米而你设定的Blender单位是1个单位等于100米那置换强度应该设为8左右800/1008。但实际上还有一个变量灰度图的黑白亮度范围是否被拉伸到0到1之间。这里有个很容易犯迷糊的地方。Blender里Displace纹理会用灰度图的明暗值作为位移因子黑色0不位移白色1位移最大。如果你的灰度图高程值分布是500米到1300米但你把拉伸拉伸成了全黑到全白那么整个地形的高程区间就映射到了0到1那样会导致最低点和最高点形成巨大高差。正确的做法是在QGIS导出灰度图时就做了2%-98%线性拉伸这样高程中段压缩相对合理再用强度换算回实际高差就行。实际操作中我一般是这么做的先设一个大致强度观察地形是否“被压扁”或“拉尖”再根据渲染效果微调。如果你的项目需要精确的高程比例那就要用“Geometry Nodes”几何节点或者Script精确控制顶点偏移这部分偏进阶后面再展开。3.4 Subdivision Surface与网格细节的取舍地形网格做出来后表面往往会有明显的棱角和阶梯感即便用了灰度图置换因为网格顶点数量有限坡度转折处还是会出现多边形感。解决办法是用Subdivision Surface修改器把网格平滑一次再用Shade Smooth平滑着色处理视觉效果。注意顺序Subdivision Surface要放在Displace修改器之前还是之后效果不一样。我的经验是如果细分表面放在Displace之前它会先细分网格再置换细节波动会更平滑产生的顶点密度也高如果放在Displace之后则置换只在原始网格上发生再细分相当于纯平滑表面细节量不变但形状更柔。一般我推荐“细分表面在前、置换在后”让置换发生在高密度网格上山脊和沟谷的形态会更自然。网格细节和性能是直接矛盾。要想细节丰富又不卡顿我的做法是先用低细分网格搭好整体比例和置换强度确认没问题后再把视口显示用较低的分辨率预览输出之前临时拉高渲染细分。或者直接给Subdivision Surface修改器设置一个“渲染”级别和“视口”级别——渲染级别设为2或3高细节视口级别设为1或0低负载这样编辑时不卡输出时保证精度。Blender较新版本对这个支持很好强烈推荐这个工作流。实操心得初次导入DEM置换后地形方向可能与数据原始方向不一致例如东西走向变成南北走向。这是纹理坐标和物体旋转的问题旋转平面物体90度即可或者在Displace修改器里调整纹理坐标的映射方向。不要试图去旋转灰度图本身那样会引入重采样失真。4. 让地形有血有肉卫星影像贴图与海拔配色4.1 给地形叠加卫星影像一张灰白色的三维地形也能看但叠加了真实地表影像之后观感直接上了一个等级。叠加卫星影像的核心是UV对应问题我们需要让影像的每一个像素在三维模型上找到正确的位置。有两种方式一种是在灰度图导出时同时把对应范围的卫星影像也导出成同一范围、同一投影坐标、同一分辨率的图片文件然后在Blender里给模型新建材质把影像作为基础色纹理加载并把纹理坐标设为“生成”Generated或“UV”模式。这种方式要求灰度图和影像图的范围完全对齐操作的关键是在QGIS里用相同的裁剪范围、相同的投影坐标输出这样两张图的XY比例就一致了。还有一种方式是直接把影像文件拖进Blender的纹理节点中让模型根据自己的UV读写。默认平面UV本来就是完整覆盖整个物体的如果DEM和影像比例一致UV映射基本就是对的如果不一致会出现影像拉伸。这个方式适合你只拿测试数据快速预览的情况出正式成果我还是建议用第一种。在材质节点的处理上我的经验是在基础色后面接入一个颜色渐变节点把图像颜色分层这样可以让部分场景看起来更像地图而不是纯照片。这个主要看你想要“真实感”还是“制图感”。4.2 按海拔高度着色从地形到专题图除了卫星影像海拔配色是最常用的表达方式就是低海拔区域用绿色中海拔用黄褐色高海拔用白色像等高线分层设色图。实现方法不复杂在Cycles或EEVEE的材质编辑器里用纹理坐标Texture Coordinate节点获取物体的“物体坐标”然后把它的Z通道单独提出来经过一个Map Range映射范围节点把我们的实际海拔范围比如最低点200米最高点900米映射到0到1再接上一个ColorRamp颜色渐变节点设置几个颜色断点低处绿色、中间黄褐、高处白色或灰色。这样模型表面就会根据海拔动态上色。这个做法的好处是你再也不用回到图像处理软件里做“等高线填色图”直接在三维模型上实时着色切换视角也不会出问题。更进一步可以把ColorRamp的滑块数量做多一些模拟出更细腻的地带性过渡。比较进阶的玩法是把“坡向”计算也加进来比如南坡偏暖、北坡偏冷在三维地形可视化里非常惊艳。Blender里可以用几何节点的法向信息做AO和坡向混合因为操作树比较长更适合会的朋友直接写节点组这里先把思路说出来有需要的可以顺着这个方向去查更详细的教程。4.3 灯光与渲染让起伏“说话”地形模型做好了材质也调好了如果打光不对所有细节全白搭。做地形渲染时我最常用的是“太阳光”加“环境光遮蔽”的模式。太阳光从侧上方以大约30到40度的角度照射地形这样山体的一面被照亮、另一面落暗沟地形起伏感最明显。正上方顶光打下来模型看起来像一个平面细节全被抹平正下方逆光会造成大面积死黑也不好用。环境光遮蔽AO在EEVEE和Cycles里都有选项打开后山谷和裂缝交接处的接触阴影会加强整个地形的立体感会立刻提升。如果你用的是Cycles渲染器还可以加一个HDRI环境贴图作为微弱补光但强度不要盖过太阳光否则地形细节又会变得“平”。动动太阳角度你会发现一座山的山脊走向一下就“跳”出来了。渲染输出时如果要做后期合成相机可以用正交投影出图比例设置为数据范围的宽高比这样出来的几乎就是一张标准的地形测绘图可以叠加文字、指北针、比例尺在后期软件里完成。5. 常见问题与排查我踩过的坑你尽量别再踩做DEM地形这个事坑特别多。我把自己实际遇到过的、身边朋友也反复遇到过的几类问题集中列一下附上解决思路。有些问题你搜半天搜不到答案其实原理很简单就是没人把这些细节写明白。现象或报错原因排查与解决思路地形东西方向被严重拉长或压扁DEM还是经纬度坐标系X/Y单位不一致到QGIS里转投影坐标系UTM或高斯克吕格再导出灰度图置换出来的地形像“纸片”或者“一根刺”置换强度与模型比例不匹配高差被放大或压缩计算实际高差和模型单位比例微调Strength可用Map Range精简后再喂给位移地形细节很糊山脊沟谷消失细分次数不够灰度图分辨率太低或灰度拉伸不够提高细分级别使用带16位精度的DEM导8位灰度时做好拉伸模型表面有严重的锯齿和杂色条纹8位灰度保存成JPG格式导致压缩伪影统一用PNG/TIF无损格式不要用JPG卫星影像贴图位置对不上模型影像和DEM范围或投影不一致回到GIS保证两者同一投影、同一范围、同一像素分辨率再输出在Blender里看挺好导入其他软件地形变形或材质丢失Blender的置换和颜色渐变节点不兼容外部软件把地形导出前先应用修改器并将漫反射颜色烘焙到贴图再导出一次细分太多导致电脑卡死顶点数过多内存爆了先在视口级别用低细分渲染级别设高或者改用Decimate优化网格模型底部看穿没有“厚度”地形是一个曲面片没有实体厚度添加Solidify修改器给地形一个薄壁厚度输出到3D打印或游戏引擎时才有体积感还有一些比较隐蔽的问题也值得注意一个是灰度图的方向问题。有些DEM数据处理后上下翻转了但在Blender里你根本看不出来直到你叠加卫星图后才发现山脉走向反了。解决办法进入编辑模式全选网格后旋转180度或者对纹理坐标做一次旋转不要在图层面板里硬翻容易再次弄混方向。另一个是NoData空洞问题。前面提到有些DEM区域有数据空洞在GIS里如果不处理导出的灰度图在空洞区域是纯黑色置换后这里就直接塌成坑。处理方式是在QGIS里做“插值填充”或设置NoData为0值或平均值。不然你辛苦做的地形里会莫名其妙出现一个规则的深坑或尖峰。还有一个关于Modifier顺序的坑Subdivision Surface和Displace的顺序错了效果差异很大。我前面讲过“细分表面在前、置换在后”可能更平滑但如果你希望保留明显的棱线比如台阶状地形那置换在前、细分在后会更合适。这个没有绝对标准完全看你想表达什么。6. 做完之后还能干点啥模型的延伸应用6.1 导出给游戏引擎或GIS平台Blender不是终点把地形模型导出到其他平台有时候才是刚需。如果目标是Unity或Unreal推荐导出FBX格式注意先把Displace和Subdivision Surface都“应用”Apply掉并把材质烘焙成一张漫反射贴图这样引擎里直接用PBR材质接收效果基本和Blender一致。不烘焙的话引擎不一定支持Blender的程序化节点材质大概率会丢。如果目标是Cesium或WebGIS之类的平台通常需要把地形转成3D Tiles或量化的地形格式那就得借助第三方工具链处理Blender这边只需要保证网格拓扑和UV干净方便它后续切块。如果目标是3D打印那么关键操作是给地形加Solidify修改器做一个底座把Z轴比例按打印尺寸再调整一遍导出STL格式。打印出来时记得把地形底部做平不然摆放不正。选料和层高会影响细节表现这个跟普通3D打印技巧一样不赘述。6.2 还可以做风格化场景和动画不是所有DEM地形都必须走“真实感”路线。我见过有人把DEM置换结果配合Low Poly风格的材质简单颜色平铺加描边做出很精美的俯视地图动画也有人把DEM和气象数据叠加做出展示降雨量或气温分布的三维可视化还有人用Blender的镜头动画围绕山体做螺旋上升的展示视频效果很惊艳本质上只是一个DEM加一个摄像机动画而已。如果做风格化我推荐给材质加适当的噪波纹理和颜色渐变让地形颜色看起来像手绘的等高线图别一上来就贴真实卫星图。很多作品就是因为什么都想要真实感结果看起来特别像一块“绿色马赛克”反而没有手绘风格耐看。6.3 个人经验密度最大的三个建议第一保持“源数据”干净比任何后期技巧都重要。投影转换、范围裁剪、分辨率统一这些GIS侧的工作做扎实了到Blender里就是一路顺畅。反过来后面花十倍时间修补扭曲模型只是治标不治本。第二Blender文件里请保持一套成体系的命名比如“DEM_Projection”“DEM_Gray”“Satellite_Diffuse”不然做复杂场景的时候几十个节点和贴图混在一起找个文件和参数会找崩溃。这听着像废话但做复杂项目时我自己也常常栽在命名混乱上。第三如果对某个参数的变化没有把握就按“先小代价大再缩小代价验证”的思路来。我一般测试用低细分、低分辨率贴图确认形态没问题后再开全精度这样能省下大量等待渲染的时间。很多人一上来就套8K卫星图和百万级网格电脑风扇转得比飞机发动机还响最后改一个参数要等三分钟基本等于白干。这个项目的魅力在于它把地理信息、三维建模、材质表现几个不同领域的技能串到了一起做熟练之后你既能看懂地形数据的质量也能输出让外行觉得“好厉害”的三维作品。如果后续你想深入可以继续研究几何节点做动态地形或者借助Blender的合成器直接出图每一步都能带出新的玩法。
返回列表