CN113706715B - 一种随机可控城市生成方法 - Google Patents
一种随机可控城市生成方法 Download PDFInfo
- Publication number
- CN113706715B CN113706715B CN202111109006.9A CN202111109006A CN113706715B CN 113706715 B CN113706715 B CN 113706715B CN 202111109006 A CN202111109006 A CN 202111109006A CN 113706715 B CN113706715 B CN 113706715B
- Authority
- CN
- China
- Prior art keywords
- road
- node
- nodes
- city
- generating
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 73
- 238000005457 optimization Methods 0.000 claims description 28
- 238000004422 calculation algorithm Methods 0.000 claims description 23
- 238000005192 partition Methods 0.000 claims description 17
- 241000283070 Equus zebra Species 0.000 claims description 12
- 230000002093 peripheral effect Effects 0.000 claims description 12
- 238000001514 detection method Methods 0.000 claims description 10
- 238000012545 processing Methods 0.000 claims description 6
- 230000001172 regenerating effect Effects 0.000 claims description 2
- 238000011161 development Methods 0.000 abstract description 9
- 230000007547 defect Effects 0.000 abstract description 5
- 238000010276 construction Methods 0.000 abstract description 3
- 238000010586 diagram Methods 0.000 description 14
- 239000013598 vector Substances 0.000 description 10
- 230000000694 effects Effects 0.000 description 9
- 230000002457 bidirectional effect Effects 0.000 description 4
- 238000004364 calculation method Methods 0.000 description 4
- 238000009877 rendering Methods 0.000 description 4
- 239000003086 colorant Substances 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 239000000463 material Substances 0.000 description 2
- 239000003973 paint Substances 0.000 description 2
- 230000032823 cell division Effects 0.000 description 1
- 230000001627 detrimental effect Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000009191 jumping Effects 0.000 description 1
- 238000005259 measurement Methods 0.000 description 1
- 230000003252 repetitive effect Effects 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 238000005070 sampling Methods 0.000 description 1
- 238000004088 simulation Methods 0.000 description 1
- 238000000638 solvent extraction Methods 0.000 description 1
- 230000009897 systematic effect Effects 0.000 description 1
- 238000012549 training Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T17/00—Three dimensional [3D] modelling, e.g. data description of 3D objects
- G06T17/20—Finite element generation, e.g. wire-frame surface description, tesselation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T17/00—Three dimensional [3D] modelling, e.g. data description of 3D objects
- G06T17/05—Geographic models
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T2210/00—Indexing scheme for image generation or computer graphics
- G06T2210/04—Architectural design, interior design
Landscapes
- Physics & Mathematics (AREA)
- Engineering & Computer Science (AREA)
- Geometry (AREA)
- Software Systems (AREA)
- Computer Graphics (AREA)
- General Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Remote Sensing (AREA)
- Processing Or Creating Images (AREA)
Abstract
本发明属于计算机图形学领域,针对目前大规模三维城市建模所存在的不灵活、开发效率低下等缺点,提出了一种随机可控城市生成方法。该方法首先通过前沿推进法生成路网,并结合生成的河流、桥梁形成初始的城市路网;然后,通过对初始城市路网的优化和主次干道的规划,生成最终的城市路网;最后,通过生成路口、道路、街区和建筑物,实现对整个城市的可视化生成。使用该方法可以快速而灵活地构建大规模的城市场景,可以直接应用于对城市场景要求不是十分精细的项目上,或者作为项目开发的快速预览,能极大的提高相关项目的开发效率和灵活性,可以很好地弥补手工建模在大规模城市场景构造中所展现的弊端。
Description
技术领域
本发明属于计算机图形学领域,具体涉及一种随机可控城市生成方法。
背景技术
随着计算机技术的发展,大规模三维城市模型在游戏娱乐、影视渲染、军事演习、驾驶仿真与培训、自动驾驶的虚拟训练、虚拟现实等领域的需求越来越高。传统的三维城市模型的构造方法往往是采用三维建模软件,用手动建模的方式建成,当城市规模变大的时候会消耗极大的人力和时间成本,这种建模效率低,复杂性高、智能性差。因此研究大规模城市场景的自动生成具有重要的意义,可以很好地弥补手工建模在大规模城市场景构造中所展现的弊端。
城市建模方法,最为典型的基于图像等测量数据的城市建模,高分辨率卫星影像、多视航空影像、机载激光雷达点云、地面数据和众源数据是几种常见的城市建模数据源。这些方法可以用于重建城市,但是不能用于创建没有图像输入数据的新模型,且都需要依赖数据源来生成三维城市模型,不能用于快速生成虚拟的城市景观。对于现实尚不存在的虚拟城市建模,要按规则生成所需模型,这就是基于规则驱动的城市过程建模,最为典型的L系统虽然能快速的生成城市路网,但其未考虑城市功能分区问题,并且其预先设定的规则有限,如生成的城市模型不满足用户需求,则需重新设定规则。也有一系列针对路网,街区,建筑物的过程式建模研究,这些研究虽都摆脱了对实际的遥感图像或真实地图的依赖,也使用了过程化生成的方法,但他们皆针对某个细节问题,而没有将整体系统化。
发明内容
本发明针对目前大规模三维城市建模所存在的不灵活、开发效率低下等缺点,提出一种随机可控城市生成方法。该方法首先通过前沿推进法生成路网,并结合生成的河流、桥梁形成初始的城市路网;然后,通过对初始城市路网的优化和主次干道的规划,生成最终的城市路网;最后,通过生成路口、道路、街区和建筑物,实现对整个城市的可视化生成。使用该方法可以快速而灵活地构建大规模的城市场景,可以直接应用于对城市场景要求不是十分精细的项目上,或者作为项目开发的快速预览,能极大的提高相关项目的开发效率和灵活性。
为了达到上述目的,本发明采用了下列技术方案:
本发明提供一种随机可控城市生成方法,包括以下步骤:
步骤1,数据输入和河流绘制;
步骤2,城市路网的初步生成;
步骤3,路网桥梁连接;
步骤4,路网优化;
步骤5,规划路网主次干道;
步骤6,路口和直线道路生成;
步骤7,街区地面生成;
步骤8,建筑物的排布及生成,生成完成之后所得的结果就是整个城市。
进一步,所述步骤1中数据输入的具体方法是:对Unity的编辑器进行扩展,在编辑器中进行城市信息的输入;河流绘制的具体方法是:为了达到随机可控的生成城市的目的,采用在unity插件上进行河流边界绘制的方法,将笔刷设置为一个多边形,绘制时将多边形与已绘制的多边形进行布尔运算得到新的多边形,并且对多边形进行优化得到最终的多边形。
进一步,所述步骤2中城市路网初步生成的具体方法是:采用有限元网格划分的方法,根据城市的边界以及河流的分布,把城市内部区域划分成由多个单元组成的网格,即得到由节点组成的无向图,经过步骤2将会得到城市路网的数据,数据包括城市中所有的路口节点的数据、所有道路的节点数据以及道路等级和属性、所有街区的节点数据和所属分区。
进一步,所述步骤3中路网桥梁连接的具体方法是:设定一个阈值,代表桥梁最长的长度,遍历所有外边的节点A,查找点A阈值范围内的所有外边节点,如果在这些查找到的节点中找到距离最近的节点B,如果节点B与A同属于一条外边则不生成,如果是不同的两条外边且为被用于生成桥梁,则连接两节点,生成对应道路,标记为桥梁,两节点标记为已被生成桥梁,生成完之后,需要对桥梁与桥梁之间做碰撞检测,如果有碰撞则删除一条桥梁,并且要对桥梁与附近的外边的边进行碰撞检测,避免出现桥梁穿过陆地的情况。生成的路网可能分为多个无向图,需要桥梁把相邻图连接起来,否则在道路扩展中,可能会因为两个热点处于不同的无向图而无法找到相连的最短路径。
进一步,所述步骤4中路网优化方式包括平整优化、两道路路口优化、三角街区优化、三道路路口优化、特殊街区优化、道路数量超过4条的多道路路口优化。初始路网节点生成结束后,得到了以四边形网格为主的路网模型,但是仍然存在许多不合理的地方,所以需要对路网进行进一步的优化,使路网更符合现实规划。
进一步,所述步骤5规划路网主次干道的具体方法为:先将城市中的各个热点相连,用寻路算法计算出热点之间主干道,再从主干道上扩展出次干道,从而实现城市的主次干道规划;所述热点的确定为:将工业区、商业区、办公区作为城市热点区域,城市的分区信息记录在贴图中传入路网生成算法,并且在道路节点生成时通过查找节点在贴图上对应的颜色信息,记录该节点所属的分区,对城市路网的无向图用改进的并查集进行处理,将相连且分区属性相同的道路节点划分到一个集合中去,算法结束时,可得到若干个节点集合,每一个集合为一个分区,对工业区、商业区、办公区的集合求坐标中心点,查找距离中心点最近的道路节点作为热点。
进一步,所述步骤6路口和直线道路生成中直线道路网格的生成按照道路数据生成一个四边形的网格;在每一个道路节点所在的位置生成一个路口,路口的网格生成分为两部分,一是路口中心部分,二是斑马线部分,首先生成路口中心的多边形,再生成斑马线部分的网格。
进一步,所述步骤7街区地面生成的具体方法为:先根据街区边界所属道路的宽度,重新计算新的节点集合来充当实际的街区的边界;通过遍历原始街区的每两个节点,查找到两个节点对应的道路,根据道路信息中宽度创建新的直线,相邻直线的交点为的新的实际街区的节点位置。定义街区的一系列节点不能直接用来作为街区地面的节点,因为此时节点实际上为路口的中心,而不是道路的边界。所以在生成街区地面之前需要根据街区边界所属道路的宽度,重新计算新的节点集合来充当实际的街区的边界。
进一步,所述步骤8建筑物的排布及生成中建筑的网格分为屋顶和墙壁两部分;其中,屋顶部分的网格生成方法为,根据传入的节点和高度信息计算得到屋顶的顶点信息,调用多边形三角化算法计算三角形索引;墙壁部分的网格生成方法为,将已有建筑的屋顶多边形和地面多边形的顶点作为墙壁网格的顶点,遍历底部的地面多边形,将地面两个顶点和顶部屋顶多边形对应的两个顶点作为一个四边形生成,方法类似于道路网格生成;
所述步骤8中建筑物的排布包括内部建筑的排布和外围建筑的排布;住宅区的街区同时有两种排布,其余的工业区、商业区和办公区都是用内部建筑排布方式;所述内部建筑排布利用多边形填充算法;所述外围建筑排布遍历街区节点,每次将当前节点和下一节点向内扩展一个人行道的距离,记录为一条新的直线,相邻直线求交点算的新的多边形用于生成外围的建筑排布。
更进一步,所述外围建筑的排布包括街角建筑物的排布和街边建筑物的排布;其中,街角建筑排布的方法为,取得街角顶点的下一条边的离散点的第一个点和上一条边的最后一个离散点,并且在这两个离散点对应的道路垂直方向扩展出新的点,另外分别计算得到街角与上述两个离散点的中心位置也作为新点,将六个点按顺序记录得到街角建筑的顶点坐标;街边建筑排布的方法为,除去离散顶点的头尾顶点,将其余顶点按照道路方向垂直向内扩展一个厚度,从而计算出街边建筑的四个顶点的坐标。
与现有技术相比本发明具有以下优点:
本发明利用Unity平台,提出随机可控的城市建模方法。该方法利用有限元网格划分—前沿推进法,将城市功能分区和城市各等级道路性质相结合,充分考虑道路规划中可量化的指标,根据城市边界和河流的分布来对城市路网进行建模;然后在Unity中绘制贴图,存储城市中的功能分区数据,并根据生成的路网数据生成整个城市的三维模型,完成大规模城市的随机可控生成。
此方法能用于创建没有图像输入数据的新模型,且不依赖实际的遥感图像或真实地图的数据源,能够快速产生实际的建筑实体和纹理,生成整体系统化的城市模型。使用本发明方法可以快速而灵活地构建大规模的城市场景,可以直接应用于对城市场景要求不是十分精细的项目上,或者作为项目开发的快速预览,能极大的提高相关项目的开发效率和灵活性,可以很好地弥补手工建模在大规模城市场景构造中所展现的弊端。
附图说明
图1为插件界面图;
图2是河流绘制图
图3是理想点的一种可能情况图;
图4是候选集示例图;
图5是桥梁连接前后对比图;
图6为平整优化;
图7为两道路路口优化;
图8为三角街区优化图;
图9为三道路路口优化图;
图10为对角路口是三道路街区优化;
图11为多道路路口优化1;
图12为多道路路口优化2;
图13四种不同参数下的道路标线绘制情况图;其中,(a)为道路窄双向2车道道路标线,(b)为双向4车道道路标线,(c)为道路宽双向2车道道路标线,(d)为双向6车道道路标线。
图14是路口中心多边形生成图;
图15是斑马线扩展网格生成过程图;
图16为路口生成效果图;
图17是实际街区节点的生成效果图。
图18是街区地面效果图;
图19是单元划分街区示例图;
图20是街区内部建筑排布效果图;
图21是街区外围建筑分布图;
图22是建筑生成效果图
图23是功能分区及河流绘制界面;
图24是整体城市生成图。
具体实施方式
本发明是一种随机可控城市生成方法,实现大规模程序化建模,具体步骤如下:
步骤1,数据输入和河流绘制
数据输入:对Unity的编辑器进行扩展,使得可以在编辑器中进行城市信息的输入,涉及城市的尺寸、标准的街区尺寸、河流边界、功能分区等。如图1所示为插件的用户界面,包括了城市基本数据的输入以及绘制功能分区、河流分布的笔刷的设置;用户界面作为Unity的一个插件,界面可同其他Unity自带的窗口一样进行停靠、悬浮和调整大小。
河流绘制:为了达到随机可控的生成城市的目的,采用在unity插件上进行河流边界绘制的方法,将笔刷设置为一个多边形,绘制时将多边形与已绘制的多边形进行布尔运算得到新的多边形,并且对多边形进行优化得到最终的多边形,如图2所示。
定义笔刷多边形的边数为n,半径为d,预设绘制距离为l。则多边形绘制的步骤如下:
(1)当鼠标第一次点击到画板上时,记录下当前点击的位置,然后跳转到步骤(3)进行多边形的绘制。
(2)鼠标开始拖动,此时判断一次当先鼠标位置与之前记录的位置的距离是否大于等于l。如果是则跳转到步骤(3)绘制一个多边形,且记录当前鼠标位置。如果不是则不执行绘制,继续判断。
(3)设向量h为(0,0,d),角度θ为0,以当前鼠标位置为圆心,加上h旋转θ为笔刷第一个顶点。添加一个顶点,θ增加360/n,直到添加n次。既可以计算出笔刷的多边形顶点。n越大多边形越光滑。
(4)根据当前的状态(绘制、擦除)决定使用布尔运算的并还是减对已存在的多边形进行运算。
(5)鼠标抬起时,对已存在的多边形进行优化。如图2,因为原始布尔操作结果的多边形边界非常不平整,不利于路网生成。所以需要对多边形中太小的边进行优化。
(6)最终生成路网时,用城市的四边形减去绘制的河流多边形得到实际上的城市边界多边形。
并可在场景中对河流边界、功能分区进行绘制。利用贴图存储城市中的功能分区数据,不同的颜色表示不同的分区类型。获取鼠标在画图板上的位置以及绘制半径,将数据传入着色器,将半径内颜色修改为指定的数值,获取贴图作为数据,图23为功能分区及河流绘制界面图。
首先对相关数据做出如下的定义,路网数据由RnNode、RnRoad、RnBlock组成。三种数据都用字典的形式,以自身ID作为Key,自身数据作为Value存储。特别的,RnRoad除了上述存储方式外,也用道路所存的两个节点的ID值共同作为一个字典的Key来存储,以便在仅知道节点的情况下查找道路信息。
RnNode(Road Network-Node,路网节点)是本文定义的一种类型,作为城市路网中的路口信息。
RnRoad(Road Network-Road,路网道路)是本文定义的一种类型,作为城市路网中的道路信息。
RnBlock(Road Network-Block,路网街区)是本文定义的一种类型,作为城市路网中街区的信息。
步骤2,城市路网的初步生成:结合前沿推进法以及各城市功能分区路网密度的规定,采用有限元网格划分的方法,根据城市的边界以及河流的分布,把城市内部区域划分成由多个单元组成的网格,即得到由节点组成的无向图。经过该步将会得到城市路网的数据,数据包括城市中所有的路口节点的数据、所有道路的节点数据以及道路等级和属性、所有街区的节点数据和所属分区。
前沿推进生成初始路网的主要步骤如下:
(1)判断剩余节点是否足够少。判断当前所处理的前沿的节点个数是否小于等于5,如果是则说明此时该前沿已经处理完成。将前沿中剩下的所有节点记录到生成结果中,清空当前前沿,该单元生成结束,退出方法。
(2)计算理想点P1、P2。P1衍生自点A、P2衍生自点B,计算当前处理的节点的θ1以及θ2,通过θ值计算当前的两个理想点的位置。理想点可能是新增的节点,也可能点A'、B'。理想点的计算规则为,当θ值小于阈值110°时,取相邻点作为理想点。即θ1小于110°时选A',θ2小于110°时选点B'。当θ值大于等于阈值110°时,新增节点作为理想点。新增节点的坐标为,从对应点(A或B)的角平分线出发,延申一个标准单元长度的距离。如图3为其中一种情况,即θ1小于110°,理想点P1为A',θ2大于110°,理想点P2为从∠ABB'角平分线上延申一个标准单元距离的新增节点。
(3)计算P1、P2对应的候选点集S1、S2。候选点集的选取规则为,如果点P不是新增节点,候选集只有理想点一个。如果点P为新增节点,则将以点P为中心,半径为0.55倍标准单元长度的圆内的其他节点纳入候选点集。按照距离点P的距离从小到大进行排序,然后将理想点放置于候选点集的末尾。即优先考虑用已存在的节点生成新单元。
如图4所示的部分前沿的示例,计算出理想点P1、P2之后,因为X2与P1的距离符合要求,X2纳入候选点集S1。排序之后S1中仍只有X2,然后将点P1放置于候选点集末尾。点P2周围没有其他符合条件的候选点。即此时S1中候选点为X2、P1,S2中候选点为点P2。
(4)进行单元有效性检测。按照候选点集的顺序进行单元有效性检测,检测当前点A、B以及两个候选点所组成的新单元是否有效,如果有效则生成,无效则检测下一个候选点的组合,直到所有候选点都不满足则跳过该单元生成。定义当前从候选点集S1、S2中取出的候选点分别成为点C1、C2。有效性检测的内容包括:
1)节点重复检测,判断点C1、C2有没有和点A、B为同一个节点,如果有则返回单元无效。
2)节点连续性检测,如果C1、C2都是远点,但C1、C2并不连续,则返回单元无效。
3)碰撞检测,判断新生成的边AC1、C1C2、C2B有没有和附近已存在的边发生碰撞,如果有则返回单元无效。
4)前沿点包含性检测,检测附近已存在的节点有没有位于新单元的内部,如果有则返回单元无效。
5)更新前沿。在单元有效的情况下,根据当前情况更新前沿。在此需要对11种情况进行分类讨论。其中4种情况不包含远点,其余7种情况都包含远点。
6)记录结果。更新完前沿之后,需要把生成的数据保存。把刚才生成的新增节点加入到字典中,并且如果点A与P1、P1与P2、P2与B中记录的相连节点不包含对方,则添加。即将这些节点连接进无向图中。
步骤3,路网桥梁连接的具体方法是:生成的路网可能分为多个无向图,需要桥梁把相邻图连接起来,否则在道路扩展中,可能会因为两个热点处于不同的无向图而无法找到相连的最短路径。首先需要设定一个阈值,代表桥梁最长的长度。遍历所有外边(初始的外前沿即为外边,如图5左侧所示的路网中有两个外边,同时也是两个连通图的最外侧的边的集合)的节点A,查找点A阈值范围内的所有外边节点。如果在这些查找到的节点中找到距离最近的节点B。如果节点B与A同属于一条外边则不生成,如果是不同的两条外边且为被用于生成桥梁,则连接两节点,生成对应道路,标记为桥梁。两节点标记为已被生成桥梁。生成完成之后,需要对桥梁与桥梁之间做碰撞检测,如果有碰撞则删除一条桥梁。并且要对桥梁与附近的外边的边进行碰撞检测,避免出现桥梁穿过陆地的情况。
步骤4,路网优化
初始路网节点生成结束后,得到了以四边形网格为主的路网模型,但是仍然存在许多不合理的地方,所以需要对路网进行进一步的优化,使路网更符合现实规划。
平整优化:遍历所有非边界结点,计算交点的中心点,重新设置整个路网的结点位置。如图6所示,NodeA连接4条道路,平整优化后,NodeA连接道路为2条,整体路网变平整。
两道路路口优化:遍历所有非边界结点,删除两条道路的路口结点。如图7所示,NodeB为一个两路口结点,将该路口删除。
三角街区优化:查找初始路网中所有的三角形街区,找到相邻结点最多的两个结点,将它们的对应边进行删除;如果这条边是边界的话就删除边界之外的相邻结点最多的两个结点对应的边;特别的,如果两个结点的相邻结点数目一样,删除先遍历到的两个结点对应的那一条边。如图8所示,三角形街区M的邻近结点NodeA,NodeB,NodeC,NodeA相邻结点数量5,NodeB相邻结点数量3,NodeC相邻结点数量4,将NodeA与NodeC对应的边删除,该三角街区与相邻街区合并。
三道路路口优化:遍历所有非边界结点,找到三道路路口结点,优化使最大角度两点连接。如图9所示,NodeA,NodeB,NodeC形成三道路路口,θ1是三道路口结点最大角,优化使NodeA与NodeC两结点连接。
对角路口是三道路街区优化:遍历所有非边界结点,找到两个三道路节点是相对的,进行合并。如图10所示,街区N的两个对角路口NodeA,NodeB是三道路路口,优化将NodeA,NodeB进行合并,路网划分更合理。
多道路路口优化:遍历所有非边界结点,找到大于等于五个道路的路口结点nodeO,分两种情况进行考虑:
(1)nodeO相邻非边界结点中有3道路路口,优化如图11所示,NodeA为三道路路口结点,NodeB为三道路路口两两个夹角的中间结点,NodeC,nodeD为三道路结点邻近结点,判断NodeC,nodeD与NodeB的距离,图中nodeD与NodeB的距离更远,将nodeD与nodeO的边断开,nodeD与NodeA连接。
(2)nodeO相邻非边界结点中没有3道路路口,优化如图12所示。计算nodeO与各边角度,找到角度最小的min(θ),然后对min(θ)邻近角θ1,θ2进行比较,将更小的角度θ2的邻边c连到d中点。
进行这些优化后会解决大部分多道路路口的问题,然后再用针对的优化方式处理剩余路口。
步骤5路网主次干道规划的具体方法是:先将城市中的各个热点相连,用寻路算法计算出热点之间主干道,再从主干道上扩展出次干道,从而实现城市的主次干道规划。
城市热点计算:确切的道路节点作为热点,从而在无向图中计算两个热点之间的路径。将工业区、商业区、办公区作为城市热点区域,城市的分区信息记录在贴图中传入路网生成算法。并且在道路节点生成时通过查找节点在贴图上对应的颜色信息,记录该节点所属的分区。对城市路网的无向图用改进的并查集进行处理,将相连且分区属性相同的道路节点划分到一个集合中去。算法结束时,可得到若干个节点集合,每一个集合为一个分区。对工业区、商业区、办公区的集合求坐标中心点,查找距离中心点最近的道路节点作为热点。
道路扩展算法:道路扩展算法即在主、次干道交点上向路网继续扩展主、次干道。道路扩展算法的步骤如下:
1)将初始处理的节点定义为点S(Start),与点S相连的非主、次干道节点定义为点E(End)。点S到点E的方向为扩展道路的方向。
2)遍历点E相连的除了点S外的所有节点,如果能找到一个点N(Next),使得∠ESN小于150°,则往点N方向扩展,标记节点为相应的主、次干道节点。
3)将此时的点N作为新的点E,此时的点E作为新的点S,重复执行步骤2)直到无法扩展为止。
此外,在扩展的时候维护一个变量用于存储累计长度,当累计长度超过阈值1000米时标记为一个次干道交点,生成一个交点则将累计长度清零。
主干道的生成和扩展步骤如下:
1)查找热点间最短路径。使用A*(A-Star)算法查找两个热点之间的最短路径,将路径上的节点标记为主干道节点。
2)遍历每一条主干道,将前后两条道路夹角在70°到110°直接的节点标记并记录为主干道交点。此外,在处理过程中记录节点的累计距离,当累计长度超过阈值1000米,标记并记录为一个次干道交点,用于扩展次干道。生成一个次干道交点或检测到一个主干道交点则将累计长度的值清零。
3)遍历所有主干道交点,对交点使用道路扩展算法扩展主干道。
次干道生成以及扩展与主干道相似,遍历所有次干道交点,对交点使用道路扩展算法扩展次干道,并且在扩展过程中新增的次干道交点也要继续扩展。
初始路网生成并优化后,仅有各个道路节点相连的无向图信息,还需要进一步计算出道路和街区的信息。道路信息的计算只需要遍历所有的道路节点,然后判断该道路节点与每一个相连节点有没有已经在字典中记录道路信息,如果有则跳过,没有则生成。生成街区地面之前需要根据街区边界所属道路的宽度,重新计算新的节点集合来充当实际的街区的边界。
根据传入的路网数据生成整个城市所需要的所有模型。组成一个三维模型的要素有顶点、三角形、UV、法线。渲染三维模型需要材质,且材质需要有对应的着色器(Shader)。包括直线道路、路口、建筑物的模型生成、以及相应着色器原理和建筑对应位置的放置。
步骤6分为路网和街区两大部分,路网包括路口和直线道路的生成,街区包括街区中地面的生成、建筑的排布及生成。生成完成之后所得的结果就是整个城市,整个城市会直接出现在Unity的场景中。
路口和直线道路生成的具体方法是:直线道路网格的生成按照道路数据生成一个四边形的网格。在此称RnRoad中的起始节点和结束节点分别为点S和点E。根据当前生成道路的等级,获得该道路等级对应的道路宽度,记录道路宽度的一般为w。以及道路网格的四个节点均有一个节点偏移值,该值在生成路口网格中计算得到。由此,生成网格各要素的方法如下:
(1)顶点数组。从点S到点E的方向向量记为向量d,点S的位置沿左侧与向量d垂直的方向延申w的距离,再加上节点偏移值,则为点P1的位置坐标。同理点P2是点S沿右侧与向量d垂直的方向延申,同理点P3、P4是从点E开始计算。按照点P1、P2、P3、P4的顺序存入数组中作为网格的顶点数组。
(2)三角形数组。顺时针的三个顶点定义一个正面的三角形,因此点P1、P2、P3定义一个三角形,P1、P3、P2定义一个三角形。将三角形的索引0、3、2、0、2、1存入数组中作为三角形数组。
(3)UV数组。P1的UV值设为(0,0),P2的UV值设为(P1到P2的距离,0),P3的UV值设为(P3到P4的距离,P3到P2的距离),P4的UV值设为(P1到P4的距离,0)。将四个二维向量按顺序存储组成UV数组。即用顶点之间的距离充当UV值,此方法可以便于后续着色器的处理。
(4)法线数组。因为本发明所生成的城市道路都与地平线平行,即法线都应该向上。数组中的四个三维向量均设置为(0,1,0)即可。
道路着色器:因为所生成路网中包含多种等级的道路,需要一个通用的道路着色器来绘制地面的标线,使其可以通过输入对应数据来控制车道数量、标线宽度、标线颜色、边界位置、边界等的绘制效果,如图13为设置四种不同参数下的道路标线绘制情况。
在每一个道路节点(RnNode)所在的位置生成一个路口。路口的网格生成分为两部分,一是路口中心部分,二是斑马线部分。首先生成路口中心的多边形,如图14所示设定当前生成路口的节点为点A,多边形的顶点的生成方法如下:
(1)对点A的相连节点按角度进行顺时针排序。
(2)取得第一个相连节点定义为B1,下一个相连的节点为B2。
(3)根据点A、B1所对应道路的宽度,计算当前道路AB1左侧直线l。
(4)根据点A、B2所对应道路的宽度,计算当前道路AB2右侧直线m。
(5)计算直线m、l的交点X,点X作为一个顶点存入顶点数组。
(6)如果未处理完所有相连节点,则将当前点B2记录为B1,下一节点记录为点B2,回到步骤(3)继续执行。如果已经处理完则结束。
因为路口中心的多边形有可能是三边形、四边形、五边形等,需要使用的多边形三角化算法计算路口中心多边形的三角形索引数组。路口中心多边形的UV值均为(0,0),法线均为(0,1,0)。
斑马线部分的网格生成如图15所示。点C、D为已知的中心多边形上的点,其生成步骤如下:
(1)点C在方向AB上延伸一个斑马线的宽度计算得到点F,同理点D在方向AB上延伸一个斑马线的宽的计算得到E。
(2)与上所述的网格生成方法一样,生成顶点、三角形索引、UV和法线数据。
(3)将向量AF、AE在向量AB上的投影记录为道路AB的节点偏移值,用于直线道路的生成。
路口着色器:路口中心多边形都采用世界坐标作为贴图采样的UV,而斑马线部分采用顶点所存储的UV,根据UV实现斑马线线条的排布,可动态调整。如图16为路口生成效果图。
街区地面生成的具体方法是:定义街区的一系列节点不能直接用来作为街区地面的节点,因为此时节点实际上为路口的中心,而不是道路的边界。所以在生成街区地面之前需要根据街区边界所属道路的宽度,重新计算新的节点集合来充当实际的街区的边界。
因为道路可以由两个节点的ID查找到,所以可以通过遍历原始街区的每两个节点,查找到两个节点对应的道路,根据道路信息中宽度创建新的直线,相邻直线的交点为的新的实际街区的节点位置,图17为实际街区节点的生成效果。
在着色器中,利用世界坐标作为颜色贴图和法线贴图的UV,并且添加柏林噪声(Perlin Noise)混合颜色以减少贴图的重复效果,图18为将贴图应用于地面上的效果。
步骤8建筑物排布以及生成的具体方法是:
建筑的网格分为屋顶和墙壁两部分。屋顶部分的网格生成方法为,根据传入的节点和高度信息计算得到屋顶的顶点信息,调用多边形三角化算法计算三角形索引,UV值均为(0,0),法线均为(0,1,0)。墙壁部分的网格生成方法如下,此时已经有建筑的屋顶多边形和地面多边形的信息。两个多边形的顶点作为墙壁网格的顶点,遍历底部的多边形,将地面两个顶点和顶部对应的两个顶点作为一个四边形生成,方法类似于道路网格生成。这一个墙壁的法线应该与墙壁垂直,因此四个顶点的法线值为四边形中两个向量的叉乘。顶点的UV值采用顶点之间的距离值,方便贴图的平铺。
街区中建筑的位置计算分两种,一种是内部建筑的排布,一种是街边建筑的排布。住宅区的街区同时有两种排布,其余的工业区、商业区和办公区都是用内部建筑排布方式。
内部建筑排布利用多边形填充算法,先对单元进行定义,单元相当于多边形填充算法中屏幕上的一个像素。在生成内部建筑排布时,先设定一个单元的大小。利用单元把街区所在的矩形区域做划分,如图19所示。单元越小精度越高。用一个二维的布尔数组存储这个网格,利用多边形对街区内部的单元进行填充,将内部单元标记为可放置,外部单元标记为不可放置。然后预先设定需要放置建筑的长宽(与单元大小相关),存入到建筑列表中,列表中的建筑按照长和宽从大到小排序。遍历所有单元,如果该单元可放置,则从建筑列表中取出第一个建筑,判断该建筑所占用的单元是否都为可放置,如果是则记录建筑位置,且将放置的单元全部标记为不可放置;如果不是则从建筑列表中选取下一个建筑,直到所有的建筑都无法放置就跳过该单元的设置。也可以加上随机选取建筑增加建筑的多样性。如图20所示为街区内部建筑排布的一种结果。
外围建筑排布遍历街区节点,每次将当前节点和下一节点向内扩展一个人行道的距离,记录为一条新的直线。相邻直线求交点算的新的多边形用于生成外围的建筑排布。外围的建筑分为,街角的建筑和街边的建筑。如图21所示,四角为街角建筑,其余为街边建筑。预先定义建筑的宽度、厚度和间隔。根据预设算得宽度,将两个顶点所构成的边用插值得方法离散为多个顶点,用于后续的建筑生成。生成街角建筑的方法为,取得街角顶点的下一条边的离散点的第一个点和上一条边的最后一个离散点,并且在这两个离散点对应的道路垂直方向扩展出新的点。另外分别计算得到街角与上述两个离散点的中心位置也作为新点。将六个点按顺序记录得到街角建筑的顶点坐标。生成街边建筑的方法为,除去离散顶点的头尾顶点,将其余顶点按照道路方向垂直向内扩展一个厚度,从而计算出街边建筑的四个顶点的坐标。
屋顶的着色器采用世界坐标作为贴图的UV,墙壁的着色器采用顶点的UV,如图22所示为建筑生成的最终效果。
生成完成之后所得的结果就是整个城市,整个城市会直接出现在Unity的场景中。如图24所示。
本发明说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。尽管上面对本发明说明性的具体实施方式进行了描述,以便于本技术领的技术人员理解本发明,但应该清楚,本发明不限于具体实施方式的范围,对本技术领域的普通技术人员来讲,只要各种变化在所附的权利要求限定和确定的本发明的精神和范围内,这些变化是显而易见的,一切利用本发明构思的发明创造均在保护之列。
Claims (2)
1.一种随机可控城市生成方法,其特征在于:包括以下步骤:
步骤1,数据输入和河流绘制;
步骤2,城市路网的初步生成;
步骤3,路网桥梁连接;
步骤4,路网优化;
步骤5,规划路网主次干道;
步骤6,路口和直线道路生成;
步骤7,街区地面生成;
步骤8,建筑物的排布及生成;
所述步骤2中城市路网初步生成的具体方法是:采用有限元网格划分的方法,根据城市的边界以及河流的分布,把城市内部区域划分成由多个单元组成的网格,即得到由节点组成的无向图,经过步骤2将会得到城市路网的数据,数据包括城市中所有的路口节点的数据、所有道路的节点数据以及道路等级和属性、所有街区的节点数据和所属分区;
所述步骤3中路网桥梁连接的具体方法是:设定一个阈值,代表桥梁最长的长度,遍历所有外边的节点A,查找点A阈值范围内的所有外边节点,如果在这些查找到的节点中找到距离最近的节点B,如果节点B与A同属于一条外边则不生成,如果是不同的两条外边且为被用于生成桥梁,则连接两节点,生成对应道路,标记为桥梁,两节点标记为已被生成桥梁,生成完之后,需要对桥梁与桥梁之间做碰撞检测,如果有碰撞则删除一条桥梁,并且要对桥梁与附近的外边的边进行碰撞检测,避免出现桥梁穿过陆地的情况;
所述步骤5规划路网主次干道的具体方法为:先将城市中的各个热点相连,用寻路算法计算出热点之间主干道,再从主干道上扩展出次干道,从而实现城市的主次干道规划;所述热点的确定为:将工业区、商业区、办公区作为城市热点区域,城市的分区信息记录在贴图中传入路网生成算法,并且在道路节点生成时通过查找节点在贴图上对应的颜色信息,记录该节点所属的分区,对城市路网的无向图用改进的并查集进行处理,将相连且分区属性相同的道路节点划分到一个集合中去,算法结束时,可得到若干个节点集合,每一个集合为一个分区,对工业区、商业区、办公区的集合求坐标中心点,查找距离中心点最近的道路节点作为热点;
所述步骤1中数据输入的具体方法是:对Unity的编辑器进行扩展,在编辑器中进行城市信息的输入,涉及城市的尺寸、标准的街区尺寸、河流边界、功能分区;河流绘制的具体方法是:为了达到随机可控的生成城市的目的,采用在unity插件上进行河流边界绘制的方法,将笔刷设置为一个多边形,绘制时将多边形与已绘制的多边形进行布尔运算得到新的多边形,并且对多边形进行优化得到最终的多边形;
所述步骤4中路网优化方式包括平整优化、两道路路口优化、三角街区优化、三道路路口优化、特殊街区优化、道路数量超过4条的多道路路口优化;
所述步骤6路口和直线道路生成中直线道路网格的生成按照道路数据生成一个四边形的网格;在每一个道路节点所在的位置生成一个路口,路口的网格生成分为两部分,一是路口中心部分,二是斑马线部分,首先生成路口中心的多边形,再生成斑马线部分的网格;
所述步骤7街区地面生成的具体方法为:先根据街区边界所属道路的宽度,重新计算新的节点集合来充当实际的街区的边界;通过遍历原始街区的每两个节点,查找到两个节点对应的道路,根据道路信息中宽度创建新的直线,相邻直线的交点为的新的实际街区的节点位置;
所述步骤8建筑物的排布及生成中建筑的网格分为屋顶和墙壁两部分;其中,屋顶部分的网格生成方法为,根据传入的节点和高度信息计算得到屋顶的顶点信息,调用多边形三角化算法计算三角形索引;墙壁部分的网格生成方法为,将已有建筑的屋顶多边形和地面多边形的顶点作为墙壁网格的顶点,遍历底部的地面多边形,将地面两个顶点和顶部屋顶多边形对应的两个顶点作为一个四边形生成,方法类似于道路网格生成;
所述步骤8中建筑物的排布包括内部建筑的排布和外围建筑的排布;所述内部建筑排布利用多边形填充算法;所述外围建筑排布遍历街区节点,每次将当前节点和下一节点向内扩展一个人行道的距离,记录为一条新的直线,相邻直线求交点算的新的多边形用于生成外围的建筑排布。
2.根据权利要求1所述的一种随机可控城市生成方法,其特征在于:所述外围建筑的排布包括街角建筑物的排布和街边建筑物的排布;其中,街角建筑排布的方法为,取得街角顶点的下一条边的离散点的第一个点和上一条边的最后一个离散点,并且在这两个离散点对应的道路垂直方向扩展出新的点,另外分别计算得到街角与上述两个离散点的中心位置也作为新点,将六个点按顺序记录得到街角建筑的顶点坐标;街边建筑排布的方法为,除去离散顶点的头尾顶点,将其余顶点按照道路方向垂直向内扩展一个厚度,从而计算出街边建筑的四个顶点的坐标;住宅区的街区同时有内部建筑的排布和街边建筑物排布两种排布,其余的工业区、商业区和办公区都是用内部建筑排布方式。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111109006.9A CN113706715B (zh) | 2021-09-22 | 2021-09-22 | 一种随机可控城市生成方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111109006.9A CN113706715B (zh) | 2021-09-22 | 2021-09-22 | 一种随机可控城市生成方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113706715A CN113706715A (zh) | 2021-11-26 |
CN113706715B true CN113706715B (zh) | 2024-02-02 |
Family
ID=78661433
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111109006.9A Active CN113706715B (zh) | 2021-09-22 | 2021-09-22 | 一种随机可控城市生成方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113706715B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115394170B (zh) * | 2022-07-29 | 2024-05-03 | 北京城市网邻信息技术有限公司 | 电子沙盘构建方法、装置、电子设备及存储介质 |
CN115564122B (zh) * | 2022-10-14 | 2023-06-13 | 中国测绘科学研究院 | 优化建设阈值选择的城市实体地域划定方法、装置及设备 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2005274994A (ja) * | 2004-03-25 | 2005-10-06 | Geo Technical Laboratory Co Ltd | 3次元地図データの生成方法 |
DE102008010620A1 (de) * | 2008-02-22 | 2009-09-03 | Navigon Ag | Verfahren zur Erzeugung einer digitalen Straßenkarte |
CN104732591A (zh) * | 2015-03-10 | 2015-06-24 | 中国科学院遥感与数字地球研究所 | 三维虚拟城市的自动生成方法 |
CN105222793A (zh) * | 2015-10-23 | 2016-01-06 | 华中科技大学 | 一种基于矢量地图数据模型的城市层次化区域划分方法 |
CN109191561A (zh) * | 2018-07-12 | 2019-01-11 | 中山大学 | 面向交通环境污染模拟的城市三维建筑物快速建模方法 |
CN110135351A (zh) * | 2019-05-17 | 2019-08-16 | 东南大学 | 基于城市建筑空间数据的建成区边界识别方法及设备 |
-
2021
- 2021-09-22 CN CN202111109006.9A patent/CN113706715B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2005274994A (ja) * | 2004-03-25 | 2005-10-06 | Geo Technical Laboratory Co Ltd | 3次元地図データの生成方法 |
DE102008010620A1 (de) * | 2008-02-22 | 2009-09-03 | Navigon Ag | Verfahren zur Erzeugung einer digitalen Straßenkarte |
CN104732591A (zh) * | 2015-03-10 | 2015-06-24 | 中国科学院遥感与数字地球研究所 | 三维虚拟城市的自动生成方法 |
CN105222793A (zh) * | 2015-10-23 | 2016-01-06 | 华中科技大学 | 一种基于矢量地图数据模型的城市层次化区域划分方法 |
CN109191561A (zh) * | 2018-07-12 | 2019-01-11 | 中山大学 | 面向交通环境污染模拟的城市三维建筑物快速建模方法 |
CN110135351A (zh) * | 2019-05-17 | 2019-08-16 | 东南大学 | 基于城市建筑空间数据的建成区边界识别方法及设备 |
Non-Patent Citations (2)
Title |
---|
基于前沿推进技术的自适应曲面三角形和四边形网格生成方法研究;孙力胜;《中国优秀硕士学位论文全文数据库基础科学辑》;A002-143 * |
基于有限元网格划分的城市道路网建模;王元等;《图学学报》;第37卷(第3期);第377-385页 * |
Also Published As
Publication number | Publication date |
---|---|
CN113706715A (zh) | 2021-11-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN113706715B (zh) | 一种随机可控城市生成方法 | |
CN113239442B (zh) | 一种三维模型构建方法、装置、设备和计算机可读存储介质 | |
US10606962B2 (en) | Horizontal optimization of transport alignments | |
Galin et al. | Authoring hierarchical road networks | |
CN104766366A (zh) | 一种三维虚拟现实演示的建立方法 | |
CN111080786B (zh) | 基于bim的室内地图模型构建方法及装置 | |
CN106980633A (zh) | 室内地图数据的生成方法及装置 | |
CN110909961B (zh) | 基于bim的室内路径查询方法及装置 | |
CN111858810B (zh) | 一种面向道路dem构建的建模高程点筛选方法 | |
CN110404261A (zh) | 游戏中虚拟路网的构建方法及装置 | |
CN112328722B (zh) | 电力变电站三维gis和模型数据快速加载方法和系统 | |
CN111121785A (zh) | 一种基于图搜索的无道路路径规划方法 | |
CN109872390B (zh) | 一种海量三维模型的组织方法 | |
JP4619504B2 (ja) | 3次元デジタル地図作成装置 | |
CN112221144A (zh) | 三维场景寻路方法及装置、三维场景地图处理方法及装置 | |
RU2296368C2 (ru) | Способ отсечения линии и способ отображения трехмерного изображения на основе этого способа | |
CN112288854B (zh) | 立交桥三维模型的构建方法 | |
de Smith | Distance transforms as a new tool in spatial analysis, urban planning, and GIS | |
CN115830255B (zh) | 一种仿真场景生成方法、装置、电子设备和存储介质 | |
CN116764225A (zh) | 一种高效寻路的处理方法、装置、设备及介质 | |
CN113704945B (zh) | 管网道路的关联分析方法及装置、存储介质、电子设备 | |
US11846517B2 (en) | Vector tile navigation | |
CN112362073B (zh) | 一种基于凸包特征的导航路径建模及最短路径求解方法 | |
CN115033972A (zh) | 一种建筑主体结构批量单体化方法、系统及可读存储介质 | |
Mekni et al. | Semantically-enhanced virtual geographic environments for multi-agent geo-simulation |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |