今回は上画像の様なランダムな六角形の穴が開いたドームを作成していこうと思います。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 コンポーネント」でデータの中身を確認しながら進めていくとより理解が深まるかと思います!
【参考文献】