發表文章

目前顯示的是有「Procedural Generation」標籤的文章

Blender:Geometry Node 應用於營造法式生成大木作構件初探-斗篇

圖片
摘要 本文進一步探索 Blender 客製化 Geometry Node,包含呼叫其他 Geometry Node 的功能,能夠將原本的 Node Graph 轉為單一 Node。 前言 繼上一篇處理完卷殺折線的程序化生成後,原本想要進一步處理栱的部分,不過發現栱與抖有依賴的關係,栱的一部分數據需要來自枓,主要是枓底的尺寸。 製作這些枓的程序化生成模型,首先要看看這些枓有沒有共通點? 枓的規則 枓的構成與尺寸示意 《營造法式》所有枓基本上都可以分成從上到下三個部位耳、平、欹,形狀上可以分為方或圓(現實實例的話則不只)。 基本上變化除了榫卯(包含包耳)以外還有尺寸的差異,而尺寸依然使用材分決定。整體尺寸上各種枓長寬高不同,會以相對比例決定耳、平、欹的尺寸,但在高度上耳、平、欹比例均各為 2:1:2 分配。欹䫜也不同。   枓的參數 從上面大致上整理一下,可以得到幾個可能的參數: 枓的種類:角櫨枓(方圓)、櫨枓(方圓)、散枓、交互枓、齊心枓、平盤枓 幾等材(U) 斗的長寬高:可從枓的種類求得 欹䫜的深度:可從枓的種類求得  包耳與開口的尺寸 :可從枓的種類求得,但開口寬為固定一栔(栱或枋寬) 底部尺寸:可從枓的種類求得  附註 我在翻閱營造法式相關文獻時發現有對包耳功用的討論,有相關文獻指出可能是對斗耳的拉結加固,然而相關論文我目前上無法取得,不過的確是有趣的論點。   轉換成 Geometry Node 枓的模型會以 Geometry Node 來生成,為了介面方便會使用客製化的 Node。 Node 輸入輸出與屬性(Property) 這個 Node 有屬性,主要是因為沒有想要透過輸入的方式修改枓的類別,另外使用屬性儲存類別,可以依照條件顯示輸入輸出的 Port 和屬性,在此會來開關顯示選項。 輸入: Unit(cm)          : Float (單位公分) Quality Level     : UInt Has Joinery       : Boolean (不勾選則不開榫) 輸出: 枓     ...

Blender:Geometry Node 應用於營造法式生成大木作構件初探-卷殺折線標準化篇

圖片
摘要 本文探索了透過修改 Blender 原始碼來實作客製化的 Geometry Node。 前言 上一篇文提到計算卷殺的折線非常麻煩,需要計算各個等分點並計算交點。不過其實《營造法式》中提到的卷殺的折線其實十分固定,不同部位的折線只要等分的數字相同,皆可以被視作同樣的折線經過線性變換,也就是說我們只要計算一個折線後透過仿射變換就能套用到其他構件上的不同位置上,只要等分數相等。 另外我們也可以透過調整等分數來調整折線的柔化程度,例如實例中有些栱頭卷殺的等分點就不是 4 * 4,可能是 3 * 3,藉由簡單的線性變換也能控制卷殺曲線的長寬。 那麼不同等分的折線有沒有辦法找出各點的座標的公式呢?我發現其實可以。以下就用長寬相等的矩形,以二等分和三等分的卷殺為例。 二與三等分的卷殺推導公式  簡單繪製兩等分與三等分的卷殺如下圖: 若以 Start 為原點,矩形為 1 * 1 的正方形,Start 和 End 在圖中只有繪製在三等分的圖上,實際上二等分亦同樣位置。 Start 和 End 的點座標為: Start(0, 0) End  (1, 1) 二等分的 D1 點座標為: D1(1/3, 2/3) 三等分的 T1、T2 點座標為: T1(1/6, 3/6) T2(3/6, 5/6) 此時還未看見規律,但是依照順序從 Start 到 End 逐一計算座標差值即可以發現規律: 二等分的座標差值: D1-Start(1/3, 2/3) End-D1  (2/3, 1/3) 三等分的座標差值: T1-Start(1/6, 3/6) T2-T1   (2/6, 2/6) End-T2  (3/6, 1/6) 從此可以發現各個點的座標會是等差級數。當有 N 等分,分母就是前 N 個自然數的和,而各個點由 Start 開始到 End 的 Index K 為 [0, N],共 N + 1 個點。 X 的分子便是前 K 個自然數的和,而 Y 的分子為反向,為由 N 開始 K 個的遞減自然數和,而這樣才能使得最後一個點座標為 (1, 1)。 折線點公式 N為自然數時,對於 N 等分的卷殺其產生的折線上, Index K 由 0 開始時,其第 K 點 P K 座標為: P K (S K /S N , T N /S N ) S K =...

Blender:Geometry Node 應用於營造法式生成大木作構件初探-梭柱篇

圖片
摘要 本文初步探索了透過使用 Blender 內建 Geometry Node 來程序化生成建築構件。 前言 最近正在學習 Blender 的 Geometry Node,使用程序化生成模型非常的吸引我,看了一些教學後在想時不是要做些什麼當作練習。第一個想到的其實是應用在建築構件的生成。 營造法式的大木作構件感覺就是一個很好的題材,因為大木作構建本身在營造法式中已經很詳細載明了做法。所以很適合做成程序化生成模型,此外我想到另一個優點是可以快速透過調整參數控制品質,例如曲線的段數和榫卯可以透過參數調整,便於處理 LOD 或是不同使用情境。 這次初探會針對梭柱嘗試製作程序化生成模型,首先我們要了解營造法式中針對梭柱的規則,再來藉由這些規格轉化成程程序化生成模型的邏輯。  該專案也有上傳至 Github 術語簡單介紹 因為再來會很常使用到中國傳統建築的一些術語,所以先在此簡單解釋: 卷殺:是指對構件砍削出折線或曲線的行為,藉以柔化外觀 材分 :宋代《營造法式》中使用的這個建築尺度單位,主要用來控制建築構件尺寸的模數。1 材可細分為 15 分,但是這個一材的大小隨著等級可大可小。另外還有栔,為 10 分。 梭柱的規格 梭柱的規定在 《營造法式》第五卷·大木作制度二 有敘述,這邊只擷取與梭柱相關,亦不擷取與升起側腳相關的部分。 凡用柱之製,若殿閣即徑兩材兩栔至三材,若廳堂柱即徑兩材一栔,餘屋即徑一材一栔至兩材。若廳堂等屋內柱,皆隨舉勢定其短長,以下檐柱為則。(若副階廊舍,下檐柱雖長,不越間之廣。 …… 凡殺梭柱之法,隨柱之長,分為三分。上一分又分為三分,如栱卷殺,漸收至上,徑比櫨枓底四周各出四分;又量柱頭四分,緊殺如覆盆樣,令柱頭與櫨枓底相副。其柱身下一分殺令徑圍與中一分同。 …… 從以上敘述可以知道柱子有三個主要的參數,直徑與高(長)、材分等級來決定一分(U)的大小,然而高卻沒有非常詳細的規定,此處以實例常見的直徑(D)與高度(H)比為 1:9 假定。 H = 9 * D D = 42 ~ 45 * U 有關卷殺,柱身上方寫的非常清楚,柱身下方卻不是很明瞭,我們此處假設只有上方有卷殺,也就是如上敘述的柱身上方 1/3 的部分進行卷殺。 另外一個問題來了「徑比櫨枓底四周...