今回は上画像の様な波打った棚を作成していきたいと思います。非常によく見かける形状なので、いろんな人が色々な方法で実装してるかと思います。この記事では、2 つのプラグインを使用しております。ANEMONE と Pufferfish を使用しております。Pufferfish に関しては Offset Surface コンポーネントを使用しているだけなので Extrude コンポーネントなどで代用できます。ANEMONE は事前に
インストールしておいていただければと思います。※Puffserfish をインストールする方は
お願いします。難易度が若干高いかもしれませんが、データ構造を理解できていれば問題なく実装できるかと思いますので是非挑戦してみてください。また、こちらのチュートリアルは動画化しております。動画の方がよい方は以下のリンクからどうぞ!
概要
上画像がプログラムの全体像となっております。
各ブロックごとに説明していきたいと思います。
基準となる直線の作成と分割
- Line SDL コンポーネントで Z 方向に向かう長さ 2000mm の直線を作成します。
- Divide Curve コンポーネントで作成した直線を分割します。今回は 10 等分しております。
基準線の分割点を複製
- Serise コンポーネントで 300 ピッチで 10 カウントのリストを作成し Unit X コンポーネントで X 方向のベクトルとします。
- Move コンポーネントで先ほど取得した分割点を、作成した X 方向のベクトルで複製します。入力端子 T は Graft します。
Sin 波作成するための角度のリストを作成
- 棚を波打たせるために Sin 波を作成します。Divide Curve コンポーネントの t 値を Remap Nunbers コンポーネントで角度のリストにリマップします。
- Remap Nunbers コンポーネントの Source は Bounds コンポーネントで取得した t 値の最大値から最小値のドメインとし、Target は 360 度の倍数を入力します。今回は 2 波発生させたいので、360 度 ×2 としています。
ループ処理を施し角度のリストをずらす
- ANEMONE を使用し Sin 波に繰り返し処理を施し、波形を少しずつずらしていきたいと思います。Loop Start コンポーネントと Loop End コンポーネントを準備し 2 つを接続します。
- LoopStart コンポーネントの Trigger 端子に Button コンポーネントを接続します。このボタンを押すとループ処理が開始されます。
- LoopStart コンポーネントの入力端子 N にはループの回数を入力します。分割点を X 方向に複製した個数だけループさせたいので、X 方向の複製個数を取得し、ループ処理は0回目から始まるので+1します。
- LoopStart コンポーネントの入力端子 D0 にループさせたいデータを入力します。先ほど RemapNunbers コンポーネントで取得した角度のリストを入力します。
- LoopStart コンポーネントと LoopEnd コンポーネントの間にループする処理を書いていきます。Data コンポーネントで先ほど接続した角度のリストを接続します。
- List Item コンポーネントを2つ用意し、1 番目と 0 番目の差を取得することでリスト同士の差を求めます。
- List Item コンポーネントで-1 番目を取得することでリストの最後の値を取得します。
- Add コンポーネントで取得したリストの最後の値にリスト同士の差を足します。
- Cull Index コンポーネントで角度のリストから 0 番目を消去します。
- Insert Items コンポーネントで 0 番目を消去したリストの最後に先ほどの Add コンポーネントから取得できる値を挿入します。これで角度がずらされました。(0 度、72 度、144 度・・・・720 度)だったのが、(72 度、144 度・・・792 度)といった感じで、ループするたびにずれていきます。
- Insert Items コンポーネントの出力端子を LoopEnd コンポーネントに接続します。
- LoopEnd コンポーネントの上で右クリックを押し、RecordData にチェックを入れます。
角度のリストから Sin 波を生成する
- 先ほどループ処理で作成した角度のリストから Sin 波を生成します。LoopEnd コンポーネントの出力端子のパスが複雑になってしまっているかと思いますので、Unflatten Tree コンポーネントを使用してきれいにしておきます。入力端子 G(Guide)に以前 Move コンポーネントで複製した分割点のリストを入力します。
- Radians コンポーネントで角度のリストを弧度法に変換します。
- Sine コンポーネントで Sin 波を生成します。
- Multiplication コンポーネントで Sin 波に振幅を持たせます。
- Unit Y コンポーネントで Y 方向のベクトル化します。
- Move コンポーネントで複製した分割点のリストを作成した Y 方向のベクトルで移動させます。
- 分かりにくいかもしれませんが、以下の画像の様に分割点が波打ったかと思います。(※緑が元々、赤が移動した点)
波打つ棚の外形線を取得
- Interpolate コンポーネントで波打たせた点を結ぶ曲線を作成します。この曲線が棚の先端になります。
- Flip Matrix コンポーネントでデータ構造を反転させ、Interpolate コンポーネントに接続することで横方向にも結びます。
外形線を投影
- Project コンポーネントで先ほど作成した曲線を(0, 500, 0)を原点とした XZ 平面に投影します。
棚のベースとなるサーフェイスを作成
- 作成した曲線と投影した線との間に Loft コンポーネントでサーフェイスを張ります。出力端子は Flatten しておきます。
サーフェイスに厚みを持たせる
- 先ほど Loft コンポーネントで作成したサーフェイスのリストから 0 番目と-1 番目を消去し棚内部のサーフェイスを取得します。
- Pufferfish の Offset Surface コンポーネントでサーフェースを中心に両サイドに 10mm の厚みを持たせます。(※Puffserfish を使用しなくても Extrude コンポーネントで代用可能ですのでインストールしていない方はそのように実装してみてください。)
最上下面のサーフェイスに厚みを持たせる
- 水平方向のサーフェイスのリストから 0 番目と‐1 番目を取得し最上下面のサーフェイスを取得します。
- Extrude コンポーネントで最上面は+ Z 方向、最下面は-Z 方向に押し出します。押し出し距離は 20mm とします。
両サイド面のサーフェイスに厚みを持たせる
- 垂直方向のサーフェイスのリストから 0 番目と‐1 番目を取得し両サイドのサーフェイスを取得します。
- Extrude コンポーネントでそれぞれ+ X 方向とー X 方向に押し出します。
完成
- Merge コンポーネントで厚みを持たせたサーフェイスをまとめます。
- Custom Preview コンポーネントと Colour Swatch コンポーネントで色付けして完成です。
以上になります。変数を変えていろんな形状を試してみてください。ANEMONE のループ処理のとこなど、より簡単な方法がきっとあると思います。今回私が実装した方法はベストではないはずなので、是非検討してみてください。テキストベースでは分かりにくい箇所が多々あったかと思います。動画化してますので、是非動画の方もご参考ください。