b站UP主七里雪凝的湖边小屋教程——P3【Houdini】萌新的《湖边小屋》教程拆解与实现,殊途同归!_哔哩哔哩_bilibili
目录
内容概括
make_ceiling这一部分主要是将面能合并的都合并起来,用到了For-loop with Feedback 循环节点,attributewrangle来输入VEX进行程序化操作。
VEX代码
int merge_queue[];
int primnum,share_prim,prim_hedge,equiv_hedge,next_hedge;
merge_queue=expandprimgroup(0,"ceiling");
while(len(merge_queue)){
primnum=pop(merge_queue, 0);
prim_hedge=primhedge(0,primnum);
next_hedge=prim_hedge;
do{
equiv_hedge=hedge_nextequiv(0,next_hedge);
if(equiv_hedge!=next_hedge){
share_prim=hedge_prim(0,equiv_hedge);
if(removevalue(merge_queue,share_prim)){
removeprim(0,primnum,1);
if(hedge_srcpoint(0,equiv_hedge)==hedge_srcpoint(0,next_hedge)){
setprimvertex(0,-1,hedge_srcvertex(0,equiv_hedge),hedge_presrcpoint(0,next_hedge));
setprimvertex(0,-1,hedge_dstvertex(0,equiv_hedge),hedge_postdstpoint(0,next_hedge));
}else{
setprimvertex(0,-1,hedge_srcvertex(0,equiv_hedge),hedge_postdstpoint(0,next_hedge));
setprimvertex(0,-1,hedge_dstvertex(0,equiv_hedge),hedge_presrcpoint(0,next_hedge));
}
break;
}
}
next_hedge=hedge_next(0,next_hedge);
}while(next_hedge!=prim_hedge);
}
VEX代码详细理解
//创建所需变量
int merge_queue[];
int primnum,share_prim,prim_hedge,equiv_hedge,next_hedge;
merge_queue=expandprimgroup(0,"ceiling"); //取出ceiling组的所有面并组成数组
while(len(merge_queue)){ //循环判断标准是面数组的长度
primnum=pop(merge_queue,0); //取出面数组的第0个也就是第一个面,且把这个面在这个数组中删除
prim_hedge=primhedge(0,primnum); //任意取出这个面的一半边
next_hedge=prim_hedge; //命名
do{ //再做一个循环
equiv_hedge=hedge_nextequiv(0,next_hedge); //取等价的半边
if(equiv_hedge!=next_hedge){ //判断是否是内部边,因为如果是边界边则==成立
share_prim=hedge_prim(0,equiv_hedge); //得到equiv_hedge所属于的面
if(removevalue(merge_queue,share_prim)){//从面的数组中找到share_prim面并删除,如果找到就返回1,找不到返回0
removeprim(0,primnum,1); //从几何体中删除原始的面1,后面的数字“1”表示同时删除面上的与其他面无关联的点
if(hedge_srcpoint(0,equiv_hedge)==hedge_srcpoint(0,next_hedge)){//情况1-下图左
//equiv_hedge起点 移动到 next_hedge前一个边起点
//equiv_hedge终点 移动到 next_hedge后一个边终点
setprimvertex(0,-1,hedge_srcvertex(0,equiV_hedge),hedge_presrcvertex(0,next_hedge));
setprimvertex(0,-1,hedge_drtvertex(0,equiv_hedge),hedge_postdstvertex(0,next_hedge));
}else{ //情况2-下图右
//equiv_hedge起点 移动到 next_hedge下一个边终点
//equiv_hedge终点 移动到 next_hedge前一个边起点
setprimvertex(0,-1,hedge_srcvertex(0,equiv_hedge),hedge_postdstvertex(0,next_hedge));
setprimvertex(0,-1,hedge_dstvertex(0,equiv_hedge),hedge_presrcvertex(0,next_hedge));
}
break;
}
}
next_hedge=hedge_next(0,next_hedge);
}while(next_hedge!=prim_hedge);
}