这篇博客介绍了在学习使用Houdini进行过程化生成城市集群的时候的学习笔记中,针对一个block生成对应的Point cloud的方法和流程,以及一些需要注意的地方。
距离上一篇博客大概是大半个月了吧……其实并不是我忘了,我只是纯粹的懒……
之前分别将街区block和建筑聚簇都分别进行了处理,接下来就是针对于不同的block进行建筑的聚簇适配了,并且生成对应的point cloud了。
因此,如果进行任务的拆分的话,那么1) 首先在cluster中过滤出可以匹配该街区的一坨建筑群 2)将该建筑群进行物理模拟,让其匹配街区的边缘 3) 生成point cloud。
如果需要进行建筑群的过滤,那么要先将原本街区几何体的一个面生成一个体,从而将这个体中的建筑扒出来。
首先导入对应的街区Geometry Object,使用unpack
节点展开,然后调用poly extrude
节点生成一个几何体,最后调用transform
把它往下拉到原点。
想要进行Bound裁剪,使用Group Create
,选择Keep in Bounding Regions
,Bounding Type
选择Bounding Object(Point Only)
,从而将在Bound之外的顶点给裁掉。
考虑到那些非常狭长的边或几何体,有必要针对原有的那些建筑聚簇进行一次resample
和fuse
操作。
记得uncheck掉Resample by polygon edge
,防止出现软角。
当然,我们要裁掉集合体,不能出现几何体的一部分,所以使用Group Create
节点中的Include by Edges
,通过递归将对应边上的顶点给裁掉,得到效果如下:
Delete掉外面的点,Pack后,做个Out节点,输出对应消息。
在每个街区中的所有建筑,如果想要适配边缘,那么意味着需要有个力将其往外扯,但是会在边缘处停下。
换句话也就是意味着:1)要有个边缘的碰撞体,2)要有个将其往外拉的力。
实现这个目的也很简单:利用delete
节点的delete by normal
,将原来的几何体的上下两个面给裁掉,然后再次使用poly extrude
节点,生成一个有厚度的墙。
另一块,如果需要有个往外拉的力,结合之前的都是针对于Point进行处理的,所以可以绕着这个建筑的周围使用scatter
节点散布一些顶点,然后将这些顶点通过attribute vop
操作限制在 xoz 平面上。
最终的顶点散布效果如下:
这样一来,进行街区模拟的资源就准备完成了。
进行物理模拟的话就很轻松了,在dopnet中导入地面、墙壁和顶点,然后添加一个POP Attract
作为POP solver
的Pre-sovle
,dopnet如下:
ps1. 墙壁的collision geometry representation需要设定为Concave
,不然墙壁的碰撞会变成一个大凸包几何体。
ps2. rbdpackedobject需要取消sleeping。
然后就可以直接让它开始模拟了,这里设定600帧,模拟后效果如下:
我们只需要留下点就可以了,所以本来只需要一个delete
节点,开启Keep Points
即可。
但是,我们发现,在houdini 13版本的话,直接输出的结果具有冗余数据,所以建议进行一次Unpack再进行一次Pack操作,但是在Houdini 16中,这个问题不存在了。
最后再将这些顶点拉到 xoz 平面上,就完成了一个街区的Point Cloud。
在之后,只要针对每个Block进行一次操作就可以了,所以接下来的操作可能会涉及到很多python脚本操作orz……
<全文完>