如何做图中的屋顶上面随机的开洞?
(上图来源于网络)
今天就和大家一起讨论一下这张图
咱们可以先观察观察这张图
其开洞有大有小
开洞的样式是菱形,其开洞形式就是在一组菱形的网格下,对每个菱形网格进行缩放等操作,形成一个个比原来菱形要小的菱形。
下面看具体操作
1.我们就用一块曲面来做这个案例
先在rhino中建一个曲面,再将其拾取到GH当中。
2.然后利用GH里的一个插件 lunchbox。
用其diamond panels运算器将其细分成菱形面(初学者不建议依赖插件懂有这个东西就行了。最初的学习还是以GH自带运算器为主)
(黑色的边线只是显示效果,为了让大家看的更清楚)
3.初始的菱形面做出来了,然后我们要做的是将每个菱形面的边线提取出来,然后缩放。
先提取边线,提取边线这步我比较粗暴。之间将面接给曲线参数,自动就转化成曲线了。当然也可以用brep edges等先提取边线再join。
4.再缩放。
缩放的中心点可以用area运算器得出,但是area运算器比较占运算器资源。
所以polygon ceter运算器就会成为我们不错的选择。
5.找到缩放中心点之后,接下来定的是缩放比例。
还是来看之前的图,比例是随机的,比初始的菱形面小就行。也就是缩放比例是在0-1之间的随机值,随机当然是random运算器了,然后生成一组与曲线数目相同的随机值。
诶,有点意思了。但是还不够,有些曲线缩放后几乎看不见了,这可能是我们想要避免的。
6.这时候当然是再在程序中加入一个graph mapper了,并设置graph type为bezier。
可以很方便地调节出我们觉得合适的大小。
这一步做好之后,我们可以打个组。
后期再调节亦或整理思路的时候都会很方便。
7.这一步做完之后,我们可以先开洞看看效果。将初始的菱形曲线和缩放后的菱形曲线,都接入boundary surface,记得右键flatten拍平。
是不是就成功了
不过这里又有新的问题
我不想每个菱形面都开洞怎么办
ok我们继续
(这里啰嗦一下,如之前缩放后想控制缩放大小,这里控制完大小之后我们又想控制开洞数量,一个程序可能会有多个变量,一个个来解决就行)
继续↓
8.在缩放后的菱形曲线后(为什么不是缩放前的可以自己尝试一下噢)。接入一个random reduce,再接入boundary surface。
9.就可以控制开洞的数量,以及随机开洞的位置(大小在之前我们写好的程序调)。
ok搞定
结束了?
然鹅,当我也以为是完了的时候。后来发现还没完,就在我打算发文前一刻,我测试了一下。
用这样的一个面,直接拾取进去,结果只有这么一部分白色的成面了。
what!?
扎心了
问题出在boundary surface,它只能成平面,不能成曲面。大意了大意了。
好吧
只能重新成面了
成面其实好成啊,用4点成面工具就可以搞定。那中间的开洞怎么开呢?用缩放后的曲线去修剪吗?
这个我是尝试过的,容易出错容易卡,只能另辟蹊径。
外面的曲线我有了,里面缩放后的曲线我也有了,将他们一一对应缩放不就得了。
因为初始的曲线和缩放后的曲线都是多段线,将它们先炸开,然后在一一对应地放样。
如果因为路径不对应无法放样,可以右键simplify。
然后发现
成啦
bake出去后的效果
这样成面是可以的。不过这时候当然又有新问题。控制开洞大小的那部分是仍然可以继续用的,但是控制开洞数量那部分我们可能要调整下。
如果仍然用random reduce给放样双方相同的变量。
这样好像是可以成功的,但这里有个问题(这句话说了好多遍),就是被random reeduce的曲线,找不回来了。而那里本来是不需要掏洞的位置,所以这里咱们不用random reduce。
我们这里其实就是筛选哪些曲线放样开洞,哪些曲线不参与放样,其实就是true和false的关系,所以这里用dispatch来筛选。
这里就是在0-1之间随机取值,然后四舍五入得到0或者1这两个整数。0和1分别对应的就是false和ture,将得到的布尔值接入dispatch,分别将放样的双方筛选出来(必须接同一组布尔)。
放样和没调节数量之前一样
关键是没有开洞的面可以生成了,通过dispatch的B端输出曲线,将其炸开取顶点,然后四点成面就搞定了。
着色看看效果
感谢建筑小蝈蝈授权分享
欢迎关注他们的微信公众号
微信号:ArchiGG
请教下如果不用lunchbox要怎么做那个菱形面