Grasshopper カンガルー、ジオデザイックドームの応力可視化

Grasshopper Kangaroo, Visualizing Stress of Geodesic Dome
カンガルーでジオデザイックドームの応力可視化

前回のブログでは、建築構造の大家バックミンスター・フラーのジオデザイックドームを作成した。ということで、Grasshopper (GH) のプラグインKangarooを使って、ジオデザイックドームの応力可視化に挑戦してみたい。Kangarooは物理演算のソフトで、荷重、テンション、衝突(コライド)など、さまざまな物理的現象をシミュレートできる。Rhino8のGHにはKangaroo2が最初から組み込まれている。今回の実験は、Daniel Pickerによる公開コードBeam Example1.ghを利用する【00】。

【00】Beam Example1.gh、Kangaroo2の出力からC言語による応力可視化を実行するスクリプトが入っている。

参照サイト:
“【集中講座】Grasshopperの物理演算プラグイン「Kangaroo」とは”  株式会社アプリクラフト
“Dan-Piker/Kangaroo-examples” Public Kangaroo Code by Daniel Picker上記Dan-Picker公開コードのNew_for_241/ BeamExample1.gh

80面体ジオデザイックドーム

前回はPolyhedron /IcoSphereのDensity “3 ” (1280面体)のドームを作成したが、単純化する為Density “1 ” (80面体)で行う。【01】に示すように、上下スプリットすると残念ながら欠損しているので、この状態でBakeして、Lineをモデルで付け足して欠損部を補う。また地面に接する水平部材は外し、12の支点で荷重を支持することとする【02】。直径6mのドーム(※1)。
※1. Rhinoモデルの作図単位は、後の応力可視化スクリプトのデフォルトのパラメーターを使用し易いように、メートル(m) あるいは センチメートル(cm)とするのが適当と思われる。
【01】Density=1, 80面体
【02】12支点

まずはすべての部材のLineを等分割する Divide Curve 、ここでは5分割。ここで生成した点はKangarooシミュレーションの作用点となる。つぎに分割点をつなぎ、Polyline でポリラインに変換する(※2)。
※2. BeamExample1.ghのDivide LengthDivide Curve に変更。

【03】Divide Curve, Polyline

次にポリラインをExplode分解し、 各点に線分(Curve)にPerpFrame垂直の作業平面をつくる。PerpFrameのパラメーターをそれぞれ0と1に、リパラメタライズする【04】【05】。

【04】Explode, PerpFrame
【05】PerpFrame / Parameter “0”, “1” and Reparametarize

これらをKangaroo/ BeamのStartFrameとEndFrame端子に接続する【06】。BeamからのアウトプットはEntwineへ。Beamにはヤング係数Eなど様々なパラメーターを設定できるようになっている。とくに設定しなくとも、他のパラメーターはデフォルトのままで計算できる。

【06】Kangaroo /Beam, Entwine

Kangaroo / Support 支点と支持条件の設定

入力端子Frameは支持点の位置と向きの設定で、鉛直荷重なので
Point→ XY Plane → Frame
支持条件は以下のように設定する【07】。

支持 X,Y,Z XX,YY,ZZ
固定 True True
ピン True False

【07】Kangaroo /Support

これら12の支点をEntwineの2番目の端子にまとめてつなげる【08】。
【08】Entwineの2番目の端子へつなぐ

Kangaroo / BouncySolver

いよいよKangarooのメインのコンポーネントの BouncySolver 出番である。Bouncy無しのSolverは、計算結果だけ出力するのに対し、BouncySolverはカンガルーが飛び跳ねるがごとく、時間軸を伴った動きのあるシミュレーションが出力される。BeamとSuportをまとめたEntwineからBouncySolverのGoalObjects端子に接続する。一番下のOn端子にトグルをつけて、シミュレーションのOn⇔Offのスイッチとし、Resetの Buttonでシミュレーションをスタートする。データが大きい時などは、トグルで計算を止めて作業する【09】。

【09】Kangaroo/ Bouncy Solver

ワン・モア・シング!ジョブズの決め台詞ではないが、大事なものをまた1つ忘れていました。GrabというコンポーネントをSupportと同じEntwineの2番目の端子に接続。Grabは、定義したすべての作用点、ここでは分割点を「つかんで」動かすことが出来るようにするコンポーネント。BeamExample1.gh のGrabコンポーネントはバージョンが古くRhino8GHでは動かないので、最新のGrabとつなぎ直す【10】。そして、Bouncy SolverからのOutputをExplode Tree で準備完了【11】。ここまででお分かりと思うが、Entwineへの接続は、Beamからの出力のみ1番目{0;0}で、他は全て2番目{0;1}となる。

【10】Kangaroo / Grab 最新版につなぎ直す
【11】Explode Tree

応力可視化スクリプト

いよいよ応力可視化スクリプトの実行。【00】の後半の部分をExpolde Tree につなげる。するとBeamが黒で表示される【12】。

【12】部材が梁として黒で表示される

Rhino8/GHの環境では、C#スクリプトのコンポーネントにOLD表示がつくが、スクリプト自体は実行可能、気にしないで良い。ちなみに筆者にはチンプンカンプンだが、コンポーネントをダブルクリックするとエディタが開き、前半のスクリプトを開くと以下のようなコードが表示される【13】。

【13】前半のC#スクリプト

上の2つのスライダーが「Beamの断面サイズ」、黒で表示
中央が「曲げモーメント」、赤と青で表示
下が「ねじりモーメント」、緑の線で表示

Beam、梁なので、断面はx幅 y成 での入力となっている【14】。作図単位によって、黒の梁のサイズが太過ぎたり細過ぎたりする場合がしばしばあるので、x幅 y成のパラメーターを調整する。
【14】Beam断面、曲げモーメント、ねじりモーメント

Grab 局所的な力

【12】では応力が発生していないので、マウスでどこかをグラブして動かして部材に負荷をかけると、、、以下のように曲げモーメントが赤と青で、ねじりモーメントが緑のスパイラルで表示される【15】!マウスで動かすと何か弾力を感じる。なかなか面白いですよね。これがKangarooです。表示されない場合は、曲げモーメントとねじりモーメントのスケールを大きくする。

【15】どこかの点を動かして局所的な応力を発生させることができる

Load による荷重/重力

Grabで動かせば局所的に応力が発生するが、躯体全体に応力をかけるには、Kangaroo/ Load で荷重/重力を発生させる。負荷はドームのフレーム全体に均等にかけるので、すべての点を抽出し、負荷をかける。当然重力はマイナスZ方向に設定【16】

【16】Load 荷重/重力、すべての点に均等に負荷をかける

このアウトプットをEntwine の2番目につなぐ。すると、、、 全面に応力が表示される【17】。荷重と応力パラメーターの数値を適宜調整してください。どの部材もモーメントの大きさが同じくらいで分散されていて、きれいな応力分布ではあることが分かりますね【18】。

【17】

【18】全点に均等に重力荷重をかける。フレーム全体に均等な応力分布

Load による局所荷重

それでは次に、ドームの最上の頂点のみに荷重を与える。List Itemで頂点を抽出し、頂点の1点に荷重をかける。例えると、一番上のみにお相撲さんが載る【19】【20】。

【19】

【20】頂点への局所荷重。応力分布は頂点から支点へ減少していく。

崩壊実験

最後にこの頂点の局所荷重をフレームが崩壊するまで極限の荷重を与えてみたくなる。そのためにはLoadの強度Weightingを大きくしていく。スライダーを右クリックすると、Animate…というメニューがあるので、これを実行すると、スライダーの0から最大値までフレームを生成してくれる。連番の静止画像なので、GIF動画などに変換する。


【21】崩壊シミュレーション1, 地面無し

地面が設定されていないので、垂れ下がるまでフレームが落ちていく。支点にはSupportでXY平面の地面を与えているので、12の支点からシャンデリアのように垂れ下がるというわけ。もちろん、こんな崩壊はありえない。ある程度変形すると、部材が降伏し局所的に折れ曲がって降伏するか、接合部が壊れるなどして崩壊していく。そこまで再現するには様々な条件を設定することが必要ですね。サグラダファミリアのカテナリーのようで面白いが、Kangaroo/ Floor により地面を与えることができる【22】。脱線するが、崩壊実験で思い出すのは、学生時代に隣の内田祥哉先生の研究室では、実際にドームを作り壊すところまでやっていたし、ライトもジョンソンワックスの円蓋柱のモックアップでの実験が有名。(こっちは壊すまでやってない?)建築家は建物が壊れてはいけないので、一方で壊したくなる欲求があるのかしら。当然地面を与えると崩壊は地面に衝突(コライド)した時点で終了する。


【22】Kangaroo/ Floor 地面の設定


【21】崩壊シミュレーション2, 地面有り

以上で応力可視化のデモは終わりです。Kangarooはその他いろいろ出来るので、興味のある人はその先を極めてみるのもいかがかと。また、構造の物理演算を本格的に行えるKarambaというプラグインがあるようです。GHのプラグインはフリーが多いですが、Karambaはインストールして多少動かすことが可能だが、商用で本格的に利用する場合は、別途料金が発生する。この先は構造エンジニアにお任せしましょう。

Rhino Inside Revit in 2025, RevitでGrasshopperを走らすPart 2

Rhino Inside Revit アップデート

Rhino8にアップデートしてから、Rhino.Inside.Revitをインストールしておらず、久しく使ってなかった。先日Rhino.Inside.Revitをセットアップしたところ、だいぶ様変わりしていた【01】。使い方を思い出そうと、「RevitでGrasshopperを走らす」と題したずいぶん前のブログ(2021年3月)を引っ張りだしたのだが、コンポーネントも変わっていて悪戦苦闘した。とりあえず目的は達成したので、せっかくなのでその成果を共有したいしたいと思う。筆者のワークステーションの性能も格段に上がったので題名通りRevitでGrasshopperを走らせよう!
【01】最新バージョンのリボン

Geodesic Domeジオデザイックドームの作成

ジオデザイックドームを作る方法はいろいろあるのだが、今回は、Grasshopper (GH) の2つのプラグイン ① RhinoPolyhedra と ② Weaverbird を使った方法を紹介。Rhino8からは、Food4Rhinoのサイトを介さず、RhinoからPackageManagerで直接インストールできるようになっている。PackageManagerで見つからないプラグインはいつも通り、Food4Rhinoなどからインストールしてください。

① RhinoPolyhedra
ジオデザイックドームを生成するツールがネイティブのMeshツールの中にインストールされる。また親のRhinoの中にもジオデザイックドームを作成するモデリングツールがインストールされる。
【02】RhinoPolyhedra、GHのMeshにネスト

②Weaverbird (Wb)
ポリゴンメッシュでのパネリングなどの加工が得意なプラグイン。メッシュから窓パネル(Mesh Window)や窓枠(Mesh Frame)をつくるコンポーネントが便利。
【03】Weaverbird (Wb)

Polyhedra / Icospher ジオデザイック多面体のコンポーネント

それでは準備が出来たので、ジオデザイックドームのモデリング。
Mesh / Polyhedra / Icospher
でジオデザイックドームを一発で作成【04】。Scaleは半径を示す。Densityは分割数。ここでは3に設定。Density は上げ過ぎると動かなくなるので注意。0の場合は正20面体【05】。

【04】ジオデザイックドーム Scale = 3000  Density = 3

【05】Density = 0 では正20面体

半球ドームにしたいので、XY平面で上下でスプリットする【06】。
Mesh /Utility /Mesh Split Plane
【06】Mesh Split Plane

Weaverbird ガラスパネル&枠の作成

【06】は単なるメッシュのドーム。ここから窓ガラス(パネル)をつくるのは、
Weaverbird / Transform / Weaverbird’s Mesh Window
窓枠(マリオン)をつくるのは、
Weaverbird / Transform / Weaverbird’s Picrure Frame
先のドームのメッシュデータからワイヤをつなげるとインスタントに生成【07】。
【07】Weaverbird’s Mesh Window & Picrure Frame

この窓枠は平面なので見込み60を与える【08】。
Weaverbird / Transform / Weaverbird’s Mesh Thicken
【08】Weaverbird’s Mesh Thicken

ガラスは枠(マリオン)見込みの中央に配置したいので、見込60を2等分した30移動(オフセット)する【09】。
Weaverbird / Transform / Weaverbird’s Offset Mesh
※パネルが一枚だけうまくオフセットされないので、いったんMeshツールのDisjoint Meshを介して移動している

【09】ガラスをマリオンの中央に移動、Weaverbird’s Offset Mesh

最後にガラスに厚み10を与える【10】。
Weaverbird / Transform / Weaverbird’s Mesh Thicken
【10】ガラスをに厚みを与える

これをGHのコンポーネントを選択して、RevitでBakeするとプロジェクトの中にドームが読み込まれる【11】。
【11】RevitでBakeして読み込まれたが…

これで完成と行きたいところだが、この状態だとRevit上でマテリアルがアサインできないことに気づく。それを解決する一つの方法は、RevitでBakeする前に、Rhino上でBakeしてそのRhinoモデルにガラスと窓枠のマテリアルをアサインし、その3DMモデルをRevitにインポートするやり方がある。しかし、どうせならGHでマテリアルをアサインしてRevitに取り込みたい。ここからがクライマックス。

Add DirectShape

とりあえず、とにもかくにも、GHでつくったジオメトリーをRevitに読み込みたい時は、RevitリボンのAdd DirectShape (Geometry)【12】。
【12】 Revit / DirectShape / Add DirectShape (Geometry)

たとえばRevitのLoftでつくったフォームなど、とりあえずなんでもRevitに取り込める【13】。
【13】 Loftで作成したサーフェスをGeometoryとして即席インポート

このDirect ShapeにはMaterialの入力端子があるので、ここにパラメーターを入力できるはず。

Add Material

【14】 Add Material

まずAdd Materialでマテリアルの名前を定義しておく。次にColour RGB でマテリアルに色を与え、最終的にRevitのマテリアルアセットに持って行くために、以下のようにMaterial GraphicsReplace Material’s Assetとつなぐ【15】。
【15】色の設定、その他マテリアルパラメーターの設定

最後に先のDirect ShapeのMaterial端子につなげる【16】。

【16】DirectShapeのMaterial端子に接続

すると、マテリアルがRevit内でアサインされた【17】!

【17】GHで定義したマリオンの黄色とガラスの水色が無事に読み込まれる

Revitのマテリアルブラウザを確認すると、GH上で定義した枠とガラスのマテリアル『*Aluminum』と『*Glass』がちゃんと読み込まれていることが分かる【18】。

【18】Revitのマテリアルブラウザ

ここまでできれば、Lumionでもマテリアルをアサインできる【19】。
【19】RevitからLumionにインポートしてマテリアルをアサイン

Adaptive Panel

これで終わりにはできない。先ほどのブログのようにパネルはRevitのファミリー、前回ブログで作成した『Adaptive三角パネル』を割り付けたいところ。意外にシンプルな以下の手順。Adaptiveコンポーネントは、Meshは認識しないので、まずMeshの境界を抽出する。
Mesh / Analysis / Face Boundaries
を使うのがポイント。これはBrepとしてまとまっているので、Deconstruct Brep で分解し、それぞれの三角Brepのエッジを抽出し、
Revit / Component / Add Component (Adaptive)
につなげるとRevitにうまく読み込まれる【20】。

それと、肝心なことをすっかり忘れていだが、Revitのアダプティブコンポーネントを取り込むために、Built-in Categoriesでファミリーのカテゴリー (✓Cutain Panels)を、 Element Type Picker でコンポーネント(✓アダプティブパネル_三角)を指定している。 (この辺のコンポーネントが前回と違う。)
【20】Add Component (Adaptive)

うまく割り付けられてない大きなパネルが2枚があるが、ピン固定を解除しDeleteすると【21】、
【21】うまく割付られないパネル(地面リングの微小なフラグメント)をDelete

無事に Adaptive Panelの割付が完了。とくにおおきく欠損しているところは無いようだ。Adaptive Panelには枠とガラスのマテリアルをアサインしているのでRevitでレンダリングすると以下のようなレンダリング結果となる【22】。
【22】Adaptive三角パネルの割付

結果オーライとして、この辺で打ち止めとしましょう。

250908  HN

Rhino/Grasshopperで日影図を

日影図といえばJw_cad ! ですが…

久しぶりに日影の検討が必要になった。せっかくBIMを使っているのだから、BIMのプラグイン/エクステンションソフトを購入すれば便利であるのは十分承知なのだが、経費削減の為、日影の検討が必要な際は毎度「Jw_cad」にお世話になっている。Jw_cadは、メードインジャパンのシンプルで非常に優れた建築CAD。日影図だけでなく天空図まで作成でき、確認機関でもJw_cadで作成した日影図/天空図を受け付けてくれる公認のソフトである<図1>。

<図1>Jw_cadで作成した日影図

Jw_cadを使えば正確な日影図や天空図が作成できるのだが、建物の高さの設定が少々面倒である。特に筆者は普段Jw_cadを使ってないので、日影や天空の検討が必要になると、Jw_cadの操作を思い出しながらの作業になるのでさらに面倒となる。日影とJw_cadは忘れた頃にやってくる。またJwは2DCADであり、他のソフトで作成した3Dモデルは(確認してないが)読み込めない(はず)。そもそもJwの日影/天空の3Dは建物の頂点に高さ情報が入った準3Dモデルに過ぎない。

そこでRhinoでつくった3DモデルからGrasshopper(以下GH)を介して日影図が作成できなかと思い立つ。手軽に3Dを作れるRhinoならボリュームスタディなど設計の初期の段階では非常に役に立つだろう。ということでRhino/GHで日影図の生成に挑戦してみたので以下紹介したい。太陽の位置情報はJw_cadの壁倍率表から得ることが出来る<図2>。このパラメーターを利用し、Jw_Cadと比較すれば、Rhino/GHで生成した日影の正誤が検証できる。


<図2>Jw_cadによる壁倍率表

太陽の方向、方位角と高度

ファーストステップは、太陽の方向、すなわち方位角と高度のベクトルへの変換。まずは、冬至9:00の太陽(時刻,高度,方位角)(9.0, 17°09′,-42°46′)のベクトルを作る。上記Jw_cadの表の数値は小数点以下が60進法なので10進法(9.0, 17.15°,-42.77°)にしておく。ノースアップなので+Y方向が北、+X方向が東<図3>。

<図3>Yベクトル0°(北向き)

我々の日本の太陽は南側にいらっしゃるので180度回転し、ベクトルの向きを確認する<図4>。

<図4>Yベクトル180°(南向き)

9:00の太陽方位角「-42.77°」

これを9:00の方位角「-42.77°」に回転する<図5>。これだと西日になっているので、

<図5>「-42.77°」入力すると夕日(西日)

マイナス数値をプラスに変え、反転させる。これで9:00の方位角「-42.77°」のベクトルの設定完了<図6>。
<図6>「+42.77°」で朝日

9:00の太陽高度「17.15°」

まだ太陽はべったっと地面に張り付いている。次にいよいよ9:00の高度「17.15°」を設定し、太陽を天空に上昇させる。回転の基準となる面の作成は「Plane Normal」で法面を抽出するやり方。そして「17.15°」回転し、9:00の太陽(9.0, 17.15°,-42.77°)のベクトルが作成する<図7>。


<図7>「Plane Normal」で法面を抽出

ここまで出来ればゴールは近い。後は9:00から15:00までリストでまとめてベクトルを取得すれば良い。リストは(9.0,17.15,-42.77),(9.5,21.05,-36.75)—-(15.0,17.15,42.77)というように点座標の形式にすると、時間毎の高度と方位角が抽出しやすい。(9:00,17.15,-42.77),(9:30,21.05,-36.75)—-(15:00,17.15,42.77)とするとX座標がエラーが出てしまうので時刻を小数点表示している。リストを使った抽出法は他にあると思うが筆者の苦肉の策。このリストを先のコンポーネントに接続すると、<図8>のように9:00から15:00までの30分毎の太陽ベクトルが取得できる。
<図8>9:00から15:00までの冬至の太陽の軌跡
ここではどういうわけか9:00から15:00で検討していますが、日影規制はほぼ8:00-16:00ですのでご注意ください。念のため。追記220224

影の投影、Project Along!

いよいよ影を地面に落とす。RhinoにはProject というコマンドがあって、オブジェクトを面に投射(Project )することができる。Project Alongというコマンド(正確にはGHではコンポーネント)で投射のベクトルを太陽のベクトルにつなげると、9:00から15:00までの影がXY平面に投射できる!<図9> 2次平面だけでなく、球などの曲面にも投射できる。なので天空図などもRhinoを使えば描くことができる訳であるが、GHでの天空図は別の機会に検討することにしよう。天空が使用可能かどうかはだいたい直観的に分かるケースが多いので必要ないかしら?


<図9>Project Along

これだと地面に影が落ちてしまっている。日影図は測定面と言われる1.5m, 4m, 6.5mの面に落とす影なので、地面を4mの高さに上げる。すると南側にしっぽが出てしまう<図10>。測定面より下のモデルを切り取る必要がある<図11>。

<図10>測定面を設定すると南側にも影が落ちる


<図11>「Split Brep」で測定面より下をカットする。カットする面は「Plane Through Shape」で一回り大きいカット面を作ると便利。スプリットなのでBrepが2つできるので、上のBrepを選択することを忘れずに。

トップビューで確認<図12>。最初にJw_cadで作成した時間日影図<図1>と無事に一致。


<図12>Rhino/GHで作成した時間日影図、Jw_cadで作成した<図1>と一致

等時間日影図

時間日影図を作成すると、2.0h、2.5h、3.0h、4.0h、5.0hの等時間日影図は時間日影図の交点をコツコツと抽出すれば良い。下は2.0h等時間の作成の為の9:00と11:00の影が重なる範囲<図13>。


<図13>9:00と1:00の影が重なる範囲

後は「9:00&11:00」「9:30&11:30」—「13:00&15:00」と重なる範囲をまとめて取り出す<図13>。等時間図としては影の先端を曲線で結ぶ(=微分する)必要があるが、先端が5mラインや10mラインに収まっているか否かを確認すれば良いのでこれで十分。正直言うと、試みたが早々とあきらめる。

<図14>2時間の等時間日影

2.0hを作れば、それをコピーして2.5h、3.0h、 4.0h、5.0hのセットに修正は簡単<図15>。もっとスマートなコードはあると思いますが。。

<図15>2.0hから2.5h、3.0h、 4.0h、5.0hの等時間を作成

検証

それではこのスクリプトでどんな計算結果がでるか検証してみよう。丹下健三のフジテレビばりのゲート型の形状や、ロフトによるスパイラルタワーなどの時間日影図と2.0h等時間日影図は問題なく生成<図16>。形状が複雑になればなるほど計算に時間がかかるので、出力されるまで我慢。「フリーズしたかな?」と思ったが3分も待てば生成。2.0h、2.5h、3.0h、 4.0h、5.0hのすべての等時間のコンポーネントセットがあるので、使用しないものは「enabled」を「off」にしておくとよろしいかと。


<図16>ライノで作成したボリュームをGHで影を生成

スパイラルタワーは抽出できたのだが<図17>、


<図17>スパイラルタワー(OK)

コーンや球体の影が落ちない<図18>。なぜか?上記の方法ではエッジ(Edge)が無いと外形が抽出できない為である。


<図18>コーンの影が落ちない(NG)

コーンはエッジを作るため多面体で作成すれば無事に影が落ちる<図18>。32面体で確認。

<図19>多面体にすると影が作れる

これで某プロジェクトの設計準備完了!

これから元気にコーンやスパイラルタワーを提案するというわけではございませんので、あしからず。

2021.10.10 HN