上一篇的截線是針對球型的,那如果是任意模型的截面呢?
或許會直覺想說,創造一個 grid,然後跟模型用 cookie 的方式選擇 crease 模式去取出來,但其實布林的方式限制很多(例如模型要封閉),各種不穩定的因素,而且也比較需要計算效能。
在這邊使用的是以 clip 為主軸的方法,效能快,穩定,而且模型也不需要封閉。
模型準備
使用的範例模型是 houdini 內建的豬頭,並開了幾個洞讓它變成開放式模型好做示範。
流程概要
整個流程如圖:記下開放的 edges,clip 切割,再記一次開放的 edges (並撇除第一次記下的 edges),用 polycut 刪除前者以外的模型,用繼承 clip 屬性的 grid 去清潔模型。
group
首先,先 group 既有的開放邊線,這邊取名作 initial_open_edge。
clip
接著 clip 想取出的截面,任意數值方向無所謂。
邊線群組
這次再 group 一次開放邊線,並撇除前一次的 initial_open_edge,這樣就可以得到 clip 切割出的邊線群組,這邊取作 clip_edge。
非邊線群組
將不是 clip_edge 的邊線另外取一個群組 nonedge。
取出邊線
然後用 polycut 把 nonedge 給去除掉,這樣就可以留下單純的 clip_edge,基本上到這步就結束了。
清除殘餘
不過如果你是對開放式模型作處理,就可能會像上圖紅箭頭處一樣,留下一些殘餘,接下來就要針對殘餘作清除。
另外創一個比模型大的 grid ,並讓它繼承 clip 屬性來實體化切面。
繼承方法很簡單,grid 的 center 對應 clip 的 origin,然後 grid 下面接上一個 transform axis,transform axis 的 direction 跟 translate 分別對應 clip 的 direction 跟 distance。
判斷清除
接著讓每個 point 跟此 grid 的距離作一個判斷閥值,便可以輕鬆清除乾淨。
其實可以把整個節點樹做成一個簡單的 otl ,相信會很常用到。