Grasshopper做「垂直的潮汐」
27 人贊了文章
近日有網友詢問這種表皮的做法:
The Vertical Tides, China by Atelier Alter - 谷德設計網 - gooood看到它的瞬間,我就覺得它使用了函數干擾和距離干擾
但是事實證明我還是圖樣
剛開始,我的思路是這樣的:
1.拾取一個曲面
2.等分曲面獲得點,打亂各個路徑里數據的編號,使用內插點曲線連接,最後得到隨機生成的曲線
3.重新等分曲面獲得點,根據 點到最近曲線的距離 干擾 點沿著曲面法線方向移動的距離
4.使用內插點曲線連接路徑內的各點,並和移動之前的線放樣,擠出成面。
依照這個思路,我很快地做了出來,結果如下:
刨去數值的影響,這個電池並沒有實現我們想要的效果,觀察可以發現以下幾個問題:
1.用來干擾的曲線並沒有像波紋一樣上下隨機移動
2.在曲線的內插點處,表皮有特別大的高度
3.距離曲線內插點最近的曲面等分點處,表皮的轉角是圓滑而不是銳利的。
由此我們可以做出以下改動:
1.調整生成隨機曲線的數據結構
2.控制曲線的數量和曲面橫向等分點的數量不一致
3.使用多段圓弧組成的線替代一整條內插點曲線
所以這並不是一個簡單的曲線干擾,而是循環連接相鄰點形成圓弧的表皮!
以下是正確方法:
1.生成隨機彎曲的 在曲面上的內插點曲線(左下角)
divide surface等分曲面 得到曲面上的點,flip matrix翻轉矩陣 讓每一列的點在一個枝幹里。通過搭配 以等差數列作為種子的jitter打亂各枝幹里點的順序,再用surface closest point求出曲面上的投影點,最後通過curve on surface連接成曲面上的曲線。
2.求交點並排序(左上角)
我們的預想是:求出每一條隨機曲線和每一條豎向等分線的交點,讓每一列的交點在一個枝幹里,並且按照從下到上的順序排好。這樣就能用list item快速的遍歷所有的相鄰點。
curve|curve是求兩曲線交點的 關鍵運算器,A,B兩條曲線會一一對應求交點。要達到求出所有交點的目標,除了cross reference進行交叉運算外,還能使用多個數據和樹形數據運算來完成。碰巧我們需要每列交點在一個枝幹上,調整數據結構使得每條豎向等分線都在不同路徑里並且所有曲線在一個路徑里即可。
進行完上述步驟後,我們發現每個交點都在不同路徑里。這是因為兩條曲線可能有不止一個交點(本例中沒有),為了對不同線的交點們進行區分,這個電池自動的graft了一次。進行simplify簡化數據結構後,使用trim tree修剪掉最上一層就能完成預想。
接下來要排序。因為隨機曲線在不同豎向等分線處會有不同的上下位置關係,所以這些交點並不是按照高度排序好的。使用deconstruct point和sort list 提取點的z軸坐標並按照從小到大的順序排序點即可。
3.連接圓弧(右下角)
在本例中,三點確定一個圓弧是最快的方式。通過list item搭配series和graft可以方便地遍歷所有相鄰點。除了每一列中相鄰的交點作為起點和終點外,我們還需要再畫一個點。顯然這個點應該和另外兩點構成一個垂直於曲面的平面,所以我取這兩點的中點,沿著曲面法線方向移動一下就得到了第三個點。其中,移動的距離由另兩點的距離確定,remap number重映射數字 能輕鬆做到這一點。
簡化路徑後,直接連接arc 3pt。有時報黃是因為重合的點生成的圓弧是無效的(null),這個問題之後會解決。
4.最後處理(右上角)
不難看出,我們多連接了一段圓弧,這是必然的。通過長度篩選並刪去最長的也就是多餘的那一段,組合剩餘的圓弧,投影到曲面上,兩線放樣,再左右擠出。
讀者可能會覺得投影放樣多此一舉。這是因為我有時候不能把一列中的所有圓弧都組合起來,不使用曲線預設方向也不行,實在是沒辦法了,只能出此下策。
文件版本:1.0.0006
請使用gh1.0及更高版本打開
鏈接: https://pan.baidu.com/s/1KosgoAYv4xcXZG8trHjBag
密碼: rapy
推薦閱讀:
TAG:Grasshopper | Rhino | 建築學 |