最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Houdini學(xué)習(xí)筆記026_互穿插網(wǎng)格(Dual Mesh)

2022-09-09 13:24 作者:獨(dú)孤嘌呤  | 我要投稿

今天我要講的是Dual Mesh(雙重互穿網(wǎng)絡(luò))模型的制作,思路來(lái)自Entagma(鏈接點(diǎn)這里)。原教程是用VOP節(jié)點(diǎn)做的,這里我用的是VEX。

為了觀察起來(lái)方便,我用一個(gè)grid模型為例進(jìn)行講解。先用remesh節(jié)點(diǎn)將其重構(gòu)成三角形網(wǎng)格面。調(diào)節(jié)Target Size以及Iteration等參數(shù)得到如下結(jié)果。

再用divide節(jié)點(diǎn)構(gòu)造多邊形,勾選Compute Dual選項(xiàng)即可。

雖然平面所有點(diǎn)的法線方向都是朝y軸正方向,但后面要拓展為其他的模型,還是用normal節(jié)點(diǎn)分別添加法線(N)屬性。

給兩個(gè)網(wǎng)格模型設(shè)置primitive組,Group Name輸入$OS(組名即節(jié)點(diǎn)名),Group Type選擇Primitives。節(jié)點(diǎn)名稱(chēng)可分別取triangle和polygon。

準(zhǔn)備工作做好之后,下面就是互穿網(wǎng)絡(luò)的制作。思路如下圖所示,原本兩個(gè)模型的邊是相互交叉的,只需要在每條邊上加個(gè)中點(diǎn),往上或往下偏移。只要紅線和黑線偏移的方向剛好是相反的,就可以形成互相穿插的網(wǎng)絡(luò)。

我們先對(duì)黑線操作,使用的是point wrangle節(jié)點(diǎn)。對(duì)于每個(gè)點(diǎn),先獲取與其相連的鄰點(diǎn)。使用的是neighbours函數(shù)寫(xiě)法為:

int npts[ ] = neighbours(0, @ptnum);

該函數(shù)返回的是一個(gè)數(shù)組,數(shù)組內(nèi)是相鄰點(diǎn)的編號(hào)。如果不用變量表示,改為定義屬性(i[ ]@npts)的話,可在Geometry Spreadsheet窗口中查看每個(gè)點(diǎn)對(duì)應(yīng)的鄰點(diǎn)編號(hào)數(shù)組。

由于每個(gè)點(diǎn)的鄰點(diǎn)數(shù)目不一樣,所以對(duì)應(yīng)的數(shù)組長(zhǎng)度各不相同。對(duì)于x號(hào)點(diǎn),計(jì)算其和每個(gè)鄰點(diǎn)之間的中點(diǎn)時(shí),可以用for循環(huán)語(yǔ)句,循環(huán)次數(shù)就是其鄰點(diǎn)數(shù)組的長(zhǎng)度,可用函數(shù)len(npts)表示。所以循環(huán)條件可寫(xiě)為:

for(int i = 0; i < len(npts); i++)

第一個(gè)點(diǎn)編號(hào)是自身,即@ptnum;第二個(gè)點(diǎn)編號(hào)是npts[i],用point函數(shù)分別獲取其坐標(biāo)值為:

vector pos0 = point(0, "P", @ptnum);

vector pos1 =?point(0,?"P", npts[i]);

計(jì)算出中點(diǎn)坐標(biāo)后,addpoint函數(shù)添加中點(diǎn)如下——

接下來(lái)讓中點(diǎn)沿法線方向移動(dòng)。原模型是沒(méi)有中點(diǎn)的,可以用兩個(gè)點(diǎn)的法線平均一下。并且定義一個(gè)可調(diào)變量“height”,用來(lái)控制偏移的高度。中點(diǎn)的坐標(biāo)為:

vector pos = (pos0 + pos1) * 0.5 + n * offset;

這里有個(gè)問(wèn)題要注意,現(xiàn)在每個(gè)點(diǎn)都會(huì)和相鄰的點(diǎn)計(jì)算中點(diǎn),相當(dāng)于每條邊中點(diǎn)都重復(fù)計(jì)算了兩次。為了避免這個(gè)問(wèn)題,我們只在鄰點(diǎn)編號(hào)大于自身編號(hào)時(shí)才計(jì)算中點(diǎn)。也就是加上判斷條件:

if(npts[i] > @ptnum){? }

使用addprim函數(shù)畫(huà)線,這里可直接用三個(gè)點(diǎn)的編號(hào):

addprim(0, "polyline", @ptnum, midpt, npts[i]);?

然后添加delete節(jié)點(diǎn),刪除原來(lái)的primitive組(triangle),僅保留新創(chuàng)建的線。

另外一個(gè)polygon mesh也是同樣的處理——

現(xiàn)在有兩個(gè)問(wèn)題要解決:

(1)兩個(gè)mesh網(wǎng)絡(luò)中,中點(diǎn)偏移的方向應(yīng)該相反;

(2)同一個(gè)mesh網(wǎng)絡(luò)中,應(yīng)該有些中點(diǎn)朝法線正向偏移,有些中點(diǎn)朝法線反向偏移。如果所有中點(diǎn)都沿法線正向偏移,最后得到的兩個(gè)網(wǎng)絡(luò)也不是互相穿插的。

我們先解決第二個(gè)問(wèn)題。

可以設(shè)置一個(gè)比例ratio,每個(gè)中點(diǎn)生成一個(gè)隨機(jī)數(shù),當(dāng)這個(gè)隨機(jī)數(shù)大于ratio時(shí),朝法線正向;否則朝法線反向。VEX代碼如下:

定義默認(rèn)的浮點(diǎn)變量dir = 1.0,當(dāng)隨機(jī)值rd < ratio時(shí),dir = -1.0??梢灾苯佑弥悬c(diǎn)的坐標(biāo)pos作為隨機(jī)函數(shù)rand的種子,得到不同的隨機(jī)值rd。

pos += n * offset * dir;

即可得到不同的偏移方向。ratio值控制正反向的比例,值為0時(shí)全部正向,為1時(shí)全部反向。

再來(lái)看第一個(gè)問(wèn)題,怎樣讓兩個(gè)網(wǎng)絡(luò)對(duì)應(yīng)中點(diǎn)的偏移方向相反呢?

這里我采用的是距離判斷法,從dual模型的構(gòu)造可以看出,兩個(gè)網(wǎng)格每邊的中點(diǎn)互為距離最近的點(diǎn)。用nearpoint函數(shù)可以找到距離polygon網(wǎng)格每個(gè)中點(diǎn)的最近點(diǎn)編號(hào),也就是triangle網(wǎng)格的中點(diǎn)編號(hào)。再獲取其對(duì)應(yīng)的點(diǎn)坐標(biāo),以此為種子生成隨機(jī)值。當(dāng)種子相同時(shí),生成的隨機(jī)數(shù)也是相同的。

單獨(dú)連出一個(gè)point wrangle節(jié)點(diǎn),命名為midpoint,相當(dāng)于第一個(gè)point wrangle節(jié)點(diǎn)的簡(jiǎn)化版。目的只是添加中點(diǎn),不發(fā)生偏移。

然后將該節(jié)點(diǎn)連接到處理第二個(gè)網(wǎng)格模型的point wrangle節(jié)點(diǎn)的第二個(gè)輸入端,如下圖所示——

使用nearpoint函數(shù)獲取最近點(diǎn),寫(xiě)法為:

int nearpt = nearpoint(1, pos);

因?yàn)槭且诘谝粋€(gè)網(wǎng)格模型(添加中點(diǎn)后)的所有點(diǎn)中搜尋,而它又是連在1號(hào)輸入端口的,所以nearpoint函數(shù)的第一數(shù)字寫(xiě)1。最后返回的是點(diǎn)編號(hào)。根據(jù)點(diǎn)編號(hào)獲取其坐標(biāo)值,生成隨機(jī)數(shù)。

之后的步驟如下,分別給兩組網(wǎng)絡(luò)添加不同的顏色,用convert節(jié)點(diǎn)轉(zhuǎn)為NURBS曲線。resample之后添加polywire節(jié)點(diǎn),得到如下所示的互穿網(wǎng)絡(luò)模型。

將初始模型換成bunny,得到結(jié)果如下——

最終可調(diào)節(jié)的參數(shù)有中點(diǎn)偏移的高度Height、正反朝向的比例Ratio和線條的粗細(xì)Radius。

今天就分享這么多,感謝各位的閱讀,下回見(jiàn)~

Houdini學(xué)習(xí)筆記026_互穿插網(wǎng)格(Dual Mesh)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
恭城| 容城县| 兰西县| 崇阳县| 永仁县| 松滋市| 安塞县| 岢岚县| 邳州市| 清水河县| 攀枝花市| 基隆市| 邯郸市| 富裕县| 平乐县| 策勒县| 九龙县| 仪陇县| 松滋市| 岳普湖县| 平昌县| 沐川县| 阳高县| 吴川市| 邻水| 南召县| 革吉县| 枣阳市| 惠东县| 大田县| 嫩江县| 醴陵市| 鄂伦春自治旗| 白河县| 武穴市| 徐汇区| 宜兰县| 广德县| 泽州县| 三门峡市| 综艺|