Houdini學(xué)習(xí)筆記 | Applied Houdini - Rigid II 基礎(chǔ)

第二節(jié)課太長了吓肋,有趣的知識點如下:
1.借助不同的voronoiFracture來創(chuàng)造多個cluster跌榔,通過判斷點和cluster的交集來決定約束异雁,比如:假設(shè)A點在cluster A中,同時又在cluster B中僧须,那么他的約束就會非常強(qiáng)纲刀。如果只是在單一的cluster中則是弱約束;
2.借助metaball force來控制爆破位置担平,同時可以將force轉(zhuǎn)化為point的加速度示绊,a = f/m,當(dāng) (加速度>閾值&&約束==弱) 時暂论,約束斷裂面褐;
3.將第一節(jié)課中的for each loop運用到wedge節(jié)點中,wedge實際是一個可以傳遞參數(shù)給ROP的迭代器取胎,理論上只要需要迭代參數(shù)的都可以展哭;
4.大量使用file cache來緩存piece和sim,以及instance的套用過程中闻蛀,借助primintrinsic的相關(guān)屬性復(fù)原數(shù)據(jù)中的transform匪傍,pivot等關(guān)鍵信息;
5.本節(jié)課教程中使用的絕對路徑觉痛,規(guī)避了一些問題析恢,比如節(jié)點間層級關(guān)系,如果使用相對路徑請一定注意目錄層級秧饮。

Copy and Transform 節(jié)點

H18中的copy and transform是沒有辦法刪除原物體的,可以在copy中輸出組泽篮,并使用blast節(jié)點刪除

其中Pivot 不再支持 $CEX , $CEY, $CEZ 獲取局部變量盗尸,使用結(jié)果如下


語法錯誤,節(jié)點報錯

點擊發(fā)現(xiàn)無法獲取計算結(jié)果


當(dāng)前計算結(jié)果為0

參照https://www.sidefx.com/forum/topic/66402/
原本的copy節(jié)點被更新取代后帽撑,
stamp copy依然可使用上述語言泼各,但是copy and transform 和copy to point 不再支持調(diào)取局部變量,需要通過centroid()語法調(diào)用亏拉,格式如下:

centroid(surface_node, type)

The type should be one of D_X, D_Y, or D_Z 
for the corresponding components of the centroid.

centroid("../sphere1", D_X)
centroid("../sphere1", D_Y)
centroid("../sphere1", D_Z)

結(jié)果如下

重新寫入centroid()表達(dá)式扣蜻,獲得正確計算結(jié)果

注:The centroid is the center of the bounding box of the points, not the average position of the points.
所以此處 centroid("../merge1", D_X), centroid("../merge1/", D_X) 獲得效果相同逆巍,因為完全是依據(jù)bbox來計算中心,而不是其中細(xì)分的幾何體莽使。

再注:如果多次使用帶有copy節(jié)點中的centroid()锐极,復(fù)制節(jié)點時一定注意centroid()的指向問題!

此時打開geometry spread sheet 可以發(fā)現(xiàn)芳肌,由于幾何體之間是簡單的復(fù)制關(guān)系灵再,所以在碎片name命名上存在重復(fù),如果在這個基礎(chǔ)上做約束亿笤,則會出現(xiàn)約束指向不明確的情況翎迁。


有相同名字的碎片有24個,因為copy一共產(chǎn)生了24個

此時可借助@ptnum來重新命名name净薛,可以另外建立變量@name_original保留原名稱作為參考汪榔。


在primitiveWangle中添加VEX更改name變量

接下來進(jìn)入標(biāo)準(zhǔn)的dopnetwork流程

小技巧1:

dopnetwork中只輸出rbd


*rbd指代dop節(jié)點內(nèi)所有的rbd數(shù)據(jù)

小技巧2:

自建變量控制版本
可以在之前用Null建立的控制節(jié)點內(nèi)添加int參數(shù),然后將參數(shù)傳給file cache內(nèi)指定文件夾

在Null內(nèi)加入int參數(shù)調(diào)節(jié)
將參數(shù)傳給路徑肃拜,中鍵點擊Geometry File查看解算路徑

小技巧3:

packededit節(jié)點可以把rbdpackedobject轉(zhuǎn)為點云顯示痴腌,降低顯示壓力


adjacentpieces調(diào)用之前借用@ptnum重新命名的@name

注:這里有個坑一定要清醒!1唷衷掷!

雖然是借助point來建立約束,但最終作用在primitive上柿菩,所以建立約束一定要用primitiveWrangleF菪帷!

primitiveWrangle才是最終約束的指向枢舶!

在接入glue constraint后的constraintNetwork中可以通過線框顯示來檢查約束是否生效


內(nèi)部紅線鏈接不同pieces懦胞,證明約束已經(jīng)建立

在約束建立完成后開始解算,發(fā)現(xiàn)建筑底部因為重力原因出現(xiàn)了破損凉泄,上半部分完好


可以通過將bounce(反作用力)和friction(靜摩擦)降到0來解決躏尉,但是這種方式有些不合理

此時可以通過對接觸地面部分的點進(jìn)行鎖定來模擬地基效果,需要調(diào)用全局變量@active后众。

在point重新命名后胀糜,通過@P.y的高度來決定@active是True 或者False

在參數(shù)界面會自動大寫第一個字母創(chuàng)建label。
注:此處用ch()創(chuàng)建局部變量參數(shù)"foundation_threshold"蒂誉,教程中是創(chuàng)建"height_threshold"教藻,局部變量可以任意命名,自由度真高啊右锨,香括堤!

此時可以借助delete節(jié)點來觀察@active=0所對應(yīng)的的面


由于選擇了@active=0, 觀察地基要選擇delete non-selected

注:一定要注意group選擇的輸入格式,如下幾種格式都是非法的:

i@active = 0
@active = 0
i@active=0

比較好理解,在group里空格就像是分隔符悄窃,所以一個語句不能有任何空格讥电,i作為聲明數(shù)據(jù)類型標(biāo)簽也不應(yīng)該在這里出現(xiàn)。
注:可以在foundation_threshold內(nèi)輸入表達(dá)式 $FF/10來獲得建筑物生長效果轧抗。不能用$F恩敌,因為$F返回整數(shù)值,$FF返回浮點值鸦致。

接下來要再次基礎(chǔ)上增加約束來豐富破碎效果潮剪。

首先借助一個box來觀察voronoi noise的作用效果


其實就是基于voronoiFracture的算法,點的位置P作為運算依據(jù)分唾,將P的信息傳給voronoiNoise抗碰,然后產(chǎn)生三維的隨機(jī)Cd值,即可獲得rgb voronoi色塊

注:promote noise frequency可以高效使用節(jié)點

接下來用這一次的noise和之前通過adjecentpieces產(chǎn)生的約束建立強(qiáng)弱約束關(guān)系绽乔,如果幾何體同時滿足兩個約束則為強(qiáng)約束弧蝇,其他則為弱約束。

這里非常高能U墼摇?戳啤!建議去閱讀VEXD朗凇两芳!

primvertex官方定義

primvertex(geometry, primnum, vertex)

簡單的說就是找到當(dāng)前幾何體的linear vertex
其中g(shù)eometry如果在wrangle之類的節(jié)點內(nèi),可以用相應(yīng)的輸入端來代替0, 1...
primnum即為需要查找vertex的對象幾何體
vertex即為需要返回哪個頂點的屬性去枷,頂點也是從0開始怖辆。

什么是vertex!删顶!

在進(jìn)行下一波之前需要了解vertices和point的區(qū)別竖螃。

Vertices和point在houdini中是不同的概念

舉一個簡單的例子!


一根線有兩個點

vertex是比point更底層的逗余,面向幾何體對象的數(shù)據(jù)特咆。如果一根線不夠我們再加一根三個點的線!

兩根線共有五個點录粱,但是vertex分了兩組

也就是說腻格,vertex是一種類似python的json型的數(shù)據(jù)(可能有點不恰當(dāng))。第一根線也就是幾何體“0”啥繁,里面有0和1兩個vertex荒叶,第二根線幾何體“1”里面有三個vertex。為什么說vertex更底層呢输虱,因為vertex是不能更改的!V住(雖然通過point可以間接改)

此時我們得到的也只是linear vertex宪睹,還要用vertexpoint()把vertex數(shù)據(jù)提取出來愁茁。


vertexpoint官方說明

注:vertexpoint的返回值是ptnum而不是pt的坐標(biāo),所以是整數(shù)型亭病。 =

接下來只要判斷這兩個點是不是在同一個voronoi noise范圍內(nèi)就可以確定約束關(guān)系了鹅很!


point官方說明

point的返回值是帶入的attribute name的值,也就是罪帖,可以通過point來判斷點是否在這個attribute內(nèi)促煮。
那么通過point函數(shù)帶入noise定義的相同屬性,只要兩點返回值相同整袁,就是處在同一屬性下菠齿!
Bingo!!!

讓我們開始吧!
把之前建立約束名稱的attribute wrangle 徹底刪除坐昙!
小技巧:在wrangle輸入VEX绳匀,如果內(nèi)容過多,可以alt+e彈出代碼輸入窗口

int p0 = vertexpoint(0, primvertex(0, @primnum, 0));
int p1 = vertexpoint(0, primvertex(0, @primnum, 1));
//這里先求出兩個點的vertex
int cluster0 = point(0, "cluster", p0);
int cluster1 = point(0, "cluster", p1);
//這里求出p0和p1是否在同一cluster內(nèi)炸客,作為判斷依據(jù)
//一定要注意疾棵,這里的cluster是一維整數(shù),要和之前attri VOP對應(yīng)
if(cluster0 == cluster1){
    s@constraint_name = "Glue_inside";
}
else{
    s@constraint_name = "Glue_outside";
}
f@strength = 1.0;
//這里通過條件建立兩種不同的約束痹仙,但是可以暫時統(tǒng)一約束強(qiáng)度是尔,在DOP內(nèi)用分別定義的Glue conrel來調(diào)節(jié)

MetaBall是一個力場而不是一個幾何體

當(dāng)兩個引力場上的值相同時,會出現(xiàn)相吸的情況开仰。

metaball

添加force節(jié)點調(diào)節(jié)相應(yīng)數(shù)值拟枚,同時考慮到爆破力是瞬時的,所以需要通過添加表達(dá)式的switch來控制爆破抖所,比如$F==3梨州,在第三幀爆破,另一個輸入連接null田轧,注意調(diào)整次序暴匠,符合條件表達(dá)式返回True為1。
POP particle operator傻粘,早期版本中的DOP也是基于基于粒子的演算每窖,由于metaball是基于點陣產(chǎn)生的場,所以同樣可以用于rbdsolver中弦悉。

metaball放置在建筑中

注:popMetaBallForce scale正數(shù)為吸引窒典,負(fù)數(shù)為擴(kuò)散。另稽莉,此處說明也可以看出MetaBall和particle的關(guān)系瀑志。

此時的爆炸還不夠真實,合理的情況下,在爆炸的瞬間在MetaBall范圍內(nèi)的約束應(yīng)該是斷掉的劈猪。

約束并沒有斷昧甘,所以效果比較勉強(qiáng)

分析:約束沒有斷也沒有移位,因為在約束作為獨立的primitive并沒有更新位置战得。
需要在constraintNetwork內(nèi)添加sopSolver輸入充边,因為SOP是針對幾何體的操作,而約束也是以primitive幾何體的形式存在的常侦。

在SOPsolver內(nèi)加入objectivemerge節(jié)點

需要調(diào)用DOP內(nèi)Geometry層級的P

教程中使用了../..rbd:Geometry
注:../..為上一層浇冰,也就是DOP層級。 rbd指向含有rbd關(guān)鍵字的數(shù)據(jù)聋亡。從這里也可以看出肘习,packedObject的特征是所有的幾何體都包含在一個物體之中,因為rbdPackedObject和groundPlane是平級的杀捻。所以這一步實際上是找到了rbd內(nèi)每一個破碎pieces對應(yīng)的點井厌,也可以叫“拆包”。

設(shè)想一下致讥,pieces對應(yīng)的點其實就綁定了約束仅仆,所以可以把剛剛得到的@P反向輸入給約束,從而達(dá)到在爆炸的同時改變約束垢袱。

findattribval官方說明

findattribval 返回的是符合指定幾何體內(nèi)指定類的指定值對應(yīng)的點的序號point number墓拜,并不是一個三維值。
然后通過點的序號來獲取對應(yīng)的@P

int pt = findattribval(1, "point", "name", @name);
@P = point(1, "P", pt);

此時用之前用作爆炸的metaball作為參考请契,通過group來求出需要刪除的約束咳榜,命名為activate。
同時爽锥,考慮到此時輸出的約束為primitive涌韩,需要把此時的group promote.
注:group節(jié)點現(xiàn)在已經(jīng)被改掉了,由于約束其實是primitive層面的氯夷,所以需要通過group promote把 point attribute 提升到 primitive attribute
此時觀察geometry spread sheet臣樱,只需要把原本的group:broken 追加上剛剛的group:active 就可以了!


發(fā)現(xiàn)groupBroken為二值腮考,決定了constraint是有效還是斷裂

此時讓我們在最早的約束基礎(chǔ)上添加groupcopy雇毫,增加activate組屬性,然后通過簡單的VEX將activate組對應(yīng)的primitive轉(zhuǎn)變?yōu)閎roken = 1

在primitiveWrangle中選擇activate組踩蔚,然后輸入

@group_broken=1;

這里為什么用@group_ 可以參考官方鏈接解答
https://www.sidefx.com/forum/topic/71696/
簡單的說棚放,就是為組成員賦值。對應(yīng)到案例中馅闽,就是將約束中與metaball相交的primitive組變?yōu)?broken = 1 飘蚯,強(qiáng)行斷裂馍迄!

最后,由于構(gòu)成約束的sop solver需要逐幀反復(fù)調(diào)用判斷孝冒,需要添加group delete柬姚,刪除activate組。

此時爆破的前幾幀非常擬合metaball的外形庄涡,獲得的模擬還是缺乏真實性,因為pieces的爆破初速度沒有明顯的差別搬设,理論上應(yīng)該是質(zhì)量越大初速度越醒ǖ辍(慣性)。

在popforce中將ignore Mass取消勾選

此時已經(jīng)有了force和mass拿穴,已經(jīng)很容易求出加速度了泣洞,a = F/M,通過加速度值來判定約束斷裂的時機(jī)默色,所以可以在SOP solver中更改原本的斷裂方式球凰。

一個經(jīng)典錯誤!

通過觀察Geometry Spread sheet 發(fā)現(xiàn)這里force一直都是(0, 0, 0)腿宰。


force數(shù)值一直為0呕诉??理論上在第三幀應(yīng)該有數(shù)值

因為我在這里犯了個很經(jīng)典的錯誤吃度,rigidBodySolver 有preSolver 和postSolver甩挫,顧名思義就是主動加入解算和被動獲得解算的方式。教程中并沒有針對性的講這里椿每,如果連接到preSolver伊者,那就意味著提前把數(shù)值鎖定了!
https://www.sidefx.com/forum/topic/73352/?page=1#post-309990

借助length()函數(shù)可以求出矢量force的值间护,注意不要把length()和len()混了亦渗,len()和python里用法相同。

回到SOPsolver內(nèi)汁尺,不再使用metaball創(chuàng)建的field法精。
而是借助objectiveMerge的rbd所對應(yīng)的點的force來計算加速度。

依然是將rbd對應(yīng)的點傳primitive內(nèi)均函,獲得動態(tài)的約束
int pt = findattribval(1, "point", "name", @name);
@P = point(1, "P", pt); 
f@mass = point(1, "mass", pt);
v@force = point(1, "force", pt);

此時已經(jīng)獲得了當(dāng)前rbd對應(yīng)的點的 force 和 mass亿虽,通過attribute promote將這兩個數(shù)值提升到primitive層級。然后就可以加入判斷條件
1:當(dāng)前約束是否達(dá)到加速度閾值苞也?
2:當(dāng)前約束是否在Glue_outside的弱約束內(nèi)?(判斷這個條件必須在primitive層級洛勉,所以這也是需要attribute promote的原因)

另,需要注意當(dāng)前判斷的對象是還沒有斷裂的約束如迟,即!broken

f@accel = length(v@force)/@mass;
if(f@accel > ch("accel_high_thresh")){
    @group_high_activate = 1;
}
else if(f@accel > ch("accel_low_thresh")){
    @group_low_activate = 1;
}

此時獲得了兩個組收毫, high_activate 和low_activate攻走,
然后通過group copy將兩者*activate合并入原constraint relationship。

if(@group_low_activate && s@constraint_name == "Glue_outside"){
    @group_broken = 1;
}

然后通過group delete刪除 activate組此再。
注:SOP solver內(nèi)的constraint relation 是 iterate by frame 逐幀迭代的昔搂,添加
activate 和刪除*activate的存在,是為了清空屬性输拇,不影響下一幀的判斷摘符。

解算后觀察細(xì)節(jié),發(fā)現(xiàn)有幾個碎片初速度極快策吠,通過點選擇觀察屬性逛裤。


再一次使用length()求出當(dāng)前點的速度

在Geometry Spread Sheet中發(fā)現(xiàn)速度已經(jīng)超過40,需要添加limiter來控制碎片初速度猴抹,在popMetaballForcepop后接入popSpeedLimit带族。

另,此時的metaballForce只在第三幀出現(xiàn)了一次蟀给,接下來需要將爆炸豐富就要讓metaball的位置和大小隨機(jī)化蝙砌。
首先借助VDBfromPolygon來將建筑變成實體填充狮含。


VDBfromPolygons中嗤形,選擇fill interior可以將內(nèi)部徹底填充棠枉。

注:此時將獲得的VDB數(shù)據(jù)轉(zhuǎn)化為polygon soup, 可以打開Geometry Spread Sheet來觀察 polygon soup和polygon的區(qū)別漠趁,在primitive層級坑填,polygon soup數(shù)據(jù)量更小你踩。
再注:此時可以通過調(diào)整isovalue值來觀察之前fill interior是否勾選對結(jié)果的影響伍俘。

此時相當(dāng)于獲得了一個“爆炸點源”的數(shù)據(jù)叽掘,然而我們只需要在某個時間的某個位置有一個爆炸源汁政,也就是metaballForce道偷。
可以用scatter將點分布在PolygonSoup內(nèi),當(dāng)然也可以繼續(xù)用isooffset的fog選項將點分散到vollum內(nèi)记劈,
只是如果已經(jīng)有了isovalue來調(diào)節(jié)爆炸點的深度勺鸦,再用isooffset,相當(dāng)于有了兩個參數(shù)來控制目木,反而效率不夠高了(個人觀點)换途。此時需要在scatter的point number上輸入表達(dá)式,考慮到只想要一個爆炸點在建筑物內(nèi)“游走”刽射,可以通過條件語句來控制军拟,因為條件語句的返回值是 0 和 1。

@F%3==0 && $F<20

表達(dá)式內(nèi)竟然也可以用取余符號誓禁!所以需要提取小于20且為3的倍數(shù)的幀懈息。然后通過$F來調(diào)節(jié)seed值來隨機(jī)化生成位置。
考慮到既然是隨機(jī)位置摹恰,應(yīng)該也有隨機(jī)大小產(chǎn)生辫继,在pointWrangle中添加隨機(jī)化的pscale

f@pscale = fit01(rand(@Frame), 0.3, 0.85);

此處因為rand()的返回值在(0,1)之間怒见,剛好可以運用fit01(),
fit01(num, newmin, newmax); 會將(0,1)的返回值重新映射到新定義的閾值區(qū)間。
然后通過copy to point, 將metaballForce和點綁定姑宽,就獲得了隨機(jī)化的metaballForce!

將metaballForce作為popMetaballForce接入

借助File cache來緩存piece

可以用delete來控制選擇遣耍,用之前connectivity創(chuàng)造的屬性@class配合$F來控制序號。
此處有坑:所有以string形式存在的表達(dá)式都要加`` 而不是‘’炮车。
https://www.sidefx.com/forum/topic/73399/

filecache因為是逐幀輸出舵变,也充當(dāng)了迭代器

借助assemble里的nprims()來確定迭代次數(shù),記得-1因為nprims是從1開始的瘦穆,而piece或者class屬性是從0開始

此時可以繼續(xù)拉取controlPanel上的數(shù)值作為存儲路徑參考棋傍,在命名方式上還是調(diào)用原piece的name屬性。
注:在這里其實我的control手誤打成了contrl难审,導(dǎo)致后面很多順手打而不是copy的路徑出現(xiàn)了錯誤,所以在輸入路徑時盡量拉取避免輸入錯誤亿絮,不要因為打字一時爽就...

此時我們已經(jīng)獲得了piece的數(shù)據(jù)告喊,相當(dāng)于減輕了voronoiFracture這部分的計算量,接下來只要把通過sim輸出的particle數(shù)據(jù)套用現(xiàn)有的piece數(shù)據(jù)就好了派昧。

借助File cache來緩存sim

通過提取sim內(nèi)的點數(shù)據(jù)黔姜,然后套用給緩存出來的piece。理論上現(xiàn)在除了點的name* 以及v速度w角速度數(shù)據(jù)蒂萎,其他都可以通過attribute delete刪除秆吵。
接下來通過instance的方式將緩存出來的piece COPY到點上,這里通過instance節(jié)點五慈。instance本質(zhì)上是把object merge和 copy to point結(jié)合到了一起的節(jié)點纳寂。
在此之前,需要通過point wrangle將name和piece綁定泻拦。
這里就要用到之前name_original毙芜。


實際上是為點添加對應(yīng)piece的path數(shù)據(jù)
instance節(jié)點中的描述 attribute為對應(yīng)文件的path

注:Use Object Transform并不是把點的transform信息應(yīng)用到piece上,而是把piece的transform應(yīng)用到點上争拐,所以此時的piece相當(dāng)于只是簡單的copy到了對應(yīng)的點上腋粥,并沒有按照初始化的坐標(biāo)來排列。
初始化位置架曹,time shift指向第一幀隘冲。
然后通過point wrangle將原sim cache中的位置信息寫入instance。


讀取原數(shù)據(jù)中的primintrinsic并更新到instance中

transform的數(shù)據(jù)是matrix3绑雄,相當(dāng)于是存儲點的旋轉(zhuǎn)信息展辞, packed transform是 matrix4。
有了旋轉(zhuǎn)角度绳慎,還需要知道位置和旋轉(zhuǎn)中心纵竖。primintrisic提取并用setprimintrisic來為instance添加信息漠烧。
至此,基本框架已經(jīng)基本達(dá)成了靡砌。

Wedge 迭代輸出利器

此時的sim輸出只有一個版本已脓,通過wedge可以將參數(shù)迭代

channel對應(yīng)control中需要控制的wedge版本

wedge的driver來自sim cache內(nèi)部的ROP,range的最高值設(shè)定為迭代次數(shù)-1通殃。

在sim cache中同樣需要根據(jù)不同的wedge進(jìn)行迭代輸出度液。


添加不同wedge數(shù)值的路徑

此時只是設(shè)定了不同wedge的輸出路徑,接下來需要把wedge的相對參數(shù)復(fù)制到需要調(diào)節(jié)的參數(shù)上画舌,比如constraint 的strength 可以用 pow(10, "wedge相對參數(shù)")堕担,代表每個版本的strength是指數(shù)型增加,或者細(xì)化到 5000 + 1000*"wedge相對參數(shù)"曲聂,這樣一次輸出可以得到多個約束強(qiáng)度的效果霹购。
另一方面,也可以把wedge傳給force生成的位置朋腋,也就是scatter的random seed齐疙,讓每次爆炸點都有不同。

查看wedge結(jié)果

用file merge和transform作為迭代的內(nèi)容旭咽,

此時file merge的地址需要把wedge參數(shù)替換為iteration贞奋。
依然用

detail("../repeat_begin1_metadata1/", "iteration", 0)

注:在目錄中作為字符串出現(xiàn)前后添加``!
transform根據(jù)迭代detail來自定位置就好了穷绵。
根據(jù)wedge結(jié)果選擇理想的參數(shù)轿塔,至此解算告一段落。

接下來要在此基礎(chǔ)上增加piece的豐富程度和細(xì)節(jié)仲墨。

增加更多的piece

在原來的voronoiFracture基礎(chǔ)上增加for each loop

scatter內(nèi)點數(shù)用迭代語句控制隨機(jī)勾缭,然后用fit01()控制range。
switch依然是用

rand(detail("../foreach_begin1_metadata1/", "iteration",0))>0.6

60%的幾率會被打散成更小的碎塊宗收。
注:這里添加了divide節(jié)點漫拭,會強(qiáng)行把多變面變成三角面,避免normal產(chǎn)生問題混稽。

再注:此時因為第二次使用voronoiFracture采驻,默認(rèn)產(chǎn)生的inside和outside組會覆蓋掉之前的組,所以建議添加后綴匈勋,如inside_sub outside_sub礼旅。

增加piece inside的細(xì)節(jié)

基本思路是為inside組增加噪波,但是由于piece棱上的點也算inside組洽洁,所以需要借助iso offset來選擇一定距離的組痘系。


SDF Volume產(chǎn)生距離場

SDF全稱Signed Distance Field,如果物體在SDF Volume內(nèi)部則返回負(fù)數(shù)饿自,反之為正數(shù)汰翠。借助attribute from volume 將距離信息保存在depth參數(shù)下龄坪。

此時只需要鎖定depth在一定范圍內(nèi)的點不產(chǎn)生noise就可以了。


引入depth參數(shù)复唤,并添加fit健田,promote最大值作為外部調(diào)節(jié)參數(shù)

最大值映射到1,1乘以noise還是noise。而數(shù)值越小佛纫,形變越小妓局。這樣做就可以把一定depth距離內(nèi)的點的數(shù)值鎖定不受noise的影響了。

再次借助divide來增加細(xì)分

同時這時候也需要退回到建模初期呈宇,把四條邊選出來好爬,建立group,命名boarder甥啄,方便后面選用存炮,因為噪波是不能出現(xiàn)在boarder上的。

為boarder添加浮點值1蜈漓,然后借助visualizer查看范圍

此時通過調(diào)節(jié)attribute transfer 內(nèi)的distance threshold和blend值僵蛛,達(dá)到漸變目的,也就是從從noise到 boarder的ramp迎变。


復(fù)制一個VOP,用1-boarder的距離作為noise的乘數(shù)

因為boarder初始值為1飘言, complement剛好是 1- arg衣形,剛好作為控制boarder的方法,太妙了姿鸿!

至此谆吴,破碎的細(xì)節(jié)終于制作完成了!
之前的版本可以保留作為instance_lo苛预,輸出作為 instance_hi句狼,


在套用instance之后添加switch節(jié)點,切換高低模

最終輸出前可以再跑一遍sim和instance热某,統(tǒng)一版本號腻菇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市昔馋,隨后出現(xiàn)的幾起案子筹吐,更是在濱河造成了極大的恐慌,老刑警劉巖秘遏,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丘薛,死亡現(xiàn)場離奇詭異,居然都是意外死亡邦危,警方通過查閱死者的電腦和手機(jī)洋侨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門舍扰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人希坚,你說我怎么就攤上這事边苹。” “怎么了吏够?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵勾给,是天一觀的道長。 經(jīng)常有香客問我锅知,道長播急,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任售睹,我火速辦了婚禮桩警,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昌妹。我一直安慰自己捶枢,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布飞崖。 她就那樣靜靜地躺著烂叔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪固歪。 梳的紋絲不亂的頭發(fā)上蒜鸡,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機(jī)與錄音牢裳,去河邊找鬼逢防。 笑死,一個胖子當(dāng)著我的面吹牛蒲讯,可吹牛的內(nèi)容都是我干的忘朝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼判帮,長吁一口氣:“原來是場噩夢啊……” “哼局嘁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晦墙,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤导狡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后偎痛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旱捧,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了枚赡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氓癌。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贫橙,靈堂內(nèi)的尸體忽然破棺而出贪婉,到底是詐尸還是另有隱情,我是刑警寧澤卢肃,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布疲迂,位于F島的核電站,受9級特大地震影響莫湘,放射性物質(zhì)發(fā)生泄漏尤蒿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一幅垮、第九天 我趴在偏房一處隱蔽的房頂上張望腰池。 院中可真熱鬧,春花似錦忙芒、人聲如沸示弓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奏属。三九已至,卻和暖如春潮峦,著一層夾襖步出監(jiān)牢的瞬間拍皮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工跑杭, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咆耿。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓德谅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親萨螺。 傳聞我的和親對象是個殘疾皇子窄做,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355