今回は kangaroo2 を使用して、以下の Gif 画像の様な挙動をするカーテンを作っていこうと思います。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 コンポーネント)を変えることでカーテンが開け閉めできますので試してみてください。