今回は日本の伝統的な木工技術、組子「桔梗麻の葉」の紋様を、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 枚目の画像の直線が作成できました。
1- 「Join Curves コンポーネント」を使用し、2 つの「Line コンポーネント」を結合します。出力端子を「Simplify」しておきます。
1- 「Offset Curves コンポーネント」を使用し、「Join Curves コンポーネント」で結合したポリラインを板厚分オフセットします。内部側にオフセットしたいので、「Negative コンポーネント」で負の値にオフセットしていきます。今回は 1mm の板厚を持たせています。
1- 「Offset Curves コンポーネント」の出力端子を「Simplify」しておきます。
1- 「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 コンポーネント」で色付けして完成です。
以上となります。データ構造を理解しながら進めていくにはちょうどいいチュートリアルかなとも思います。
組子の紋様パターンはかなりの数あります。是非いろんな紋様にチャレンジしてみてください。
【参考文献】