代码可以制作3D动画么?(怎么用代码制作动画)
前言:为了能在建模软件 Blender 中成功建立起3D模型,需要对高程数据进行预处理。
高程数据,你也可以叫 DEM(数字高程模型)数据。这种数据有多种表现形式,同样也有多种储存方式,或者说格式;最常见的就是以灰度值来表示高程的灰度栅格数据 TIFF,后缀为 tif 的格式。
后文说的高程数据都是指高程灰度图栅格数据。
Blender 就是通过读取高程数据中各像素的灰度值来获取相应的高度信息,然后建立起3D模型。
Blender 仅读取灰度值,对其空间坐标信息不敏感,读入到 Blender 中的空间坐标信息就没了,所以不一定非要 TIFF 数据才行,只要是灰度栅格图像,比如 PNG 和 JPEG 格式,在保证像素类型正确的前提前,都是可以通过 Blender 建立3D模型的。
根据具体的情况和相应的场景可能需要不同的格式,不过一般使用 TIFF 格式的就可以了。
数据处理分为以下4个部分,其中最后两个部分是重中之重,所有的操作同时提供 ArcGIS 和 QGIS 两种处理方式:
数据获取;
合并-裁剪-投影-重采样;
范围拉伸;
转换像素类型。
理论非常简单,但是制作出的地形模型好坏的关键就在于数据处理。
第一步 数据获取
制作3D模型需要高程数据,现在获取高程数据的有效途径非常多,读者可以根据自己的需要选择合适分辨率的高程数据;
如果你想制作小比例尺大范围的地图,最好选择较大空间分辨率的高程数据,比如1千米x1千米分辨率;
而如果你想制作大比例尺较为精细的地图的话,就可以选择10米x10米、甚至更小空间分辨率的高程数据。
展开全文
特别提醒一点,小心使用保密数据,尽量不用;你能在网上下载到的数据想怎么折腾都可以。
网上有很多关于高程数据的获取指南,各位可以根据自己的实际情况获取相应的数据。
笔者目前使用较多的是下面这个网站:
http://viewfinderpanoramas.org/Coverage%20map%20viewfinderpanoramas_org3.htm
该网站可以下载全球的高程数据,其中中国区域高程数据的空间分辨率一般都是90米,最重要的是下载速度还行;打开网址可以看到很多小格子,点击格子就可以下载这个格子范围内的 DEM 数据,非常的直观。
解压后数据格式是 HGT 格式,可以直接用 ArcGIS 或者 QGIS 打开。
网站界面截图第二步 合并-裁剪-投影-重采样
其实这四个操作都是可选的,因为并不是所有数据都需要全部走一遍这些流程,因为你完全可以使用一个已经处理好、同时已经设置了投影系的 tif 数据。
并不是所有读者都有 GIS 相关背景经验,可能有的读者仅仅是兴趣使然,所以为了不落下每一个人,这里还是讲一下如何合并-裁剪-投影-重采样,对此非常熟悉的读者朋友可以跳过这一小节,直接进入第三步。
2.1 合并
通常来说,高程数据都是一块一块的矩形;所以你很有可能需要通过将多个矩形合并起来获取目标范围区。
将周围的高程数据添加进来,将其合并(也叫镶嵌)成一个整块。
4块高程数据(未镶嵌)
工具位置
ArcGIS 可以使用镶嵌至新栅格工具,该工具位于数据管理工具-栅格-栅格数据集-镶嵌至新栅格。
QGIS 可以使用 Merge 工具可以镶嵌栅格;该工具来自于 GADL 包。位于QGIS 右侧工具栏,GDAL-Raster miscellaneous-Merge。或者在上方工具栏中快捷打开:
2.2 裁剪
工具位置
ArcGIS 中使用裁剪工具;位于数据管理工具-栅格-栅格处理-裁剪;
QGIS 中依然在上方的 Raster 菜单中,依次点击 Extraction- Clip raster by mask layer即可。
2.3 投影
在 Blender 读取高程数据之前应该确保高程数据已经正确设置好了投影。不然 Blender 读取的形状就是扁的,因为这个扁扁的形状才是投影前高程数据的真实情况。
那为什么 ArcGIS 中就显示正常呢?因为 GIS 软件会自动做一个投影显示。所以设置投影系是必不可少的一步操作。
左:投影前的真实形状,形状更扁;右:投影后
工具位置
ArcGIS 中的投影工具在数据管理工具-投影和变换-栅格-投影栅格;
QGIS 的投影工具在菜单栏上方的 Raster-Projections-Warp。
2.4 重采样(修改像素空间分辨率)
重采样:根据一部分像素的信息赋值给其他像素信息的过程。
这里的重采样应该叫修改像素空间分辨率,只不过也是用重采样的方式实现而已。
什么叫空间分辨率?一个像素所表示的实际地理大小就是空间分辨率。比如这个教程使用的高程数据空间分辨率是90米,那么这就代表一个像素映射现实生活中一个90米长、90米宽的方形区域。
如果想要制作整个中国的3D模型,90米分辨率就太精细了,整个数据量就非常庞大,直接让电脑死机,所以可以通过重采样为1千米或者10千米。
单独的重采样工具不是所有 GIS 软件中都有,GIS 软件中一些和栅格相关的工具通常会自带修改空间分辨率的选项,所以可以顺便设置好空间分辨率大小;比如使用 QGIS 时我就喜欢使用栅格投影工具来顺便修改空间分辨率。
该教程提供的高程数据空间分辨率大小合适,不需要修改。
工具位置
ArcGIS 中的单独重采样工具在数据管理工具-栅格-栅格处理-重采样;ArcGIS 10.3版本有4种方法。
QGIS 的话我是直接使用投影工具来解决,因为 QGIS 本身没有独立的重采样工具,在 QGIS 主界面上面的菜单栏中选择 Raster-Projections-Warp即可。
将投影工具中的投影选项空着,只需要设置好 Output file resolution in target georeferenced units 这个选项,就可以在不修改投影的前提下修改空间分辨率。
第三步 范围拉伸
范围拉伸,英文:rescale。
范围拉伸是指把高程数据的范围扩大,普通的高程数据一般就在0到4000左右,教程提供的高程数据范围是42到2283,那么为什么要拉伸?有以下两个重要原因:
适配 Blender;如果以42到2283这样的范围导入 Blender,最终的成果建模是非常平坦,就像一张白纸,就像下面这样,看的见嘛?快瞅瞅:
保留细节;一般来说,高程数据的像素数据类型是浮点型,是小数形式,而 Blender 支持整数,所以需要转换。如果不拉伸直接转换,小数会被四舍五入成整数,数据丢失,反映到模型上就是细节丢失、没有连续性。
由于这两个原因,所以我们必须先对高程数据进行拉伸。
那么具体拉伸到多大呢?Daniel Huffman 大神提供了答案 👍 :
( 像 素 值 最 低 值 ) ( 最 高 值 最 低 值 ) ( 像 素 值 − 最 低 值 ) ÷ ( 最 高 值 − 最 低 值 ) ∗ 65535
工具位置
ArcGIS 中使用栅格计算器,工具栏中依次打开 Spatial Analyst 工具-地图代数,最后打开栅格计算器工具执行栅格拉伸操作。
然后输入以下计算表达式:
( " m o u n t a i n . t i f " − F l o a t ( 42 ) ) ÷ ( F l o a t ( 2283 ) − F l o a t ( 42 ) ) ∗ F l o a t ( 65535 )
你每一个输入的整数最好使用 ArcGIS 提供的关键字 Float 括起来,否则输出的数据就有可能自动四舍五入到整数位,最后导致的结果要么是0要么是65535(是否会四舍五入到整数取决于高程数据当前的像素类型,不过保险起见,都统一加上 Float 吧)。
QGIS 使用 Raster Calculator。点击主界面上方菜单栏中的 Raster-Raster Calculator。
然后输入以下计算表达式:
( " m o u n t a i n @ 1 " − 42 ) ÷ ( 2283 − 42 ) ∗ 65535
Note:①这里没有考虑高程数据范围涉及到负数(海底)的情况。②可能会遇到高程数据中有空值 Nodata,请注意。
简单理解,像素类型描述了图像的最小储存单元所使用的格式。
查看像素类型
在创建3D模型时,Blender 只能支持特定的像素类型,那就是16位无符号整型;所以现在要做的就是把像素类型装换为6位无符号整型。
16位无符号整型,英文:16 unsigned int 或者 16 bit unsigned;无符号表示正数,从0开始到216的整数。
从0到2的16次方正好有65536个数(包括0),那么最大数就是65535,这就是公式最后乘数字65535的原因。
工具位置
ArcGIS 可以使用复制栅格工具来修改像素类型:数据管理工具-栅格-栅格数据集-复制栅格;然后像素类型选择:16_BIT_UNSIGNED
QGIS 可以使用 translate 工具:上方菜单栏依次点击 Raster-conversion-translate;然后在 Output data type 中选择 UInt16。
最后
本章节你可以了解到:
使用高程灰度图栅格数据可以在 Blender 中创建3D地形模型;
高程数据的基本预处理操作(包括 ArcGIS 和 QGIS);
高程范围拉伸的重要性和操作;
Blender 建模需要像素类型为16位无符号整型的栅格图像。
好的,学完这章,距离下面的成果又近了一大步!
转载自:GIS荟
版权归原作者所有,如有侵权请告知删除
如果亲觉得我们的文章还不错的话,那就请分享转发一下吧!
地信论坛
bbs.3s001.com
微信ID: bbs3s001