今回は上画像の様な波打った棚を作成していきたいと思います。非常によく見かける形状なので、いろんな人が色々な方法で実装してるかと思います。この記事では、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のループ処理のとこなど、より簡単な方法がきっとあると思います。今回私が実装した方法はベストではないはずなので、是非検討してみてください。テキストベースでは分かりにくい箇所が多々あったかと思います。動画化してますので、是非動画の方もご参考ください。