今回は上画像の様に、球体が壊れたようなジオメトリを生成していきます。是非ご参考ください。さほど難易度は高くありませんが、途中若干ややこしい部分があります。Panel コンポーネントなどでリストの中身を確認しながら進めてみてください。こちらのチュートリアルは動画化してますので、動画のほうが良い方は以下のリンクからどうぞ。
概要
上画像がプログラムの全体像となっております。各ブロックごとに解説していきます。
基準となる球体生成と Voronoi3D 生成
- Sphere コンポーネントで半径 100 の球体を生成します。
- BoundingBox コンポーネントで球を囲う Box を生成し、Scale コンポーネントで Box を 1.1 倍します。
- Populate 3D コンポーネントで拡大した Box 内にランダムに 400 ポイント生成します。
- 生成したポイントを元に、Voronoi3D コンポーネントで Box を Voronoi 分割します。
円と Voronoi の共通部分を抽出
- 球体と Voronoi3D で生成した Brep を Solid Intersection コンポーネントで共有部分を抽出してもいいのですが、球体と全く交差していない Brep との交差も計算してしまうため、warning が出てしまいます。warning を気にしないならそれでもいいのですが、少し気持ち悪いので、最初に球体と接触していない Voronoi 分割された Brep を間引きます。
- Deconstruct Brep コンポーネントで Voronoi3D で生成された Brep の頂点を取得します。
- Point in Breps コンポーネントで取得した頂点が球体の内部にあるかを検証します。
- Member Index コンポーネントで球体の内部にある点の Index を取得します。
- ListLength コンポーネントをつなぎ、各 Brep の頂点が何点球体の内部にあるかが取得できます。ListLength が 1 以上だったら球体と Brep は接触している、または内部にあると判断します。
- Member Index コンポーネントで List Length が 0 のインデックスを探します。
- Cull Index コンポーネントで Voronoi 3 D コンポーネントから取得できる Brep から球体の外側にあり、かつ接触していない Brep を取り除きます。
- Solid Intersection コンポーネントで間引いた Brep と球体の共通部分を取得します。
分割された Brep の縮小する
- Volume コンポーネントで分割された各 Brep の中心を取得します。
- Distance コンポーネントで取得した中心点と特定の点(上画像では(-100, 0, 100))との距離を取得し、リストを Flatten します。
- RemapNumbers コンポーネントで取得した距離のリストを 0.1 ~ 0.99 までにリマップします。
- GraphMapper コンポーネントでリマップしたリストを指定したグラフを用いて変更していきます。
- Scale コンポーネントで分割された各 Brep を GraphMapper で加工したリストで縮小します。
- 最後に Custom Preview コンポーネントと Colour Swatch コンポーネントで色付けして完成です。
完成
GraphMapper や Remap する際の値を変更して色々なパターンを試してみてください。