今回はベクトル場を使用して、上画像の様なオブジェクトを生成していこうと思います。ついでに、以下の様なアニメーションも作っていきます。是非参考にしてください。こちらのチュートリアルは動画化しております、動画の方がよい方は以下のリンクからどうぞ!
概要
上画像がプログラムの全体像となっております。各ブロックごとに説明していこうと思います。
六角形グリッド作成
- Hexagonal コンポーネントで六角形グリッドを作成します。今回は六角形の半径を 10mm、X 方向 Y 方向 5×5 で 25 個の六角形を生成しています。
ベクトル場生成
- ベクトル場を作成していきます。List Item コンポーネントで先ほど作成した六角形グリッドの中から1つベクトル場を発生させる点を選びます。今回はインデックス番号が 7 番目の要素の中心から発生させます。
- Point Charge コンポーネントで指定した点に向かって引き寄せる力を発生させます。入力端子 C に-1入力端子 D には 0 を接続します。入力端子 B は今回使用しません
- Spin Force コンポーネントで指定した点を中心に回転する力を生成します。入力端子 S には 1.00、入力端子 R は 6、入力端子 D は 0 を入力します。入力端子 B は今回は使用しません。
- Merge Force コンポーネントで作成したベクトル場を結合します。
ベクトル場によって動かす点を作成
- 最初に作成した六角形グリッドを Move コンポーネントで Z 方向に 100mm 移動します。
- Rotate コンポーネントで移動させた六角形グリッドを回転させます。入力端子 A 上で右クリックを押し Degree に設定し、適当に-42 度でを接続します。
- Rotate する際の回転の中心点を決めていきます。List Item コンポーネントを使用し、入力端子 L を Flatten します。六角形グリッドから適当にインデックス番号 15 番目を指定し、Area コンポーネントで中心点を取得します。XZPlane コンポーネントで取得した点における XZ 平面を作成し Rotate コンポーネントに接続します。
- Populate Geometory コンポーネントで回転させたグリッド上に各六角形状に点を 2 つ発生させます。これらの点をベクトル場で移動させていきます。
点を移動させた際の軌跡を作成
- Field Line コンポーネントに作成したベクトル場を先ほど発生させた点を入力し、点を移動させた際の軌跡を生成します。入力端子 N には Step 数を入力しますが、デフォルトで 1000 が入力されておりそのままで問題ありません。それっぽい曲線が描けました。
軌跡を中心としたサーフェイス作成
- Perp Frames コンポーネントで軌跡上を 10 分割する 11 点を中心とし、軌跡と直行する平面を作成します。
- Circle コンポーネントで作成した点を中心とする円を作成します。
- 入力する半径を工夫します。Range コンポーネントで 0 ~ 1 のドメインを 10 分割するようなリストを作成します。
- Graph Mapper コンポーネントで作成したリストの値を操作します。Graph Type を Parabola とし上に凸の曲線になるようにします。先ほどの 0 ~ 1 を等分割したリストの値を今回は最初が 0 に近い値~中心で 0.47 ぐらい、最後の値を 0 に近い値となるようにしています。
- Multiplication コンポーネントで作成したリストに定数を掛けていきます。今回は 1.0 を掛けているので特にリストの値に変更はありませんが、生成するジオメトリの太さを調整したい場合に値を変更してください。
- Maximum コンポーネントで作成したリストと 0.01 を比較し大きい方を出力します。半径が負の値になると都合悪いのでこのような処理を加えています。
- Circle コンポーネントの半径に接続します。
- Loft コンポーネントで生成した各円の間にサーフェイスを張ります。
サーフェイスをグループ分け
- 今回生成したサーフェイスは 50 サーフェイスとなります。これらのサーフェイスにそれぞれ 3 色の色を割り当てるためにグループ分けしていきます。Jitter コンポーネントに生成したサーフェイスを接続し、入力端子を Flatten しておきます。これでサーフェイスのリストをランダムに並べ替えました。
- Partition List コンポーネントで 3 ブランチに分けていきます。等分割してもいいですが、色ごとに割り当てるサーフェイスの数量を変えたいので、19 要素で区切ります。これで 3 ブランチにそれぞれ値が 19 個, 19 個, 12 個格納されたました。
- Explode Tree コンポーネントで各ブランチを取得します。
- Surface コンポーネントにそれぞれ接続します。
マテリアルの割り当て
- 3 グループに分けたサーフェイスにマテリアルを割り当てていきます。Rhinoceros であらかじめ 3 つのマテリアルを作成しておきます。今回は上画像の赤枠で囲った 3 つのマテリアル(金属:ホワイト、金属:ゴールド、金属:チタン色)を使用します。
- プラグイン Human の Material Table コンポーネントで Rhinoceros で作成したマテリアルを取得します。(※Human は以下からインストールできます。https://www.food4rhino.com/en/app/human )
- List Item コンポーネントで取得したマテリアルから赤枠で囲った 3 つを取得します。
- Custom Preview コンポーネントにそれぞれ接続し、取得した 3 つのマテリアルを割り当てて完成です。
おまけ: アニメーション作成 ①
- 冒頭の GIF のようなアニメーションを作成していきます。Field Line コンポーネントに Number Slider を接続し、NumberSlider のアニメーションを昨日で作成してもいいのですが、今回は Rhinoceros 上でプレビューを見たいので別の方法で作成します。
- Flip Curve コンポーネントで Field Line コンポーネントから取得できる軌跡の始点と終点を逆転させます。
- Evaluate Curve コンポーネントに接続し、入力端子を Reparametraize / Graft します。入力端子 t に 0 ~ 1.0 までの値を入力すれば、軌跡上の始点を 0,終点を 1.0 とした時に該当する位置を取得できます。
おまけ: アニメーション作成 ②
- Evaluate Curve コンポーネントに入力する t の値を工夫します。Data Recorder コンポーネントを用意し、Trigger コンポーネントを接続します。Data Recorder コンポーネントには適当に Panel コンポーネントで 0 を入力しておきます。Trigger コンポーネントは右クリックで Interval を設定します、今回は 10ms としています。
- List Length コンポーネントを Data Recorder コンポーネントに接続します。10ms ごとに 1 ずつ増加する値を取得できます。
- Serise コンポーネントの Count に List Length コンポーネントを接続します。Serise コンポーネントはスタートを 0、Step を 0.01 とします。
- Minimum コンポーネントで Serise コンポーネントから取得できる値と 1.0 を比較し小さい方の値を返すようにします。1.0 以上の値は不要なためです。
- Delete Consecutive コンポーネントで隣り合う値が同じとき値を消去します。これで 1.0 以上の値は 1 つ以上取得されなくなりました。
- Evaluate Curve コンポーネントに接続したら上画像の様なプレビューができます。
おまけ: アニメーション作成 ③
- Evaluate Curve コンポーネントの出力端子に Interpolate コンポーネントを接続すれば、先ほどのアニメーションが曲線化されます。この曲線を Perp Frames コンポーネントに接続します。
- これで Custom Preview コンポーネントを表示して Data Recorder コンポーネントを起動させればプレビュー完成です。ただし、PC によってはかなり動作が重くなりますのでご注意ください。
完成
以上になります。アニメーションに関してはあくまでおまけです。Number Slider コンポーネントの Animate 機能を使用した方がいいかもしれませんが、こんなやり方もあるんだと参考程度にしていただければと思います。