您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 源支始 于 2020-1-9 14:56 编辑
一位知乎网名为杨超的大大使用houdini生成路网并把它记录了下来,让我们赶紧来学习一下吧!!! 下面是大大发布的原文: 注:本文于2019-8-4重写。原因是随着试验的进行,思路有一些变化。 近期一直在尝试用houdini生成路网,反复改了好几版,走了不少弯路,现在终于初步有点儿样儿了,但仍然只是个架子,因为涉及到的细节实在太多。 先把这个架子的搭建写一下,后面再继续弄细节。 截图(2019-8-19更新):

-- 一,初始数据 curve圈地: 若干curve作为主干道: 利用上述材料分别生成下面poly和线框,其中又用bricker划分了一次,想法是让bricker生成的边作为次级道路(宽度略窄)。
线框用于生成道路,poly用于生成孤岛。edge或point上可以添加路的宽度属性。 二,十字路口、人行道 在线框上计算各十字路口尺寸。 其中每一个十字的四个端点都是根据路宽和道路夹角计算出的人行道位置,将人行道copy to point并使人行道长度等于路宽即可。如下图: 人行道位置计算,即解下面平面几何题: 三,道路生成 对线框中每个路口处线段carve掉一小段,使curve掉的长度恰等于十字的臂长加人行道宽度: 然后sweep生成道路: 四,小路 对于当前poly上的每块区域,再进一步细分,新增分割线作为小路。分割方法使用随机二叉分割,从而生成不规则的pattern: 对分割后的poly按路宽进行expand,得到: 对expand后的每个小块增加圆角,并挤出成马路牙子: 五,建筑 对expand后的每个小块进一步随机二叉划分,生成建筑布局: 对布局expand(扩张间距最好适当给些变化),得到各建筑的底面: 其中有些小块压根没进行分割,直接整体作为绿地,还有一些分割出的“建筑底面”也用作了绿地: 六,投到地形上 将前述零件攒到一起,并把建筑挤出,就有一个基本的城市雏形了: 上图充满童真童趣,但我想往写实上走,故增加视觉复杂度,将其投到起伏不平的地形上。 建一个地形: 把城市区域标出来: 对标记区域进行blur: 把城市ray上去。 根据实际观察,现实中一些起伏比较大的路边,往往会有高台,建筑建在高台上。因此这里我对每个块计算了坡度,对于坡度较小的块,直接投上去,对于坡度较大的块,生成平台。另外道路应尽量保持左右两侧等高。
--不足与展望: 1,还缺很多东西:例如电线杆、路灯、交通灯、公交站点、高台台阶和围栏、人行道口的铁栅栏、人行道口的斜坡、天桥、立交桥,树和灌木,等等。 2,建筑只是简单凑合了一下,比较千篇一律且挫。另外所有建筑均现生成速度也比较慢,不如先预生成(或制作)模型库然后再往上copy。 --2019-8-26 前面的人行道算法基于直线,对于在交叉口曲率很大的弯路会不精确,尝试了下新的计算方法效果如下:
弯路人行道计算
鲁棒性出呼意料,试了各种连接方式都得到了正确结果: --2019-9-2 1,生成了一下人行道uv,另外把人行横道两端的马路牙子压了一下:
--2019-9-14 实现了线网编辑器和立交桥 在上一篇 杨超:houdini路网 中,主干道用curve绘制,其余自动生成。能出一个能看的东西。 但画线这一步其实应该属于设计层面,过程生成应该是取代重复劳动,但不干扰设计。(除非生成算法能达到自动生成满意的设计的地步,难度有点儿大)。 所以接下来尝试把画线这一步交给用户,即用户画线网,线网输入houdini生成路网模型。 于是需要给用户提供一个方便的线网绘制工具。 一,线网编辑 houdini自带的curve工具虽然能用,而且有诸如吸附等很有用的功能,但却有如下致命的问题: 如果若干curve节点merge到了一些(可能又经过了一些sop处理),这时如果你想对当前结果插入point,只能回到原始的curve节点去插入。但是由于curve节点很多,想找到欲插入point的位置所属的curve节点是很头疼的,而且即使能比较快找到原始curve节点(比如可以通过vex让视图中每个prim都显示其对应的原始curve的名称),每次都需要去点选它,插入point,再回来,也是效率非常低下。 于是决定尝试自己写个所见即所得的线网编辑器。支持以下特性: 1,支持样条曲线。 2,支持拓扑 (移动一个交汇点,所有相关联的边都跟着走)。 3,支持属性(如路宽、路类型等)。 由于unity编辑器开发比较方便,就用unity试了一下,结果果然方便,半天就实现了: 上面是随便画了一个带有不同路宽(不同颜色)和立交桥(有黄色斑点的路径)的路网。 二,数据传给houdini 首先将编辑好的线网转成mesh节点,然后有两种方法可以传给houdini。 一种是导出为obj或fbx,再在houdini中用fileMerge节点读取。 如果做流程的话,第一种更专业一些。我现在快速试验,就用后一种简单方法了。 注:unity官方自带fbx exportor,支持所有8套uv(妈再也不愁属性不够用了): Exporting FBX files from Unityts.fbx@2.0/manual/exporting.html 数据在houdini中复原: 然后就是利用上一篇的生成算法,得到路网模型如下:
--2019-9-23 象征性地加了些box表示建筑,主要为看大感觉。 -- 本篇主要对前两篇做个小结,并考虑后面怎么走。 在上一篇 杨超:houdini路网(2) 由于引入了定制的线网编辑器,已经能应付较复杂的路网结构,包括立交。但也还有一些特性还没有实现,比如并道,感觉有一定难度可能要花比较多的时间,怕陷入恋战,暂且放放。 打算先整体铺开,下一步最重要的就是建筑布局了。 这几天一直在看地图,试图找到一些规律。 重点观察了一下美国,因为google地图美国做得比较细致:卫星地图是3d的,街景甚至能进小区。 城市街区: 大都是规则矩形块,每个地块上两排建筑。这样自然保证了所有建筑都与公路相邻。 城市小区: 小区地块面积比较大,整个地块上都有建筑,因此需要内部路网。 乡村别墅区: 路网比较不规则,地块大小、形状不一,所有房子都沿路边。 补充: 内部路网马路牙子的处理 内部路网通常是在马路牙子之上,例如前述俯瞰图中的小区,从进小区大门开始路面与路边就是等高了: 小区大门小区内部虽然现实中不是所有的内部路网都是路面与路牙等高,但等高的处理起来比较简单,所以不如内部路网都按等高来。 对于商业区内部路网(步行街),由于不走汽车,其与公路交汇处可仅仅是将公路的马路牙子压低,而完全忽视内部道路的形状: 布局算法: 从技术角度,目前初步尝试了下面两种方法。 一,随机分割 随机分割在前面两篇中已经提到,就是对一个地块不断进行横竖分割,得到如下模式: 这种模式不能保证所有小方块都在路边,而且不能保证所有小方块的朝向都平行于路边(除非地块是矩形),百且可能出现异形建筑。 如果此模式用于商业区布局,可如下两种方式对待: 1,将内部建筑扣掉,只留最外一圈。 2,或者保留内部建筑,将内部分割线(或其一部分)看作内部路网(步行街)。 两种情况下地块面积都不宜过大,如果地块过大,1的中心会很空,2的步行路线将过长。 商业区地块最好大多数搞成矩形。 对于非矩形的地块,出现异形建筑并不是问题,而恰恰是与现实吻合。如下图斜路两旁的建筑: 只是异形建筑的生成有一定难度,那是另一个问题了。 二,随机填充 预设一些不同尺寸的矩形,去填充路边区域,可得如下模式: 能保证建筑都沿路边,朝向正对公路,看起来和乡村别墅区的建筑布局比较像。 上图中我故意设定了大小两个级别的矩形,是因为如果都用较大尺寸的矩形去填充,总难免出现很多空挡。 目前的想法是图中每个大尺寸矩形代表一个庭院,如下图红框所示: 而小尺寸矩形则代表一些孤立小屋(在地图上似乎没找到这种例子,但为了视觉,这么处理应该也说得过去)。 庭院和孤立小屋都事先做若干预制,到时候按生成的布局直接往上copy就行。 预制从哪里来?手工建模或者再搞过程化。感觉至少庭院预制用过程化来生成会比较有优势,因为庭院本身又是一个小布局,如果能过程化,则可利用随机性产生大量变体。(我还没开始做)。 --补充: 搜到个别墅区照片,留作参考:
稍微改进了一下乡村别墅区的布局划分。初步效果:
添加了院子(voronoi)和树 --2019-10-5 改进布局。 前面用voronoi做院子,虽然土地利用非常充分,但会出现奇形怪状的院子。改进后使院子形状尽量保持接近矩形。 --补充(2019-10-15) 哦,还有一种填充算法,如评论中所说,用uvlayout(之前我不知道--!)。 不过这个方法怎么用到城市/乡村布局上我还没想好,先记一下,将来应该是会有用的。 教程: Houdini 17 Quicktip: (Ab)Using The UV Layout SOP For Geometry Packing https://vimeo.com/296292351​vimeo.com
测试(在一个正十二边形里填充指定尺寸的矩形):
|