花了大概一个礼拜左右的时间把城市建模的插件做出来了,还有一些瑕疵,但是已经达到预期想要的效果了。说在最前面的是,做这个东西完全没有任何商业目的,只是希望在houdini里面掌握更多程序化的思维。
先看效果:
整体思路分为:
1;抓取地图数据
2:分析地图数据,并根据坐标位置来生成最基本的建筑和道路的几何形状
3:根据道路和现有建筑布局,用点填充其他空余空间
4:程序化生成建筑楼,并将上一步的点提换成建筑
下面将每一步的具体方法和思路讲解一下:
1:抓取地图数据:
现在市面上能够免费得到地图所有元素坐标和类别信息的机构我只找到了openstreetmap.org这一家,他们这个项目的目的也是为了能够向世界所有人创造并提供免费的地理数据。我们可以直接在他的地图网页上框选一定的地图空间然后导出相应经纬度的地图坐标数据。非常重要的一点事他们目前只提供osm格式文件,其实就是xml的一种,如果想用编辑器直接查看里面的内容,可以吧后后缀名.osm改为.xml就可以打开了。
地图相关资源:
地图链接:https://www.openstreetmap.org
关于地图到处的xml数据结构:http://wiki.openstreetmap.org/wiki/OSM_XML
关于xml几个重要标记的解释:http://wiki.openstreetmap.org/wiki/Elements
地图中的元素一览表:http://wiki.openstreetmap.org/wiki/Map_Features
这里简单讲解一下.osm格式的结构:
<osm>
<bounds minlat="***" minlon="***" maxlat="***" maxlon="***"/>
<node id="***" ******** lat="40.4444343" lon="-79.9486641"/>
<node/>
....
<node/>
<way id="27574365" ....>
<nd ref="1705867277"/>
<nd ref="302440336"/>
<tag k="highway" v="service"/>
</way>
....
<relation/>
...
</osm>
bounds定义了整个数据的上下左右边界经纬度,Node相当于是地图中记录下来了的每一个点的数据,他可以是道路上的也可以是建筑上的。way是把所有点集结起来的一种方法,通过对他的tag做标签能够确定单个way下面所有的点是某一条街道还是建筑或者其他物体。relation是node和way之间的所有关系,我们这里没有用上所以不做介绍了。