今回は上画像の様なランダムな六角形の穴が開いたドームを作成していこうと思います。1つ1つ順を追って実装していけば問題なく実装できるかと思いますが、データ構造の理解が必要です。難易度は初級よりの中級レベル程度となっております。動画化もしておりますので、こちらもぜひ参考にしてください。
目次
概要

上画像がプログラムの全体像となっております。大まかな流れは以下の様になっております。
- 球の作成
- カッターの作成
- ベースサーフェイスを作成
- ベースサーフェイスを六角形で分割
- 六角形をランダムなサイズに縮小
- サーフェイスを押し出し
- 六角形をランダムに選択
- ランダムに選択した六角形の基準平面取得
- 六角形内部のプレート作成
- プレートにランダムに色を割り当てる
球の作成

- 「Sphereコンポーネント」で原点(0,0,0)を中心とした、半径40mの球を作成します。
- 「Moveコンポーネント」でZ方向に34m移動させます。
カッターの作成

- 「Circleコンポ―ネント」を使用し、原点(0,0,0)を中心とした半径20mの円を作成します。
- 「Divide Curveコンポーネント」で円を4分割します。
- 「Circleコンポーネント」で分割点を中心とした、半径8mの円を作成します。
- 「Region Differenceコンポーネント」を使用し、カッターのベースとなるラインを取得します。
- 「Extrudeコンポーネント」を使用し、取得したラインをZ方向に8m程度押し出します。
ベースサーフェイスを作成

- 「Brep | Brepコンポーネント」を使用し、球とカッターの交線を取得します。
- 「Surface splitコンポーネント」を使用し、取得した交線で球を2分割します。
- 「List Itemコンポーネント」で2分割したサーフェイスから、ベースとなるサーフェイスの方を取り出します。
ベースサーフェイスを六角形で分割

- 「Meshコンポーネント」を使用し、取得したベースサーフェイスをメッシュ化します
- 「TriRemeshコンポーネント」を使用し、六角形に分割します。(※Rhino7以前のバージョンの方はもしかしたらこちらのコンポーネントがないかもしれません。)
- 「Face Boundariesコンポーネント」を使用し、分割した六角形のエッジを取得しておきます。
六角形をランダムなサイズに縮小

- 「Scaleコンポーネント」を使用し、取得した六角形のエッジを縮小していきます。入力端子Gに取得したエッジを接続します。
- 各六角形の縮小する際の基準平面を取得していきます。「Bounding Boxコンポーネント」を使用し、各六角形を囲う直方体を作成します。
- 「Volumeコンポーネント」で作成した直方体の中心点を取得します。
- 「Plane Normalコンポーネント」で取得した中心点を原点、Z方向を全体座標系のZ方向と一致させた平面を取得します。
- 「Scaleコンポーネント」の入力端子Cに「Plane Normalコンポーネント」で取得した平面を接続します。
- 「Randomコンポーネント」を使用し、縮小倍率のランダムなリストを作成していきます。
- 「Construct Domainコンポーネント」を使用し、縮小倍率のドメインを作成します。今回は0.5倍~0.9倍の間でランダムなリストを作成します。「Randomコンポーネント」の入力端子Rni接続します。
- 「List Lengthコンポーネント」を「Face Boundariesコンポーネント」の出力端子に接続し、六角形の個数を取得し「Randomコンポーネント」の入力端子Nに接続します。
- 「Scaleコンポーネント」の入力端子Fに「Randomコンポーネント」で作成した倍率のリストを入力します。
- 「Scaleコンポーネント」の出力端子を「Flatten」しておきます。
サーフェイスを押し出し

- 「Ruled Surfaceコンポーネント」を使用し、縮小前の六角形と縮小後の六角形の間にサーフェイスを張ります。
- 「Extrudeコンポーネント」を使用し、Z方向に押し出します。今回は100mm押し出しました。
六角形をランダムに選択

- 縮小した六角形をランダムに選択します。「Randomコンポーネント」を用意します。
- 「List Lengthコンポーネント」で縮小した六角形の個数を取得します。
- 「Construct Domainコンポーネント」で「0~六角形の個数」までのドメインを作成し、「Randomコンポーネント」の入力端子Rに接続します。
- 「Divisionコンポーネント」で六角形の個数の半分の数字を取得し「Randomコンポーネント」の入力端子Nに接続します。
- 「Integerコンポーネント」で「Randomコンポーネント」の出力値を整数化します。
- 「Sort Listコンポーネント」でリストを昇順に並べ替えます。
- 「Delete Consecutiveコンポーネント」でリストのダブりを消去します。
- 「List Itemコンポーネント」を使用し、入力端子Lに「Scaleコンポーネント」の出職端子から得られる縮小された六角形のリストを、入力端子iにランダムに作成されたインデックス番号のリストを入力します。
ランダムに選択した六角形の基準平面取得

- 「Bounding Boxコンポーネント」を使用し、ランダムに取得した六角形を囲う直方体を作成します。
- 「Volumeコンポーネント」を使用し、作成した直方体の中心点を取得します。
- 「Plane Normalコンポーネント」を使用し、直方体の中心点を原点、Z方向を全体座標系のZ方向と一致させた平面を取得します。
六角形内部のプレート作成

- 「Project Alongコンポーネント」を使用し内部のプレートの基準となるサーフェイスを作成します。入力端子Gにランダムに取得した六角形を接続します。
- 「Project Alongコンポーネント」の入力端子Pに先ほど作成した各六角形の基準平面を接続します。六角形を平面に投影しました。
- 「Boundary Surfacesコンポーネント」を使用し、投影した六角形にサーフェイスを張っていきます。
- 「Extrudeコンポーネント」を使用し、Z方向に押し出します。今回は20mm押し出しております。
プレートにランダムに色を割り当てる

- 作成したプレートに色をランダムに割り当てていきます。「Colour Swatchコンポーネント」を5つ用意し好きな色に設定します。
- 「Mergeコンポーネント」で用意した5つの色をマージしてリスト化します。
- 「List Lengthコンポーネント」を「Mergeコンポーネント」に接続し、リストが含む値の個数を取得します。
- 「Subtractionコンポーネント」を使用し、「List Lengthコンポーネント」で取得した数から1を引きます。
- 「Randomコンポーネント」を用意します。入力端子Rに「Subtractionコンポーネント」の出力値を接続することで、0~色リストの数から1を引いた値までのドメインを接続します。
- 「List Itemコンポーネント」を「Extrudeコンポーネント」に接続し、プレートの数量を取得します。「Randomコンポーネント」の入力端子Nに接続します。
- 「Integerコンポーネント」で「Randomコンポーネント」の出力値を整数化します。
- 「List Itemコンポーネント」を用意し、入力端子Lに「Mergeコンポーネント」から得られる色リストを、入力端子iに「Integerコンポーネント」の出力端子から得られるランダムに生成したインデックス番号を接続します。これで5色をプレートの枚数分ランダムに並べ替えた色リストが作成されました。
- 「Custom Previewコンポーネント」を用意し入力端子Gに「Extrudeコンポーネント」の出力端子から得られるプレートを接続し、入力端子Mに「List Itemコンポーネント」から得られるランダムな色リストを接続します。プレートにランダムに色を割り当てることができました。
- 序盤に作成したドーム全体を押し出したものにも色を付けて完成です。


以上になります!「Panelコンポーネント」でデータの中身を確認しながら進めていくとより理解が深まるかと思います!
【参考文献】
- AppliCraft : https://www.applicraft.com/