今回は日本の伝統的な木工技術、組子「桔梗麻の葉」の紋様を、Grasshopperを使用し作成していこうと思います。組子は釘などを一切使わず鉋・鋸・ノミなどで木材同士を組み合わせ、幾何学的な 紋様 を作り上げていく工法で昔の建具などによく使用されていた技術です。Grasshopperとかなり親和性が高いなと思いトライしてみました。難易度的には、初級よりの中級ぐらいかと思います。データ構造の理解が必要となってますので、コード量は多くないもののデータ構造を理解してからチャレンジしてみてください。また、今回は「Lunch Box」というプラグインを使用しております。事前にこちらからインストールしていただければと思います。
また、こちらのチュートリアルは動画化しておりますので、動画の方がよい方は以下のリンクからご覧いただければと思います。
目次
概要

上画像がコードの全体像となっております。大まかな流れは以下の様になります。
- 四角形作成し正三角形に分割
- 正三角形のエッジを板厚分オフセット
- 正三角形内部の紋様:屈折点を作成
- 正三角形内部の紋様:中点が屈折した三角形のモデル化
- 正三角形内部の紋様:中心の小さな正三角形のモデル化
- ベースとなるサーフェイスを整理
- Z方向に押し出し
といった流れになります。それでは実際に解説していきます。
四角形を作成し正三角形に分割

- 「Rectangleコンポーネント」を使用し四角形を作成します。この四角形を正三角形に分割していくため、高さ:幅の比率を1:√3とします。「Square Rootコンポーネント」を使用して高さの√3倍の値を、「Rectangleコンポーネント」に入力します。
- 「Boundary Surfacesコンポーネント」で作成した四角形にサーフェイスを張っていきます。
- 「Triangle Panels Bコンポーネント」で作成した四角形サーフェイスを三角形に分割していきます。入力端子U・Vには分割したい三角形の個数を入力します。今回は15×15にしてます。(※「Triangle Panels Bコンポーネント」は「Lunch Box」というプラングインをインストールしている必要があります。こちらからインストールできます。)

上画像のようになっていればOKです。
正三角形のエッジを板厚分オフセット

- 「Curveコンポーネント」を接続し、「Triangle Panels Bコンポーネント」から正三角形のポリラインを取り出します。
- 「Offset Curveコンポーネント」を使用して先ほど取得した正三角形のエッジを板厚の半分オフセットします。内部側にオフセットするので「Negativeコンポーネント」を使用してオフセット距離を負の値としてください。今回は1.5mmオフセットし、隣り合う正三角形も同様に1.5mmオフセットするので、板厚は3mmとなります。
- 「Boundary Surfacesコンポーネント」で元の正三角形とオフセットした正三角形の間にサーフェイスを張っていきます。「Curveコンポーネント」と「Offset Curveコンポーネント」のデータ構造を合わせるために、「Curveコンポーネント」は「Simplify」及び「Graft」します。「Offset Curveコンポーネント」のデータは「Simplify」のみしておきます。こうすることで、どちらも1ブランチに値が1つ入っている状態となり、データ構造が一致しているためサーフェイスを張っていくことができます。
- 「Boundary Surfacesコンポーネント」の入力端子Eに「Curveコンポーネント」・「Offset Curveコンポーネント」の出力端子を接続します。

上画像の様になっていればOKです。
正三角形内部の紋様:屈折点を作成


正三角形内部の紋様を作成していきます。最初に上画像1枚目の屈折している位置を取得していきます。
- 「Deconstruct Brepコンポーネント」使用して、「Offset Curvesコンポーネント」で取得したオフセットした正三角形をサーフェイス・エッジ・ポイントに分割していきます。
- 「Deconstruct Brepコンポーネント」の出力端子Eに「Curve Middleコンポーネント」を使用し、正三角形を構成する3本の直線のそれぞれの中心点を取得します。
- 「Moveコンポーネント」を使用して「Curve Middleコンポーネント」で取得した点を正三角形の中心に向かって移動させます。入力端子Gに「Curve Middleコンポーネント」の出力端子を接続します。
- 「Moveコンポーネント」に接続するベクトルを作成します。
- 「Deconstruct Brepコンポーネント」の出力端子Fに「Areaコンポーネント」を使用し、各正三角形の中心点を取得します。
- 「Vector2Ptコンポーネント」を使用し、「Areaコンポーネント」の出力端子Cと「Curve Middleコンポーネント」の出力端子Mを結ぶベクトルを作成します。
- 「Amplitudeコンポーネント」を使用し移動距離を設定します。今回は-1mmとしてます。
- 「Amplitudeコンポーネント」の出力端子を「Moveコンポーネント」の入力端子Tに接続します。
- 「Moveコンポーネント」の出力端子Gを「Simplify」しておきます。

上画像のような点が取得できていればOKです。
正三角形内部の紋様:中点が屈折した三角形のモデル化


上画像1枚目の緑色部分、中点が屈折した三角形をモデル化していきます。
- 「Pointコンポーネント」を「Deconstruct Brepコンポーネント」の出力端子Vに接続し、オフセットした正三角形の頂点を取得し「Simplify」しておきます。この頂点と先ほど取得した屈折点を結んでいきます。


- 上画像1枚目の緑箇所の直線からモデル化します。「Point Listコンポーネント」を2つ用意し、「Moveコンポーネント」の出力端子・「Pointコンポーネント」の出力端子に接続し各点のインデックス番号を可視化します。(※数字のサイズが小さい場合、「Point Listコンポーネント」の入力端子Sに「Number Sliderコンポーネント」で任意の整数をつなげてみてください。)
- 同じインデックス番号同士を結んでいきます。「Lineコンポーネント」を使用し、「Moveコンポーネント」の出力端子と「Pointコンポーネント」の出力端子を接続し直線を作成します。1枚目の画像の直線が作成できました。
- 次に2枚目の画像の直線を作成していくために、「Moveコンポーネント」のリスト内の値を1つずらしていきます。
- 「Shift Listコンポーネント」を使用し入力端子Lに「Moveコンポーネント」の出力端子を接続します。
- 「Shift Listコンポーネント」の入力端子Sの上で右クリックを押し、Set Integerの項目から「-1」を入力します。リスト内のデータをずらしました。
- 「Point Listコンポーネント」を用意し、「Shift Listコンポーネント」の出力端子に接続してみると2枚目の画像の様にインデックス番号がずれたことが確認できるかと思います。
- 「Shift Listコンポーネント」の出力端子を「Simplify」します。
- 「Lineコンポーネント」を使用し、「Shift Listコンポーネント」の出力端子と「Pointコンポーネント」の出力端子を接続し直線を作成します。2枚目の画像の直線が作成できました。
- 「Join Curvesコンポーネント」を使用し、2つの「Lineコンポーネント」を結合します。出力端子を「Simplify」しておきます。
- 「Offset Curvesコンポーネント」を使用し、「Join Curvesコンポーネント」で結合したポリラインを板厚分オフセットします。内部側にオフセットしたいので、「Negativeコンポーネント」で負の値にオフセットしていきます。今回は1mmの板厚を持たせています。
- 「Offset Curvesコンポーネント」の出力端子を「Simplify」しておきます。
- 「Boundary Surfacesコンポーネント」を使用し、「Join Curvesコンポーネント」と「Offset Curvesコンポーネント」で作成したポリラインの間にサーフェイスを張っていきます。

上画像の緑部分の様なサーフェイスが作成されていればOKです。
正三角形内部の紋様:中心の小さな正三角形のモデル化


次に、上画像1枚目の緑色部分の三角形を作成していきます。
- 「Polylineコンポーネント」を使用し、「Moveコンポーネント」で取得した屈折点を直線で結んでいきます。
- 「Polylineコンポーネント」の入力端子Cの上で右クリックを押し「Invert」することで、入力値がTrueになりClosedなポリラインとなります。
- 「Offset Curvesコンポーネント」を使用し、板厚分オフセットしていきます。入力端子Cに「Polylineコンポーネント」の出力端子を接続します。オフセット距離は先ほど使用したものと同じ値を接続してます。
- 「Offset Curvesコンポーネント」の出力端子を「Simplify」します。
- 「Boundary Surfacesコンポーネント」を使用し、「Polylineコンポーネント」と「Offset Curvesコンポーネント」の間にサーフェイスを張っていきます。
- 上画像1枚目の緑部分と同様なサーフェイスが作成されていればOKです。
ベースとなるサーフェイスを整理

組子のベースとなるサーフェイスを一度整理します。
- 「Surfaceコンポーネント」を使用し、序盤に作成した正三角形のサーフェイスを取得してます。
- 正三角形の内部の紋様、中点が屈折した三角形と内部の小さな正三角形が現状重なっているので、中点が屈折した三角形のサーフェイスの重なり部部を消去していきます
- 「Solid Differenceコンポーネント」を使用します。入力端子Aに小さな正三角形のサーフェイス、入力端子Bに中点が屈折した三角形のサーフェイスを接続します。
- 組子のベースとなるサーフェイスが完成です。
Z方向に押し出し

組子のベースとなるサーフェイスをZ方向に押し出します。
- 「Extrudeコンポーネント」を使用し、先ほど整理したベースとなるサーフェイスを接続します。
- 「Unit Zコンポーネント」を使用し、Z方向に押し出していきます。今回の押し出し距離は「20mm」としてます。
- 「Custom Previewコンポーネント」・「Colour Swatchコンポーネント」で色付けして完成です。


以上となります。データ構造を理解しながら進めていくにはちょうどいいチュートリアルかなとも思います。
組子の紋様パターンはかなりの数あります。是非いろんな紋様にチャレンジしてみてください。
【参考文献】
- AppliCraft : https://www.applicraft.com/
- food4Rhino : https://www.food4rhino.com/en/app/lunchbox
- 「伝統建具の種類と制作方法」著:大工道具研究会 出版社:誠文堂新光舎