日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Houdini湖边小屋-屋顶细分详细过程记录

發(fā)布時間:2023/12/20 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Houdini湖边小屋-屋顶细分详细过程记录 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

??b站UP主七里雪凝的湖邊小屋教程——P3/P4【Houdini】萌新的《湖邊小屋》教程拆解與實現(xiàn),殊途同歸!_嗶哩嗶哩_bilibili

目錄

內(nèi)容概括

詳細步驟

1 [Facet節(jié)點]讓每個ceiling面片擁有自己的points

2 [Attribute Wrangle節(jié)點]定義一些需要用到的屬性

3 [Attribute Wrangle節(jié)點]劃分branch面

3 [Attribute Wrangle節(jié)點]劃分trunk面

4 [Attribute Wrangle節(jié)點]調(diào)整branch的trunk面

5 [Group Delete節(jié)點]刪除不用的group

6 [Attribute Wrangle節(jié)點]劃分每個roof面的level高度

用到的節(jié)點

1.facet節(jié)點

用到的VEX function

1.expandprimgroup

2.primpoints

3.getbbox

2.itoa

3.addpoint

4.set

5.setprimvertex


內(nèi)容概括

把ceiling組的面片正確劃分,為拉伸屋頂做準備。

詳細步驟

1 [Facet節(jié)點]讓每個ceiling面片擁有自己的points

用到了facet節(jié)點

2 [Attribute Wrangle節(jié)點]定義一些需要用到的屬性

主要用到了Attribute Wrangle節(jié)點

教程中形象的用主干trunk和分支branch表示ceiling的面片地位,設定屬性,與attribute create節(jié)點作用相同可以直接在attribute wrangle里用?i@...=... 來設定屬性并賦予初始值。

初值設置為-1是為了與自動初值0分開來。

關于 Houdini中@定義屬性的問題可以看看這篇文章:Houdini定義屬性方式-CSDN

?

3 [Attribute Wrangle節(jié)點]劃分branch面

這一步?Run Over 選擇 Detail(only once)?讓代碼僅運行一次,以下是完整代碼:

int pts[]; vector q0, q1, p1, p2, dir, tan; vector src_minpos, src_maxpos, dst_minpos, dst_maxpos; int ptnum1, ptnum2, new_prim, tri_prim1, tri_prim2; int join_head, join_tail; float width;int prims[] = expandprimgroup(0, "ceiling"); //get all the prims foreach(int main_prim; prims) { //use main_prim to get every prim_number as branch-primpts = primpoints(0, main_prim); //get all points of main_primgetbbox(0, itoa(main_prim), src_minpos, src_maxpos); //get bounding box max&min, returns vectorsforeach(int primnum; prims) {getbbox(0, itoa(primnum), dst_minpos, dst_maxpos); // get a prim as trunk-primif(abs(src_minpos.y - dst_minpos.y) > 0.01) continue; // two prims should be in the same "y"q0 = point(0, "P", pts[0]);q1 = point(0, "P", pts[1]); //get two near pointsif(abs(src_minpos.z - dst_maxpos.z) < 0.01 || abs(src_maxpos.z - dst_minpos.z) < 0.01) {if((dst_minpos.x < src_minpos.x + 0.01) && (dst_maxpos.x + 0.01 > src_maxpos.x)){p1 = set((src_minpos.x + src_maxpos.x)/2.0, src_minpos.y, src_minpos.z);p2 = set((src_minpos.x + src_maxpos.x)/2.0, src_maxpos.y, src_maxpos.z);dir = abs(src_minpos.z - dst_maxpos.z) < 0.01 ? {0,0,-1} : {0,0,1};ptnum1 = addpoint(0, p1);ptnum2 = addpoint(0, p2);p1 = p1.zyx; //change z->x x->zp2 = p2.zyx;q0 = q0.zyx;q1 = q1.zyx;}else continue; // the primnum-prim can not be a trunk}else if (abs(src_minpos.x - dst_maxpos.x) < 0.01 || abs(src_maxpos.x - dst_minpos.x) < 0.01){if(dst_minpos.z - 0.01 < src_minpos.z && dst_maxpos.z + 0.01 > src_maxpos.z){p1 = set(src_minpos.x, src_minpos.y, (src_minpos.z + src_maxpos.z)/2);p2 = set(src_maxpos.x, src_maxpos.y, (src_minpos.z + src_maxpos.z)/2);dir = abs(src_minpos.x - dst_maxpos.x) < 0.01 ? {-1,0,0} : {1,0,0};ptnum1 = addpoint(0, p1);ptnum2 = addpoint(0, p2);}else continue;}else continue;int flag = abs(q0.x - q1.x) < 0.01;//flag =1,lineq0q1 is vertical to linep1p2if(abs(q0.x - p1.x) < 0.01){ //q0 and p1 are on the same "x"setprimvertex(0, main_prim, flag, ptnum1);setprimvertex(0, main_prim, flag + 1, ptnum2);new_prim = addprim(0, "poly", pts[flag], pts[flag + 1], ptnum2, ptnum1);tri_prim1 = addprim(0, "poly", pts[flag - 1], pts[flag], ptnum1);tri_prim2 = addprim(0, "poly", pts[flag + 1], pts[flag + 2], ptnum2);}else{ //q0 and p2 are on the same "x"setprimvertex(0, main_prim, flag + 0, ptnum2);setprimvertex(0, main_prim, flag + 1, ptnum1);new_prim = addprim(0, "poly", pts[flag], pts[flag + 1], ptnum1, ptnum2);tri_prim1 = addprim(0, "poly", pts[flag-1], pts[flag], ptnum2);tri_prim2 = addprim(0, "poly", pts[flag + 1], pts[flag + 2], ptnum1);}//tri_prim1 attributessetprimgroup(0, "triangle", tri_prim1, 1, "set");setprimattrib(0, "join_head", tri_prim1, -1, "set"); //initialvalue need to be set as "-1"setprimattrib(0, "join_tail", tri_prim1, -1, "set");setprimattrib(0, "trunk", tri_prim1, primnum, "set");setprimattrib(0, "heading", tri_prim1, dir, "set");setprimattrib(0, "twin", tri_prim1, -1, "set");//tri_prim2 attributessetprimgroup(0, "triangle", tri_prim2, 1, "set");setprimattrib(0, "join_head", tri_prim2, -1, "set");setprimattrib(0, "join_tail", tri_prim2, -1, "set");setprimattrib(0, "trunk", tri_prim2, primnum, "set");setprimattrib(0, "heading", tri_prim2, dir, "set");setprimattrib(0, "twin", tri_prim2, -1, "set");//set join_head and join_tail valuejoin_head = dir.x + dir.z > 0.01 ? ptnum2 : ptnum1;join_tail = dir.x + dir.z > 0.01 ? ptnum1 : ptnum2;tan = point(0, "P", pts[flag - 1]) - point(0, "P", pts[flag]);width = length(tan)/2;//new_prim attributessetprimattrib(0, "N", new_prim, {0,1,0}, "set"); //normalsetprimgroup(0, "roof", new_prim, 1, "set");setprimattrib(0, "twin", new_prim, main_prim, "set");setprimattrib(0, "trunk", new_prim, primnum, "set");setprimattrib(0, "dir", new_prim, dir, "set");setprimattrib(0, "join_head", new_prim, join_head, "set");setprimattrib(0, "join_tail", new_prim, -1, "set");setprimattrib(0, "width", new_prim, width, "set");//old prim main_prim attributessetprimgroup(0, "ceiling", main_prim, 0, "set"); //remove from group"ceiling"setprimgroup(0, "roof", main_prim, 1, "set"); // add to the newgroup "roof"setprimattrib(0, "twin", main_prim, new_prim, "set");setprimattrib(0, "trunk", main_prim, primnum, "set");setprimattrib(0, "dir", main_prim, dir, "set");setprimattrib(0, "join_tail", main_prim, join_tail, "set");setprimattrib(0, "width", main_prim, width, "set");setprimattrib(0, "branch", primnum, main_prim, "append");setprimattrib(0, "branch", primnum, new_prim, "append");break;}}

每一步的詳細理解

//定義變量 //其中,以下所有涉及到判斷的在>左邊和<右邊都會有0.01,來使判斷更加精確 int pts[]; vector q0, q1, p1, p2, dir, tan; vector src_minpos, src_maxpos, dst_minpos, dst_maxpos;//編號src在下面代表著branch的面上點,dst代表著trunk的面上點 int ptnum1, ptnum2, new_prim, tri_prim1, tri_prim2; int join_head, join_tail; float width;int prims[] = expandprimgroup(0, "ceiling"); //得到group“ceiling”里所有面的面號 foreach(int main_prim; prims) { //用main_prim取循環(huán)提取prims數(shù)組中的每個面號pts = primpoints(0, main_prim); //得到面號為main_prim的面上的所有點號getbbox(0, itoa(main_prim), src_minpos, src_maxpos); //得到這個面的bounding box的最小點和最大點的坐標,點的類型是vector,這里用到itoa是把整型int轉換成string為了擬合getbbox這個函數(shù)的用法規(guī)則foreach(int primnum; prims) {getbbox(0, itoa(primnum), dst_minpos, dst_maxpos);if(abs(src_minpos.y - dst_minpos.y) > 0.01) continue; //src和dst面至少要在同一個高度,也就是y要相同,如果不同 則跳出這層循環(huán),繼續(xù)找與src面匹配的dst面q0 = point(0, "P", pts[0]);q1 = point(0, "P", pts[1]); //這里的pts就是上面拿到的main_prim面上的點數(shù)組,得到點好為0和1的相鄰點//以下是判斷部分if(abs(src_minpos.z - dst_maxpos.z) < 0.01 || abs(src_maxpos.z - dst_minpos.z) < 0.01) {兩個面是左右的關系if((dst_minpos.x < src_minpos.x + 0.01) && (dst_maxpos.x + 0.01 > src_maxpos.x)){p1 = set((src_minpos.x + src_maxpos.x)/2.0, src_minpos.y, src_minpos.z);p2 = set((src_minpos.x + src_maxpos.x)/2.0, src_maxpos.y, src_maxpos.z);dir = abs(src_minpos.z - dst_maxpos.z) < 0.01 ? {0,0,-1} : {0,0,1};ptnum1 = addpoint(0, p1);ptnum2 = addpoint(0, p2); //注意,set只是創(chuàng)建了vector,還需要addpoint來創(chuàng)建點p1 = p1.zyx; //change z->x x->zp2 = p2.zyx;q0 = q0.zyx;q1 = q1.zyx;}else continue; //說明trunk面在x軸方向上無法把branch面包含住,因此跳出這次循環(huán),繼續(xù)找下一個trunk面}else if (abs(src_minpos.x - dst_maxpos.x) < 0.01 || abs(src_maxpos.x - dst_minpos.x) < 0.01){if(dst_minpos.z - 0.01 < src_minpos.z && dst_maxpos.z + 0.01 > src_maxpos.z){p1 = set(src_minpos.x, src_minpos.y, (src_minpos.z + src_maxpos.z)/2);p2 = set(src_maxpos.x, src_maxpos.y, (src_minpos.z + src_maxpos.z)/2);dir = abs(src_minpos.x - dst_maxpos.x) < 0.01 ? {-1,0,0} : {1,0,0};ptnum1 = addpoint(0, p1);ptnum2 = addpoint(0, p2);}else continue;}else continue;//這個else是兩個面的位置無論在左右還是上下方向上都不共邊,因此兩個面處于獨立關系,重新找trunk面int flag = abs(q0.x - q1.x) < 0.01;//判斷成立,則flag=1,說明線q0q1⊥p1p2 反之則q0q1∥p1p2if(abs(q0.x - p1.x) < 0.01){ //q0和p1在同一邊setprimvertex(0, main_prim, flag, ptnum1);//移動面頂點的位置,但是頂點號的號碼是不會變的setprimvertex(0, main_prim, flag + 1, ptnum2);new_prim = addprim(0, "poly", pts[flag], pts[flag + 1], ptnum2, ptnum1);tri_prim1 = addprim(0, "poly", pts[flag - 1], pts[flag], ptnum1);//側邊的面tri_prim2 = addprim(0, "poly", pts[flag + 1], pts[flag + 2], ptnum2);}else{ //q0和p2在同一邊setprimvertex(0, main_prim, flag + 0, ptnum2);setprimvertex(0, main_prim, flag + 1, ptnum1);new_prim = addprim(0, "poly", pts[flag], pts[flag + 1], ptnum1, ptnum2);tri_prim1 = addprim(0, "poly", pts[flag-1], pts[flag], ptnum2);tri_prim2 = addprim(0, "poly", pts[flag + 1], pts[flag + 2], ptnum1);}//tri_prim1 attributessetprimgroup(0, "triangle", tri_prim1, 1, "set");setprimattrib(0, "join_head", tri_prim1, -1, "set"); //initialvalue need to be set as "-1"setprimattrib(0, "join_tail", tri_prim1, -1, "set");setprimattrib(0, "trunk", tri_prim1, primnum, "set");setprimattrib(0, "heading", tri_prim1, dir, "set");setprimattrib(0, "twin", tri_prim1, -1, "set");//tri_prim2 attributessetprimgroup(0, "triangle", tri_prim2, 1, "set");setprimattrib(0, "join_head", tri_prim2, -1, "set");setprimattrib(0, "join_tail", tri_prim2, -1, "set");setprimattrib(0, "trunk", tri_prim2, primnum, "set");setprimattrib(0, "heading", tri_prim2, dir, "set");setprimattrib(0, "twin", tri_prim2, -1, "set");//set join_head and join_tail valuejoin_head = dir.x + dir.z > 0.01 ? ptnum2 : ptnum1;join_tail = dir.x + dir.z > 0.01 ? ptnum1 : ptnum2;tan = point(0, "P", pts[flag - 1]) - point(0, "P", pts[flag]);width = length(tan)/2;//new_prim attributessetprimattrib(0, "N", new_prim, {0,1,0}, "set"); //normalsetprimgroup(0, "roof", new_prim, 1, "set");setprimattrib(0, "twin", new_prim, main_prim, "set");setprimattrib(0, "trunk", new_prim, primnum, "set");setprimattrib(0, "dir", new_prim, dir, "set");setprimattrib(0, "join_head", new_prim, join_head, "set");setprimattrib(0, "join_tail", new_prim, -1, "set");setprimattrib(0, "width", new_prim, width, "set");//old prim main_prim attributessetprimgroup(0, "ceiling", main_prim, 0, "set"); //remove from group"ceiling"setprimgroup(0, "roof", main_prim, 1, "set"); // add to the newgroup "roof"setprimattrib(0, "twin", main_prim, new_prim, "set");setprimattrib(0, "trunk", main_prim, primnum, "set");setprimattrib(0, "dir", main_prim, dir, "set");setprimattrib(0, "join_tail", main_prim, join_tail, "set");setprimattrib(0, "width", main_prim, width, "set");setprimattrib(0, "branch", primnum, main_prim, "append");setprimattrib(0, "branch", primnum, new_prim, "append");break;}}

3 [Attribute Wrangle節(jié)點]劃分trunk面

完整代碼,跟之前branch的方法差不多,這里就不過多解釋了。

int pts[], ptnum1, ptnum2, new_prim, tri_prim1, tri_prim2, join_head, join_tail; vector dir, q0, q1, p1, p2, src_minpos, src_maxpos, tmp_dir, tan; int prims[] = expandprimgroup(0, "ceiling"); //get trunk prims float width; foreach(int trunk_prim; prims){pts = primpoints(0, trunk_prim);getbbox(0, itoa(trunk_prim), src_minpos, src_maxpos);int branch_prims[] = prim(0, "branch", trunk_prim);dir = 0;q0 = point(0, "P", pts[0]);q1 = point(0, "P", pts[1]);foreach(int branch_prim; branch_prims){dir += abs(prim(0, "dir", branch_prim));}if(dir.x > dir.z || abs(dir.z-dir.x) < 0.01 && src_maxpos.x-src_minpos.x < src_maxpos.z-src_maxpos.z+0.01){p1 = set((src_minpos.x+src_maxpos.x)/2, src_minpos.y, src_minpos.z);p2 = set((src_minpos.x+src_maxpos.x)/2, src_maxpos.y, src_maxpos.z);ptnum1 = addpoint(0, p1);ptnum2 = addpoint(0, p2);tmp_dir = {0,0,1}; //p1p2's direction.p1 = p1.zyx;p2 = p2.zyx;q0 = q0.zyx;q1 = q1.zyx;}else{p1 = set(src_minpos.x, src_minpos.y, (src_minpos.z+src_maxpos.z)/2);p2 = set(src_maxpos.x, src_maxpos.y, (src_minpos.z+src_maxpos.z)/2);ptnum1 = addpoint(0, p1);ptnum2 = addpoint(0, p2);tmp_dir = {1,0,0};}int flag = abs(q0.x - q1.x) <0.01;if(q0.x-p1.x <0.01){setprimvertex(0, trunk_prim, flag, ptnum1);setprimvertex(0, trunk_prim, flag+1, ptnum2);new_prim = addprim(0, "poly", pts[flag], pts[flag+1], ptnum2, ptnum1);tri_prim1 = addprim(0, "poly", pts[flag -1], pts[flag], ptnum1);tri_prim2 = addprim(0, "poly", pts[flag+1], pts[flag+2], ptnum2);}else{setprimvertex(0, trunk_prim, flag, ptnum2);setprimvertex(0, trunk_prim, flag+1, ptnum1);new_prim = addprim(0, "poly", pts[flag], pts[flag+1], ptnum1, ptnum2);tri_prim1 = addprim(0, "poly", pts[flag-1], pts[flag], ptnum2);tri_prim2 = addprim(0, "poly", pts[flag+1], pts[flag+2], ptnum1);}//tri_prim1 attributessetprimgroup(0, "triangle", tri_prim1, 1, "set");setprimattrib(0, "join_head", tri_prim1, -1, "set"); //initialvalue need to be set as "-1"setprimattrib(0, "join_tail", tri_prim1, -1, "set");setprimattrib(0, "trunk", tri_prim1, -1, "set");setprimattrib(0, "twin", tri_prim1, -1, "set");//tri_prim2 attributessetprimgroup(0, "triangle", tri_prim2, 1, "set");setprimattrib(0, "join_head", tri_prim2, -1, "set");setprimattrib(0, "join_tail", tri_prim2, -1, "set");setprimattrib(0, "trunk", tri_prim2, -1, "set");setprimattrib(0, "twin", tri_prim2, -1, "set");join_head = ptnum2;join_tail = ptnum1;tan = point(0, "P", pts[flag-1]) - point(0, "P", pts[flag]);width = length(tan)/2;//new_prim attributessetprimattrib(0, "N", new_prim, {0,1,0}, "set"); //normal setprimgroup(0, "roof", new_prim, 1, "set");setprimattrib(0, "twin", new_prim, trunk_prim, "set");setprimattrib(0, "trunk", new_prim, -1, "set");setprimattrib(0, "branch", new_prim, branch_prims, "set");setprimattrib(0, "dir", new_prim, tmp_dir, "set");setprimattrib(0, "join_head", new_prim, join_head, "set");setprimattrib(0, "join_tail", new_prim, -1, "set");setprimattrib(0, "width", new_prim, width, "set");//old prim trunk_prim attributessetprimgroup(0, "ceiling", trunk_prim, 0, "set"); //remove from group"ceiling"setprimgroup(0, "roof", trunk_prim, 1, "set"); // add to the newgroup "roof"setprimattrib(0, "twin", trunk_prim, new_prim, "set");setprimattrib(0, "trunk", trunk_prim, -1, "set");setprimattrib(0, "dir", trunk_prim, tmp_dir, "set");setprimattrib(0, "join_tail", trunk_prim, join_tail, "set");setprimattrib(0, "width", trunk_prim, width, "set"); }

4 [Attribute Wrangle節(jié)點]調(diào)整branch的trunk面

這一步驟主要是因為一個trunk面會被劃分成兩個面,也就是有個twin面,之后要讓branch對應的是原來的turnk還是trunk的twin對應的更精確。

Group 是 roof 和 triangle

這里的?Group Type 和?Run Over 都是 Primitive,也就是對于每個面都走一遍這個代碼

vector src_minpos, src_maxpos, dst_minpos, dst_maxpos; if(len(i[]@branch) == 0){ // this prim has no branchi[]@branch = prim(0, "branch", prim(0, "twin", @primnum)); //這個面的twin面的branch } if(i@trunk >= 0){ //this prim has its trunk getbbox(0, itoa(@primnum), src_minpos, src_maxpos);getbbox(0, itoa(i@trunk), dst_minpos, dst_maxpos);if(abs(dst_maxpos.z - src_minpos.z) < 0.01 || abs(src_maxpos.z - dst_minpos.z) <0.01){if(src_maxpos.x <dst_maxpos.x + 0.01 && src_minpos.x + 0.01 >dst_minpos.x){return;//}}else if(abs(dst_maxpos.x - src_minpos.x) < 0.01 || abs(src_maxpos.x - dst_minpos.x) <0.01){if(src_maxpos.z <dst_maxpos.z + 0.01 && src_minpos.z + 0.01 >dst_minpos.z){return;}}i@trunk = prim(0, "twin", i@trunk);//則trunk的twin成為當前branch面的真正的trunk }

5 [Group Delete節(jié)點]刪除不用的group

6 [Attribute Wrangle節(jié)點]劃分每個roof面的level高度

這一步很重要,關系到后期拉高每個面的高度的步驟,建議自己看教程的P4部分

int roofs[], levels[]; int trunk, branch[], level, twin, init_level, cur;void cut_loops(int trunk; int twin){ //提前規(guī)定一個函數(shù),用來setprimattrib(0, "trunk", trunk, -1, "set");setprimattrib(0, "trunk", twin, -1, "set");setprimattrib(0, "join_head", trunk, -1, "set");setprimattrib(0, "join_head", twin, -1, "set");setprimattrib(0, "join_tail", trunk, -1, "set");setprimattrib(0, "join_tail", twin, -1, "set"); //^ 符號的作用:比較兩個值如果相同則為0,如果不同則為1 int join_head, join_tail;join_head = -1 ^ prim(0, "join_head", trunk) ^ prim(0, "join_head", twin);join_tail = -1 ^ prim(0, "join_tail", trunk) ^ prim(0, "join_tail", twin);setpointattrib(0, "heading", join_head, {0,0,0}, "set");setpointattrib(0, "heading", join_tail, {0,0,0}, "set");//delete branchint ttrunk = prim(0, "trunk", trunk);int ttwin = prim(0, "twin", trunk);int trunk_branch[] = prim(0, "branch", ttrunk);removevalue(trunk_branch, trunk);removevalue(trunk_branch, twin);setprimattrib(0, "branch", ttrunk, trunk_branch, "set");setprimattrib(0, "branch", ttwin, trunk_branch, "set");} roofs = expandprimgroup(0, "roof"); resize(levels, max(roofs)+1);//change the array:levels[]'s size foreach(int pr; roofs){trunk = prim(0, "trunk", pr);//current_prim's trunkint count = 0;while(trunk != -1){ // if there is a loop include current_prim : if(trunk == pr){ //find which prim's trunk is the first prim?push(loops, pr);//add prim-pr to array loops[];break;}trunk = prim(0, "trunk", trunk);count ++;if(count >= len(roofs)) break; } } //now we have loops[], roofs[], levels[] while(len(roofs)){trunk = pop(roofs, 0);//remove the prim at 0 and returns itpush(roofs, trunk);//add trunk to the end of roofs[]branch = prim(0, "branch", trunk);if(len(branch) && len(roofs) > len(loops)) continue; //we want to get a prim with no branch: level = 0; while(removevalue(roofs, trunk)){twin = prim(0, "twin", trunk);removevalue(roofs, twin);//do the same thing to the twin-primif(removevalue(loops, trunk)){removevalue(loops, twin);}else{// this trunk-prim can be the next one when do the leveluplevel++;levels[trunk] = levels[twin] = level;}trunk = prim(0, "trunk", trunk);} //get back to the first prim: if(trunk >=0 && level++ > levels[trunk]){init_level = levels[trunk];level = level - init_level; cur = trunk;while(prim(0, "trunk", cur) != trunk){ //if init_level=0, levels[cur]=levels[cur]+level &&level++;levels[cur] += init_level ? level : level++;cur = prim(0, "trunk", cur);}levels[cur] += level;if(!init_level){twin = prim(0, "twin", cur);cut_loops(cur, twin);//cut the last prim in the loop} } } for(int i=0;i<len(levels);i++){if(levels[i]){setprimattrib(0, "level", i, levels[i], "set");} }

用到的節(jié)點

1.facet節(jié)點

Facet (sidefx.com)

Facet節(jié)點的主要作用是處理點或面的法線(normal)的相關操作,當導入一些雜亂的平面時facet可以用來整理(consolidate)平面的點和翻轉的法線。

其中Unique Points選項可用來給所有面的頂點vertices創(chuàng)建自己的points,讓面不共享points。

用到的VEX function

1.expandprimgroup

expandprimgroup (sidefx.com)

expandprimgroup(geometry, "groupname"); //其中groupname是個string類型,返回這個group里primitive的number,返回的是一個數(shù)組。

2.primpoints

primpoints (sidefx.com)

int?[]?primpoints(geometry,?primnum);// 其中primnum是int類型的面號,返回面號為primnum的面里的所有點。

3.getbbox

getbbox (sidefx.com)

getbbox(geometry,&min,&max); // 得到這個幾何體bounding box的最小邊界值和最大邊界值,這個&min和&max的類型是vector,也就是向量類型,目標檢測中bounding box的VOC邊框表示法就是(x_min,y_min,x_max,y_max),因此返回的值可以理解為點的坐標。

2.itoa

itoa (sidefx.com)

itoa(int類型的變量); //將整數(shù)轉換成字符串string類型

3.addpoint

addpoint (sidefx.com)

addpoint(geometry,point_number); //創(chuàng)建一個跟點號為point_number具有相同屬性和組關系的新點

addpoint(geometry,position); //后面的position是個vector,在幾何體添加一個位置是position的點

4.set

set (sidefx.com)

vector2- set(v1,v2)

vector- set(v1,v2,v3)

... 創(chuàng)建一個vector或matrix(向量或矩陣)

5.setprimvertex

setprimvertex (sidefx.com)

把幾何體的一個頂點vertex變成另一個不同的點

setprimvertex(geometry,prim,vertex_of_prim,point);// 把面prim上的頂點vertexofprim變成point,其中vertex_of_prim是面的頂點號

總結

以上是生活随笔為你收集整理的Houdini湖边小屋-屋顶细分详细过程记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。