三维城市海报 制作流程

读研的时候就曾看过Luis Dilger大神用C4D和DEM Earth制作的基于Open Street Map数据的City Layout图,当时也就看了一眼觉得好牛叉,然后就没有然后了,最近又看到@韩一郎用blender和C4D也制作了一个,这下我是真的坐不住了,一定要自己做个出来(见封面)。Luis Dilger@韩一郎都用了商业软件C4D,然而我并没有这个钱去购买,因此开源的三维软件Blender成了我的首选,下面开始我们的制作流程。

先来一张Luis Dilger的原作:

ps. Luis Dilger@韩一郎都是专业搞设计的,而我是搞地理的,入门blender才4天,因此下面的某些术语表述可能不专业,请见谅并指明。

这是我做的曼哈顿最终结果(知乎限制图片大小,原图在这里:bluegray):

## 准备

0. blender预备知识:台湾大神的blender教程全集,这里推荐大家把前5集、22、23、48、55、56集看完,我也是看了这些才开始制作的,

1. 软件:blender,我这里使用的版本是2.78,对于mac版本的blender,默认情况下其数字键不管用,需要到user preferences—>input中将emulate numpad勾选上

2. osm插件:blender-geo或者BlenderGIS,用来导入open street map数据,这里推荐blender-geo,因为blenderGIS导入的building会丢失细节信息,另外blenderGIS在导入数据量较大时会报错。对于如何在blender中导入插件,两个插件的文档中都有说明,这里不再重复,需要注意的是blender-geo最好将Import OpenStreetMapOpenStreetMap Georeferencing 都导入blender,下面制作流程中我用的插件都是blender-geo。

3. 数据:请前往Open Street Map下载,导出的数据格式为.osm格式

## 数据导入

1. 导入数据的时候切记分两次导入,一次导入buildings,一次导入roads and paths。对于数据量较大的文件,导入过程非常缓慢,比如我这个38M的Manhattan1.osm花费了2、3个小时才导入成功,在导入过程中blender会出现不响应的情况,请耐心等待。

2. 设置georeferencing:按照blender-geo的文档,先按数字键7,或者在`view`中选择`top`,将视角切换成俯视;然后右键选中`buildings和roads对象,在左侧的工具栏中(按T)找到`Geo`选项卡中的`Geoferencing`,点击`set original position`;再然后将图层缩放到可以看见所有的building和road,点击`Perform georeference`完成地理配准

3. 按n,打开右侧特性栏,选择view下的clip属性,将end调大,防止对象在缩放过程中产生溢出/割断现象

4. 添加底板: `shift + A`选择`mesh`中的`plane`,修改底板大小(尽量往大了调),使building和road都能够落在plane上

5. (可选)将building、road、plane分别加载到不同的图层中(选中对象按m进行移动,如果想全部显示,按住shift同时选中想要显示的图层)

## road数据修改

这一步是为了将road从mesh转curve,curve可以方便的调整粗细

1. 右键选中roads,按住`option + c`,选择`curve from mesh/text`

2. 将road的mesh转成curves后,到`properties`中的`data`选项卡中,`shape`中`fill`选择为full;`geometry`中的`depth`:2,`resolution`:32,其中depth越大产生的柱体越粗,resolution越大越圆滑,这样就将线条变成了圆柱体,方便后面设置其颜色(diffuse)

## material 材质

**这一部分最困难,需要耐心调试,需要与灯光一起进行调试**

1. buildings、roads的diffuse使用相同的颜色(请参考B站教程的22、23集),我这里使用的是hex:847770,intensity这里设置成了1.0

2. plane 底板的diffuse设置过程与buildings合roads类似,我这里参数设置如下:

- 将diffuse设为hex:214962
- 将specular(镜面反射)的intensity设置为0,即不反射

## lighting 灯光

1. 选中lamp, 将lamp设置为sun,通过`scaling`将lamp调大,这里需要注意,scaling过大或者过小都会导致表示太阳方向的线显示不全(下图中 Right Ortho视图中黄色的虚线)

2. 调整lamp的光线入射方向,通过下方工具栏的rotate进行调整

3. 在灯光属性`shadow`中,选在`Ray Shadow`,如果想看其效果,可以按f12查看渲染后的效果,不过现在只能显示一部分,需要设置好camera位置后才能看到完整的城市

4. 在`properties`——>`world`中勾选`Ambient Occlusion`(环境光遮蔽), 调整光线效果

## camera 相机

1. 选中camera, 通过`scaling`将camera调大

2. 通过`translate`,移动camera到合适的位置

3. 通过`rotate`,旋转camera到合适的角度

4. **在`properties`—>`camera`—>`perspective`—>`lens`——>`Clipping`**中:

- 将end设置大一些(1w~5w),防止场景被切割掉,按数字0可以随时查看在camera中的效果

- 将`focal length`焦距调整小一些,来获得全景,配合rotate进行调整

- `shift`可以对camera角度进行微调

5. camera一共有三种模式:Perspective (透视模式) 、Orthographic(正交模式)、Panoramic(全景模式),上面说的是Perspective模式,大家可以试试不同的模式,看看效果,比如下图中我就用了Panoramic模式,三种模式的说明

6. 按数字键0可以查看当前的camera视窗中的物体,这里有一个小技巧,可以在3d view中将角度调整好之后,按control + option + 0设置相机位置,而不需要通过旋转缩放等繁琐的操作来制定相机位置

7. 相机位置设置好后,可以按f12看渲染出来的效果。


8. [调整景深和焦距,产生虚化效果],这个太复杂就没有做,其实可以导出后用PS、pixelmator等图片处理软件制作

## 导出

1. 在`properties`—>render`—>`resolution`中设置分辨率,和输出路径`output`,frame range都设置成1,不然会输出一大堆图片

2. 点击animation开始渲染,渲染结束后就会在指定的路径下生成相应的图片

## END

one more thing: blender一些快捷键

- m: 移动物体到其它图层

- t: 打开左侧工具栏

- n: 打开右侧工具栏

- 0: 摄影机所含盖的视窗

- f12: 算图输出

- b: 矩形框选

- control + mouse left: 自由曲线选择

- shift + A: 创建新物体

- tab: 编辑开启,关闭

- a: 全选/取消全选

- option + c: mesh转为curves

- control + j: merge object


文 | sshuair . Play with Geodata.

编辑于 2016-10-08

文章被以下专栏收录

    GeoHey提供地理SaaS一站式解决方案,微信公众号@极海纵横,微博@GeoHey。欢迎热爱地理、喜欢地图、对数据可视化入迷的你们,一起在这里贡献智慧,分享新发现~!