Houdini

「Houdini」湖边小屋part3 功能分配

by Ayse, 2022-02-21


Houdini

headfile.png

这一章主要的工作是把每个墙面的类型都分出来。确定楼梯和门的位置。 下面我把思路一步步展开说 (1)提取墙体并处理 (2)找楼梯点 (3)分配门、窗和墙 1.png


(1)提取墙体并处理 作者把roof和body都放到了一个subnet里面。然后把platform部分都墙体也整出来,这里需要用上一个divide来对platform的box重新细分一下(用232的bricker Polygons),把这些合并起来并融合、在facet中选择一个面单独拥有顶点(unique Points)(差不多就是顶点熔接的意思)并重新计算法线, 2.jpg

是否勾选uniquepoint的效果
blast出竖直方向(@N.y==0)。用color节点加颜色并排序(作者后面利用了竖直面根据vertexorder排序后都为上面13,下面24的特点)。

(2)找楼梯点 作者判定楼梯点的策略是如果对角向量以及水平向量dir_front没有碰到围墙和墙体就标记为可行。循环里面分为三部分,第一部分是polyexpand和peak,第一步类似边缘offset的效果,让它往里回缩0.1,peak是类似surface offset的效果,往法线方向走0.1,主要的目的是让自交的边界问题得到解决。

第二部分是把点的法线改为对角线45度方向。

vector dir1 = @P-point(0, "P", (@ptnum+1)%npoints(0));
vector dir2 = @P-point(0, "P", (@ptnum-1)%npoints(0));

v@N = rint(normalize(dir1 + dir2));
//先normalize后返回出来的竖直方向向量一定为1
i@prim = 0;

这个算法首先它用取余的方法保证了序号一定在0123,-1会被取余到3去,然后就是对角线normalize然后rint,rint对向量的效果根据文档说的是把每一个部分都实现四舍五入,而在本次这种2*3的面中,必然得到(1,-1)这样类似的结果。 4.png

第三部分则是碰撞检测,一个是新normal,一个是normal水平化,都碰不到东西就在这个位置加入一个点,并把本次循环的prim序号(循环次数)保存进去,把prim移除。完事儿了就得到一堆长长的点和他们的normal。得到这些点之后随机选取一个(作者设置了一个probablity限制也可能没有,反正看自己对房子的定义吧) 6.png

(3)分配门、窗和墙 颜色普遍只是为了debug,不影响后续功能 第一部分是确定必然墙体的部分(大部分面向房顶,面向楼梯) 面向房顶:用面中心低一点的位置射线检测房顶 面向楼梯:点云检测是否碰到楼梯点,同时每个面只选择13(上)两点检测,如果检测到了就再判定normal是否和当前面的normal垂直,如果是就判定yes!

第二部分是选择window的,随机选择面积大于3 非wall的面(防止阳台面入选),随机分配window。楼上出现window的概率可以整大一点

第三部分是选择door的,楼上的door就是楼梯点的面,把四个点做一个点云检测看看是不是一个面就可以。楼下就随便在非wall的点选一个

第四部分把其他面都搞成wall(”@type== “) 7.png 这一步总体逻辑是比较简单的,不展开叙述代码了。


本文参考:知乎冬青大佬的解析文章 https://www.zhihu.com/people/dong-qing-41-73-30 b站转载的原教程视频https://www.bilibili.com/video/av53868198/ (建议可以用chrome的英文字幕插件来进行观看)

作者: Ayse

2024 © typecho & elise