今回はkangaroo2を使用して、以下のGif画像の様な挙動をするカーテンを作っていこうと思います。kangaroo2の基本的なゴールオブジェクトをいくつか使用しております。是非参考にしてみてください。kangaroo2がインストールされていない方はこちらからインストールできます。こちらのチュートリアルは動画化しております。動画の方がよい方は以下のリンクからどうぞ!

概要

上画像がプログラムの全体像となっております。各ブロックごとに説明していこうと思います。
ベースとなるメッシュを作成

- Arcコンポーネントを使用し、XY平面上に円弧を作成します。円弧といっても、中心角を359度にしているのでほぼ円ですが、カーテンを開け閉めできるようにしたいので、あえてメッシュをセパレートしております。
- 作成した円弧をExtrudeコンポーネントでZ方向に2300mm押し出します。
- Mesh Surfaceコンポーネントで押し出したサーフェイスをメッシュ化します。u方向25要素, v方向50要素の四角形メッシュで分割します。
- Triangulateコンポーネントで四角形メッシュを三角形メッシュにしていきます。
ゴールオブジェクトの設定①(show)

- kangaroo2のゴールオブジェクトを設定していきます。showコンポーネントに先ほど作成した三角形メッシュを接続します。showコンポーネントは演算後の変形を確認したい要素を接続していきます。
ゴールオブジェクトの設定②(Edge Lengths)

- Edge Lengthsコンポーネントを使用し、メッシュエッジをスプリング化していきます。作成した三角形メッシュを接続し、LengthFactorに1.0を、Strengthに10.0を接続します。
ゴールオブジェクトの設定③(Wind)

- Windコンポーネントで風荷重を設定していきます。同様に三角形メッシュを接続します。今回は上から下に向かって風を起こしたいので、UnitZコンポーネントに負の値を接続します。大きな力である必要はないので、-0.001を接続しています。なくてもいいんですが、何となくカーテンをなびかせたいので設定しました。ベクトル方向を変えれば好きな方向から風荷重を載荷できますので試してみてください。
メッシュの頂点を取得

- Naked Verticesコンポーネントでメッシュの頂点を取得します。
- MergeコンポーネントでClothedPtsとNakedPtsから取得できる点をまとめます。これでメッシュのすべての頂点が取得できました。
ゴールオブジェクトの設定④(Load)

- Loadコンポーネントで鉛直下向きの荷重を与えていきます。先ほど取得したメッシュの頂点を接続し、-Z方向に30の荷重をかけています。
ゴールオブジェクトの設定⑤(Sphere Collider)

- Sphere Colliderコンポーネントで衝突判定の設定を行っていきます。カーテンが変形した際にメッシュ同士が交わらないように各頂点に球を生成し、その球同士がぶつかり合うような設定になります。これを設定するとだいぶ布っぽい挙動をしてくれます。今回は球の半径が100mmでシュミレーションしたらいい感じになったので100を入力しています。
ゴールオブジェクトの設定⑥(Solid Point Collide)

- カーテンの下に床を用意し、床とカーテンの衝突判定をしていきます。Solid Point Collideコンポーネントにメッシュの頂点を入力します。
- Center Boxコンポーネントで床を作成します。中心を(0,0,-50)、X・Y方向5000mm、Z方向100mmの直方体を作成し床とします。Solid Point CollideコンポーネントのSolid端子に接続します。
- Solid Point CollideコンポーネントのStrength端子には十分大きな数字を入力しておきます。今回は10000を入力しています。
ゴールオブジェクトの設定⑦-1(Anchor)

- カーテンの上部を固定していきますが、まずは固定する頂点を取得します。
- Mesh Edgesコンポーネントを用意し、最初に作成したMesh Surfaceコンポーネントの出力端子を接続します。E1端子から外部に位置するNaked Edgesが取得できます。このなかから上部のエッジのみを取得します。
- やり方は色々あると思いますが、今回はエッジのZ座標が2300のものをリストから取得する方法をとっていきます。End Pointsコンポーネントでエッジの始点を取得します。
- Deconstruct Pointコンポーネントで取得した始点の座標をX・Y・Z成分に分解します。
- Member Indexコンポーネントで分解したZ座標のリストから値が2300のもののインデックス番号を取得します。(※Numberコンポーネントには一番最初にZ方向にExtrudeした際の2300が接続されています。)
- List ItemコンポーネントでE1端子のリストの中から始点のZ座標が2300の値を取得します。メッシュの上部のみのエッジを取得できました。
ゴールオブジェクトの設定⑦-2(Anchor)

- Join Curvesコンポーネントで先ほど取得したエッジを1本のポリラインにします。
- Sub Curvesコンポーネントに作成したポリラインを接続しReparametraizeし、0.00~1.00のドメインを取得します。ポリラインの始点を0.00、終点を1.00とし、ポリラインを指定したドメインの範囲で抽出します。今回はカーテンを開け閉めしたいので、このような処理をしています。
ゴールオブジェクトの設定⑦-3(Anchor)

- DiscontinuityコンポーネントでJoinCurvesコンポーネントから取得できるポリラインの非連続点(頂点)を取得し、Anchorコンポーネントに接続します。カーテンの上部51点が拘束されました。
- Anchorポイントを完全に固定するのではなく、各点Targetに指定した点に向かって移動することを許容させていきます。
- Sub Curvesコンポーネントで作成したポリラインをDivide Curveコンポーネントで分割します。分割点がアンカーポイントの数と一致している必要があるので、DiscontinutyコンポーネントからList Lengthで頂点の数を取得し、入力端子Nに接続します。この時、入力端子N上で右クリックを押し、Expressionに「x-1」と入力し、入力値から1を引きます。
- AnchorコンポーネントのTarget端子に接続します。
Solverの設定

- Entwineコンポーネントでゴールオブジェクトをまとめます。showコンポーネントは別のブランチで一番最初に接続します。残りはまとめて接続しFlattenしておきます
- 今回はBouncy Solverコンポーネントで演算を行っていきます。Entwineコンポーネントでまとめたゴールオブジェクトを接続し、Reset端子にButtonコンポーネントを、On端子にBoolean Toggleコンポーネントを接続します。
- Boolean ToggleコンポーネントををTrueにして演算を開始してみます。Anchorコンポーネントを設定する際にSub Curvesコンポーネントに接続しているNumber Sliderを1.00から動かしたときに、上画像の様にカーテンが開くような挙動をしていればOKなので、確認できたらFalseにしてResetボタンを押し、演算をキャンセルします。
演算後のメッシュをサーフェイス化

- Bouncy Solverの出力端子OからList Itemコンポーネントで0番目の要素を取得することで、演算後のメッシュが取得できます。
- Deconstruct Meshコンポーネントでメッシュの頂点を取得します。
- Surface From Pointsコンポーネントで取得した頂点からサーフェイスを生成します。入力端子UにはU方向のポイント数を入力します。一番最初にMesh SurfaceコンポーネントでU方向の要素数を25個としたので、1を足して26が入力されています。(※入力端子U上で右クリックExpressionで「x+1」を入力しています。)
- 最後にCustom PreviewコンポーネントとColour Swatchコンポーネントでカーテンと床にそれぞれ色付けして完成です。
以上になります。Sub Curvesコンポーネントに接続されているドメイン(NumberSliderコンポーネント)を変えることでカーテンが開け閉めできますので試してみてください。