今回は Voronoi 分割を使用して、上の画像のような穴だらけの花瓶をモデリングしてみます。難易度は高くはないですが、データ構造の理解などが必要です。データ構造があまり理解できていない方は、そちらを理解してからチャレンジするとより理解できるかと思います。
Voronoi 分割の説明は割愛しておりますが、ぜひ調べてみてください。
また、こちらのチュートリアルは動画化しておりますので、動画の方がよい方は以下のリンクからどうぞ!
概要
- ベースとなる花瓶のサーフェイスをモデル化
- モデル化したサーフェイスを Voronoi 分割
- Voronoi 分割をオフセット
- Voronoi 分割のサーフェイス化
- Voronoi 分割に厚みを持たせる
ざっくりとした流れになります。それでは順を追って説明していきます。
ベースとなる花瓶のサーフェイスをモデル化
- 最初に Rhinoceros で ZY 平面に花瓶の断面線(Profile Curve)を Curve コマンドで書きます
- Line コマンドで、回転軸(Axis)をモデル化します。こちらの回転軸を使って Grasshopper で花瓶のサーフェイスを作成していきます。
- Rhinoceros での準備は完了です。
- 「Curve コンポーネント」に花瓶の断面線・回転軸をそれぞれ Set します。
- 「Revolution コンポーネント」断面を回転させていきます。入力端子 P(Profile Curve)に花瓶の断面線、入力端子 A(Axsis)に回転軸を入力します。入力端子 D(Domain)には回転角の Domain を入力しますが、デフォルトで(0~2 π)が入力されているので、ここでは特に変更しません。
- 上画像のようにベースとなる花瓶のサーフェイスが作成されました。
モデル化したサーフェイスを Voronoi 分割
- 先ほど作成したベースとなる花瓶のサーフェイス上に、「Populate Geometory コンポーネント」を使用して、サーフェイスの表面上に指定した数の Point を発生させます。入力端子 G に Base となるサーフェイスを入力端子 N には NumberSlider を用いて数値を入力します。今回は 100 を入力し 100Point 発生させています。
- 「Bounding Box コンポーネント」を使用し、Base となるサーフェイスが収まる直方体を生成します。入力端子 C にベースとなるサーフェイスを入力します。
- 「Voronoi3D コンポーネント」を使用し、「Bounding Box」コンポーネントで作成した直方体を「Populate Geometory」で作成した点群を指定し分割していきます。入力端子 P には「Populate Geometory」で作成した点を、入力端子 B には「Bounding Box コンポーネント」の出力端子 B を入力します。
- 「Brep | Brep コンポーネント」を使用し、ベースとなるサーフェイスと Voronoi 分割した Brep との交線を求めます。入力端子 A に「Revolution コンポーネント」の出力端子、入力端子 B に「Voronoi3D コンポーネント」の出力端子 C をつなぎます。
- 「Discontinuity コンポーネント」を使用し、「Brep | Brep コンポーネント」で求めた交線の頂点を求めます
- 「Brep | Brep コンポーネント」と「Discontinuity コンポーネント」以外を PreviewOff し、上画像のようになっていれば OK です。
Voronoi 分割をオフセット
- 「Discontinuity コンポーネント」で求めた頂点を「Polyline コンポーネント」ポリライン化します。入力端子 V に「Discontinuity コンポーネント」の出力端子 P を入力し、入力端子 C は右クリックでメニューを開き Invert することで、常に Polyline が ClosedCurve になるように設定します。
- 「Polyline コンポーネント」の出力結果を「Panel コンポーネント」で確認すると Invalid Curve が生成されている場合があります。(断面線の形状によるのでない場合もあります。)InvalidCurve があると後々エラーを吐きだしてしまうので、「CleanTree コンポーネント」で削除しておきます。入力端子 E を Invert して True にします。入力端子 X はデフォルトで True かと思います、こちらが True だと Invalid な値を削除してくれます。削除後、空のブランチが残るので、入力端子 E を True にすることで空のブランチを削除してくれます。
- 「Fillet コンポーネント」を使用し Polyline の頂点を Fillet します。入力端子 C には先ほど作成した CleanTree コンポーネントの出力結果を、R には Fillet の半径を入力します。(今回は 50mm で設定しました。)
- 「PolygonCenter コンポーネント」を使用し「Polyline コンポーネント」で作成した多角形の中心点を求めます。入力端子 P に CleanTree コンポーネントの出力端子をつなぎます。
- 「PolygonCenter コンポーネント」でもとめた Center ポイントを中心にして、それぞれの多角形を「Scale コンポーネント」で縮小します。入力端子 G に「Fillet コンポーネント」の出力端子 C を、入力端子 C に「PolygonCenter コンポーネント」の出力端子 Cv をつなぎます。入力端子 F には縮小倍率を入力します(今回は 0.9)。
- 「Fillet コンポーネント」と「Scale コンポーネント」以外を PreviewOff にして上画像のようになっていれば OK です
Voronoi 分割のサーフェイス化
- 「Loft コンポーネント」の入力端子 C に「Fillet コンポーネント」の出力端子 C と「Scale コンポーネント」の出力端子 G を接続し、曲線の間にサーフェイスを張ります。
Voronoi 分割に厚みを持たせる
- 最後に Loft したサーフェイスを「Extrude コンポーネント」を使用し押し出すことで厚みを持たせていきます。「Loft コンポーネント」の出力端子 L を「Extrude コンポーネント」の入力端子 B に接続します。
- 次にサーフェイスを押し出す方向「Extrude コンポーネント」の入力端子 D に接続するベクトルを設定していきます。今回は Voronoi 分割した各多角形の中心点が、最初に Rhinoceros でモデル化した回転軸の中心点から離れていく方向に厚みを持たせていきたいと思います。
- 「CurveMiddle コンポーネント」を使用し回転軸の中心点を取得します。
- 「Vector2Pt コンポーネント」を使用しそれぞれの多角形の中心点と回転軸の中心点をつなぐベクトルを作成します。「Vector2Pt コンポーネント」の入力端子 A に「PolygonCenter コンポーネント」で求めた各多角形の中心点(出力端子 Cv)をつなぎ、入力端子 B には「CurveMiddle コンポーネント」の出力端子 M をつなぎます。
- 「Amplitude コンポーネント」でそれぞれのベクトル長さにを再設定します。「Amplitude コンポーネント」の出力端子を「Extrude コンポーネント」の入力端子 D に接続します。
- 最後に「Custum Preview コンポーネント」と「Colour Swatch コンポーネント」を使って好きな色に設定しましょう。
- 「Colour Swatch コンポーネント」以外を PreviewOff にして上画像のようになっていれば OK です。
完成
以上になります。水の入らない花瓶完成です。ちょっとコードをいじって、Voronoi 分割の範囲を上半分のみに変えることで、ちゃんと水の入る花瓶にもできるかと思います。余裕がる方はやってみてください。テキストベースできたのでわかりにくい箇所もあったかもしれません。ぜひチャレンジしてみてください。