在 Houdini 避免使用 Copy Stamp

今年大部分閒餘時間都在學網頁前後端,本想說因此會疏忽了特效這塊,但卻在做案子時發現,整體流程規劃清晰了不少,遇到修改也因為架購完整而不讓人煩躁。

這樣的情況有文章說到,有興趣的人可以看看這篇

回歸正題,在 Houdini 有 foreach block 之後大大加強了控制流程的方便性,其實就取代了 copy stamp 大部分的功能,foreach block 有很多優於 copy stamp 的地方,在大部分的情況應先考慮使用。

兩者最大的差別莫過於效能的部分,下面來建立一個簡單的實例。

範例

在球上 scatter 出100000個點,並要讓他們去隨機 instance 圖左三種物件。
隨機的屬性簡單設在 attribute wrangle 中:

i@type = (int)rint(rand(i@ptnum) * 2);

接下來就是 copy stampforeach 針對這個架構去 instance 的方法。

copy stamp

這是典型的 stamp 設置,在 copy stamp 節點上開啟 Stamp Inputs,加入方才新增的 type 屬性。
然後在 switch 上加上:

stamp('../copy1', 'type', 0)

來切換不同模型的替代。

foreach

這是我現在常用的方法,foreachPiece Attribute 填上 type,迭代三個不同的 type 數值 0~2
switch 的部分則是用:

point('../foreach_begin1/', 0, 'type', 0)

去取得 type 的資訊,這是比較偷懶的方法,比較正確的方式是生成 metadata 節點來取得資訊。
最後用 copy to points 來複製。

比較與結論

可以看到兩者運算時間的差別。
主要在於 foreach 的方式只需要輪替三次去計算,而不是每顆都要去尋找stamp資訊。
現在還是比較單純的結構,在複雜的情況更顯得兩者之間效能的差距。

除了效能之外,整體的可維護性也是後者較為方便。

stamp有太多需要去照顧的欄位散落在各處,尤其 copy stamp 節點本身下面的 VariableValue 的欄位千萬別去碰,務必在 template points 階段就把數值先設定好。
如果是跟位移旋轉有關的更應該直接設在相關屬性上,詳見這篇

下一篇會再針對 foreach 做延伸的範例。