【集中講座】 – 布×物理演算 – Kangarooでサンシェードやカーテンを作成

前回、Grasshopperの物理演算ツールであるKangarooについて、概要とどのようなことができるかをざっとご紹介しました。以降は、さらに具体的な例を使ってより詳しくKangarooの使い方を解説していきたいと思います。

今回は、Kangarooの応用例の多い「布」の表現を使って、以下のようなサンシェードとカーテンをモデリングしてみます。

1.モデルの準備

以下の画像のようなモデルを準備します。

ダウンロードデータ: KG01.3dm

※こちらのデータは建物や植栽はVisualARQやLandsDesignを使って作成しています。
これらのプラグインをインストールしていなくても形状自体は開くことはできますが、ビュー上の見え方が異なりますのでご了承ください。

モデルデータの内、Kangarooで使用するのは下記のオブジェクトです。

・点オブジェクト固定点8カ所レイヤ:固定点
・サーフェス変形前のサンシェードレイヤ:サンシェード
・カーブカーテンを付けるエリアレイヤ:カーテン枠

2.サンシェードのモデリング(目標点に対して引っ張る形状)

オブジェクトのSet

Grasshopperを開きます。
それぞれ[Surface][Point]のパラメータを用意して3dmのオブジェクトをSetします。

メッシュ化

Kangarooは、主に点や線分を使って位置や長さを目標に向かって最適化するので、原則サーフェスはメッシュに、曲線はポリラインに変換する必要があります。このとき、分割が細かいほど詳細な形状が再現できますがその分計算は重くなります。

Setしたシェードを[Mesh Plane]で網目状のメッシュに変換します。分割数を[Number Slider]で指定します。
Setした固定点から紐の[Line]を作成し、[Divide Curve]で分割して[Polyline]にします。

不要なレイヤはRhinoで非表示にしておきます。

点の拘束

点の拘束条件の設定は[Anchor]というゴールオブジェクトを用います。
P端子(Point)には、拘束条件を与える点を入力します。
T端子(Target)には、その点を拘束したい目標点を入力します(何も入力しない場合はその場に拘束されます)。
Strengthという端子がありますが、これは優先度や重み付けの役割を果たします。
結果を見てから調整すれば良いので一旦デフォルト値で構いません。

今回のモデルでは[Anchor]を2つ用意し以下のように作成します。

①シェードのメッシュの頂点を抽出し(DeconstructMesh)、その中の最も固定点に近い頂点(ClosestPoint)を、Setした壁側固定点に拘束

②手すり固定点はその場に拘束(T端子には何も繋がない)

線分に強度を設定

シェードを網目状のメッシュに分割しましたが、特に条件を与えない限りこのメッシュは強度を持たない(つまり無限に柔らかい)ため、力を掛けるとバラバラになってどこかに飛んでいってしまいます。
なのでメッシュのエッジや紐に長さの条件を与えて疑似的に強度(弾性)を設定します。

エッジの長さ設定には、[Length(Line)][EdgeLength]というゴールオブジェクトを使用します。
[Length(Line)]の場合、Line端子には長さを設定したいエッジを入力します。
Length端子には目標長さを入力します。何も入力しなければ元の長さを維持しようとし、
逆に短くすれば縮む方向に、長くすれば伸びる方向に力が掛かる挙動になります。

このモデルでは、メッシュの各エッジとPolylineを[Explode]で分割したSegmentをそれぞれ別の[Length(Line)]のLine端子に接続します。
Length端子にはサンシェード側は何も入力せず(その形状を維持する目標)、紐側には「0.1」を入力します(紐を引っ張るイメージ)。

重力を設定

シェードが下側に少したるむような挙動を再現するため、重力を設定します。

荷重条件の設定には、[Load][VertexLoads]というゴールオブジェクトを使います。
メッシュの頂点だけに使う場合は[VertexLoads]で良いですが、今回は紐の分割点もあるので[Load]の方を使います。

P端子に荷重条件を設定する点、FV端子に力の方向ベクトル、W端子に力の大きさを入力します。
(力の大きさと言いますが無次元のスカラー値でStrength端子同様あくまで相対的なパラメータです)

ここでは、メッシュの頂点と紐の分割点をP端子に入力し、FV端子の方向は下方向を表す{0,0,-1}とします。
W端子には調整できるよう[Number Slider]を繋ぎます。

出力したいオブジェクトを設定

ここまでの手順で既に物理演算に必要な条件は揃っていますが、このまま演算すると入力したいろいろなオブジェクトの変形結果がごちゃ混ぜになって出力されます。

[Show]というコンポーネントで最終的に結果が見たいオブジェクトを指定できます。
ここでは、シェードのメッシュと紐のPolylineの物理演算結果が見たいので、それらをそれぞれ[Show]に繋ぎます。

また、さらに出力結果を整理しやすいように[Entwine]を使って、

  • 演算条件のゴールオブジェクト群
  • シェードの[Show]
  • 紐の[Show]

というように階層を分けておくと後で抽出しやすいです。

ソルバーでの演算

演算条件が揃ったのでソルバーで演算を行います。[Entwine]の出力を[Solver]に繋ぎます。

Reset端子は演算のリセットに用います。図のように[Button]を使うと便利です。
On端子は、演算のオンオフを制御します。図のように[Toggle]を使うと便利です。
Threshold端子は、どの程度動きが収まったら演算を止めるか(収束判定)の閾値を設定します。
Tolerance端子は、同一点と判定する許容差の設定です。
ThresholdとToleranceは一旦デフォルト値で進め、思ったような結果が得られない場合に調整すると良いでしょう。

[Entwine][Solver]に繋ぐと最初エラーになるかもしれませんが、Resetすれば解消されます。

[Toggle]をTrueにすると物理演算がスタートします。

▼ソルバー実行中の様子

[Toggle]をFalseにするか、演算が収束する(ラベルが「Converged」に変わる)とソルバーがストップします。Kangarooは摩擦などの抵抗力の概念がないので、力のつり合いが取れないとなかなか収束しません。ある程度動きが収まったら任意のタイミングで止めて良いでしょう。

あるいは、[Zombie Solver]という収束有無に関わらず指定した演算繰返し数(MaxIterations)までの結果を出力するソルバーもあります。

演算結果の抽出

仕上げに演算結果から必要なデータを抽出して、加工してみます。

[Solver]のO端子から結果が出力されていますが、そのままではGoalObjectsに繋いだすべてのオブジェクトの変形結果が出力されるので、[Explode Tree]で階層を指定して取り出します。これが[Entwine]で整理した理由です。
[ZombieSolver]は階層がFalttenした状態で出力される仕様なので[List Item]でデータ抽出します)

メッシュのままだとカクカクした見た目になるので[SubD]に変換すると滑らかになります。
紐のPolylineは[Pipe]で太さを付けます。

最後に[Custom Preview]でマテリアルを設定(M端子で右クリック>Set one Material)すれば完成です。
(図のものはサンシェードは「Red green Texitile」、紐はグレーの単色を割り当てています)

演算条件を変えてみよう!

アルゴリズムができたので、演算条件をいろいろと変えてみましょう。

例えば、手すりの固定点を上方向に移動する(ポールなどで固定するイメージ)と図のようになります。

紐のLengthの入力を外す(引っ張らない)とだらんと垂れたような形状になります。

壁固定を4点ではなく、2点にするとよりだらんとした形状になります。

垂れすぎたら[Load]のWeightingや[Length(Line)]のLengthを小さくするなどいろいろと調整してみてください。

▼演算条件を変えてシミュレーションした様子

カーテンのモデリング(重力方向に垂らす形状)

次はカーテンをモデリングしてみます。
基本的な考え方はサンシェードと同じですが、ふわっとした形状を再現するには少し工夫が必要になります。

オブジェクトのSet

[Curve]パラメータを用意して、カーテン枠レイヤのカーブをSetします。

メッシュ化

[Mesh Plane]でメッシュを作成します。
メッシュの分割は後の変形を考えるとできるだけひとつのセルが正方形に近くなる方が良いでしょう。

演算条件

まずサンシェードと同様の方針で考えると以下のようになります。

  • 最上部の頂点の何点かをカーテン枠の上部エッジに拘束 ⇒ [Anchor]
    (このとき上部エッジを[Scale NU]でサイズ変更し、カーテンの開け閉めを表現)
  • メッシュに強度を設定(伸び縮みしないようにStrengthを大きめに) ⇒ [EdgeLengths]
  • メッシュの各頂点に重力を設定 ⇒ [VertexLoads]
  • 出力結果としてメッシュを抽出するように設定 ⇒ [Show]

これらの方針で作成すると次のようなアルゴリズムになります。
(文字が小さくて見えにくい場合は下部のダウンロードデータからご確認ください)

[Solver]の結果を見ると演算はできていますが、平面的であまりカーテンっぽくありません。

奥行感を出す工夫

カーテンのプリーツによるふわっとした奥行感を出すために3つ変更点を加えます。

  1. 動きを出すためにメッシュを三角形に変換する ⇒ [Triangulate]
  2. 最上部のメッシュの頂点に重力より小さいY軸方向の力を掛ける ⇒ [Load]
  3. 隣接したメッシュができるだけ滑らかになるようにする(重ならないように) ⇒ [Smooth]

この3つの変更点を加えたアルゴリズムが以下です。
カーテンのふわっとした感じが表現できました(クリックで拡大します)。

仕上げにサンシェードと同様、メッシュを抽出し[SubD]に変換、[Custom Preview]でマテリアルを割り当てて完成です(マテリアルは「Yellow fabric scroll」)。

パラメータ変更すると、開けたり閉めたりもできます。

今回は以上です。

今回はどちらかというと建築3Dモデルのためのモデリングという感じでしたが、
Kagarooはプロダクトデザインや、形状や配置の最適化ツールとしても活躍しますので、
次回以降またほかの例でご紹介できればと思います。

作成したGHデータは下記よりダウンロードできます。
KG01.gh