[Dynamo] LOD200 法面の巻込み部のモデリングを効率化 その3:擁壁付きの巻込みのモデリングを自動化

Dynamo

こんにちは、ISDです。

今回は、巻込みのモデリングについてもう少し発展させて、ブロック積み擁壁付きの巻込みのモデリングに挑戦したいと思います。
下図のような、ボックスの脇によくあるタイプのものですね。
これも、なんだかんだで結構面倒です。

Dynamoを用いて擁壁付き巻込みをモデリングする

今回は、Dynamoを用いて、擁壁付き巻込みをモデリングしてみたいと思います。
法面巻込みの下部に五分勾配の擁壁がついているものです。
擁壁の形状は、Dynamo 上で自動で決定するようにします。
LODは、100~200程度とします。


手順としては、
1.AutoCAD上で、法面の断面形状および、回転の中心、回転の開始・終了の位置を示す3Dポリラインを作成
2.Dynamo上で3Dポリラインの情報をもとに、巻込みの土工部のもととなる回転体(サーフェス)で生成
3.Dynamo上で擁壁部下辺のラインを生成
4.Dynamo上で擁壁部天端のラインを抽出
5.擁壁部のサーフェスを生成
6.2で生成したサーフェスから巻込みの土工部の部分を切り出す
7.Dynamo上のサーフェスを、Civil 3D上にポリメッシュとして生成

となります。

[Dynamo] LOD200 法面の巻込み部のモデリングを効率化 その1:単純な回転体によるモデリング
で用いたDynamoを改修していきます。

Civil3DToolkit および MeshToolKit 、Springs のノードも使用していますので、それぞれ のパッケージをインストールしておいて下さい。
パッケージ のインストール方法についてはこちらをご参照ください。

使用するノード(今回新しく使用するもの)

Geometry.Translate
方向と距離を指定して、ジオメトリを移動します。

Arc.ByStartPointEndPointStartTangent
始点、終点、始点での接線方向を指定して円弧を生成します。

Curve.Offset
距離を指定して、カーブをオフセットします。カーブは同一平面上になっている必要があります。

List.Flatten
階層化されたリストのリストを、指定した量だけ平坦化します。

List Create
入力された要素からリストを生成します。

List.Transpose
リストの列と行を入れ替えます。

Surface.ByLoft
入力された断面形状をロフトして、サーフェスを生成します。

Geometry.Intersect
オブジェクトとオブジェクトの重なる部分を抽出します。

Surface.NormalAtParameter
サーフェスにおける、指定したUVの位置での法線方向を取得します。

Vector.Z
ベクトルの Z 成分を取得します。

Surface.FlipNormalDirection
サーフェスの法線方向を反転します。

If
test の結果によって、true への入力、falseへの入力のいづれかが出力されます。

Surface.Thicken
サーフェスの法線方向に厚みを持たせて、ソリッドを生成します。

PolySurface.ByJoinedSurfaces
サーフェスを結合して、ポリサーフェスを生成します。

List.Count
リストに含まれる要素の数を取得します。

List.Chop
リストを、指定した長さの一連のサブリストに分割します。

Curve.ApproximateWithArcAndLineSegments
カーブを、円弧と線分を用いて近似します。

PolyCurve.ByJoinedCurves
連接したカーブを結合して、ポリカーブを生成します。

Dynamo のグラフ

ノードを上図のように配置します。
青くグループ化されている個所が、今回改修した個所です。

また、今回のDynamoのグラフが結構複雑になっているので、上図内でグループに番号を振っています。説明中にグループ番号が出てくるときは上図を参照ください。

では、Dynamoの中身を順を追って見ていきましょう。

3Dポリラインから巻込みのモデリングに必要な情報を取得

前回と同様に、巻込みのモデリングに必要な情報を Dynamo に渡すために、AutoCAD上で3Dポリラインを作図します。
3Dポリラインの終点が、巻込みの回転終了側の断面形状の端点を持っていきたい位置になるように作図します。

Dynamo では、グループ①~③です。
このパートは、前回と変わらないので解説は省略します。

巻込みの土工部のもととなる回転体(サーフェス)を生成

Dynamo では、グループ④です。
このパートも、前回と変わらないので解説は省略します。

擁壁部のモデリング

ここで擁壁部のモデリングについての概略を解説しておきます。

先ず、擁壁部の下辺のカーブを生成します。

擁壁部の下辺を基に、五分勾配のサーフェスを生成します。

次に、土工部のサーフェスと擁壁部のサーフェスの交差するラインを、擁壁部天端のラインとして抽出します。

擁壁部下辺(外側)のカーブを生成、擁壁部天端(外側)のラインを抽出します。

擁壁天端のラインおよび擁壁下辺(外側)を用いて擁壁部のサーフェスを生成します。

では、Dynamo の内容を見ていきましょう。

パラメータの入力

パラメータとして、擁壁天端幅と擁壁の勾配が入力できます。

擁壁部下辺のカーブの生成

先ずは、擁壁部下辺のカーブの生成する下準備として、擁壁部下辺の端点となるポイントを取得します。
今回の例でいうと P4, P5になります。

Dynamo のグラフでは、このようになります。
List.LastItem ノードで、グループ①PolyCurve.Curves ノードで抽出した カーブリストから最後の要素 L4 を抽出し、Curve.StartPoint および Curve.EndPoint ノードで L4 の始点 P4 と終点 P5 を抽出します。

続いて、P1~P5XY平面に投影した PointP1’~P5′ として、
P1′ → P4′ のベクトルを V1
P1′ → P5′ のベクトルを V2
とします。

擁壁天端には幅をつけたいので、その分の調整をするために擁壁部の下辺端部 P5 から V2 の反対方向に擁壁天端幅分移動し、このポイントP6 とします。
P6 を始点、P4 を終点とする円弧を A1 とします。

ここで A1 の始点での法線方向を V1 と設定したいところですが、P4P5 に高低差がある場合では 始点での法線方向を V1 としてしまうと A1 がバンクしまうので、V1 に仰角をつけて調整する必要があります。

そこで、P1と同じXY位置で P5 と同じZ位置を持つ P7 を設定し P7→P4 のベクトルを V1′ とし、これを A1 の始点での接線方向とします。

Dynamo のグラフでは、このようになります。
Point.ByCoordinates ノードを用いて P1′ の XY成分、P5のZ成分から P7 を生成します。
そして、Vector.ByTwoPoints ノードにより P7→P4 のベクトルを V1′ を生成します。


続いて、Geometry.Translate ノードで P5 を移動します。 direction は V2 の方向、distance は CodeBlock -1 をかけた擁壁天端幅を指定していますので、結果として P5V2 の反対方向に擁壁天端幅分だけ移動します。
次に、Arc.ByStartPointEndPointStartTangent ノードで P6 を始点、P4 を終点、P6 での接線方向を V1’ とする円弧 A1 を生成します。

擁壁部のサーフェスの生成

次に、擁壁部のサーフェスの生成に移ります。

A1 を10mオフセットして A2 を生成します。
ここでオフセット量を10mとしていますが、これはとりあえず十分であろうと思われる量で 10m にしています。不具合が出る場合がありましたら、適宜調整して下さい。
次に A2 をZ軸方向に20m移動して A2′ を生成します。

そして、A1A2′ をロフトすることにより五分勾配のサーフェスを生成します。

Dynamo のグラフでは、このようになります。

Curve.Offet ノードで A1 を10m オフセットし、A2 を生成します。
続いて、Geometry.Translate ノードで A2 をZ軸方向に20m移動し A2′ を生成します。

次に A1 A2′ を組みにしてリスト化します。
ここで、Dynamoで1度にモデリングする巻込みが1つならば、単に List Createノードでリストを生成すればよいのですが、複数の巻込みを同時にモデリングする場合は、A1A2’ はリストとして流れてきます。
イメージとしては、
A1のリスト [A1, A1, A1, … ]
A2’のリスト[A2′, A2′, A2′, … ]
List Create
ノードにより [ [A1, A1, A1, … ] , [A2′, A2′, A2′, … ] ]リストが生成され、
List.Transpose ノードにより [ [A1, A2′], [A1, A2′], [A1, A2′], [A1, A2′], … ] となります。

そして、Surface.ByLoft ノードで A1A2′ をロフトして五分勾配のサーフェスを生成します。

擁壁天端のライン(内側)を抽出

続いて、擁壁部の天端のラインを抽出します。
土工部のサーフェスと擁壁部のサーフェスの交差するラインを、擁壁部天端のラインとして抽出します。

Dynamo のグラフでは、このようになります。

Geometry.Intersect ノードで、土工部のサーフェスと擁壁部のサーフェスの交差部をカーブとして抽出します。
これが擁壁部天端のライン(内側)になります。

外側の擁壁天端のラインを抽出

擁壁天端のモデリングには、外側の擁壁天端のラインも必要になります。
本当ならば、内側の擁壁天端のラインをオフセットしたくなるところなのですが、Geometry.Intersect ノードで抽出した カーブは、平面上に収まっていないためオフセットすることができません。

なので、ここは逆転の発想で行きましょう。
ラインをオフセットするのではなく、外側の擁壁部位置に発生させた土工部と擁壁部のサーフェスの交差部を抽出することにします。

外側の土工部のサーフェスは、断面形状をV1の方向に擁壁部天端幅だけ移動し、P1を基点に回転させます。

Dynamo のグラフでは、このようになります。

Geometry.Translate ノードで 断面形状のポリカーブV1 の方向に擁壁天端幅だけ移動します。
続いて、Surface.ByRevolve ノードで P1 を基点にして、移動した断面形状を回転させサーフェスを生成します。

擁壁部外側のサーフェスも、内側のサーフェス同様に作成します。
擁壁部下辺の円弧 A3 は、P5 を始点 P4V1 の方向に擁壁天端幅だけ移動した P8 を終点とし、始点での接線方向を V1′ とします。

Dynamo のグラフでは、このようになります。

Geometry.Translate ノードで P4V1 の方向に擁壁部天端幅だけ移動し P8 を生成します。
Arc.ByStartPointEndPointStartTangent ノードで、P5 を始点、P8 を終点とし、始点での接線方向を V1’ とする円弧 A3 を生成します。


あとは、内側のサーフェスと同じ手順で五分勾配のサーフェスを生成し、外側の土工部のサーフェスと外側の擁壁部のサーフェスの交差するラインを、擁壁部天端の外側のラインとして抽出します。

Dynamo のグラフでは、グループ⑫とグループ⑨がこの処理に当たっています。
内容は、前述のグループ⑧のパートと同じなので解説は省略します。

擁壁天端のサーフェスを生成

次は、擁壁天端のサーフェスを生成します。
擁壁天端の内側のラインと外側のラインを Loft で繋いでサーフェスを生成します。

このとき、断面形状と P5 の位置関係にもよりますが擁壁天端のラインは1~複数のカーブの集合になっていますので、個々の内側と外側の カーブ のペアになるようにリストを生成し、Loftします。

次に、生成した擁壁天端のサーフェスを巻込み毎に1つのポリサーフェスに合成します。

Dynamo のグラフでは、このようになります。

List.Flatten ノードで、擁壁天端ラインの カーブリストを一旦フラットにします。

個々の内側と外側の カーブ のペアになるように リストを調整します。
Create List ノードで
[ [ 内1, 内2, 内3, 内4, 内5, … ], [ 外1, 外2, 外3, 外4, 外5, … ] ]
の形のリストが生成され、
List.Transpose ノードで
[ [ 内1, 外1 ], [ 内2, 外2 ], [ 内3, 外3 ], [ 内4, 外4 ], [ 内5, 外5 ], … ]
の形に調整されます。

次に、Surface.ByLoft ノードで個々の内側と外側の カーブ のペア毎にサーフェスを生成します。

最後に、PolySurface.ByJoinedSurfaces ノードで、生成したサーフェスを巻込み毎にポリサーフェスに合成します。
List.Count および List.Chopノードは、Dynamo の一度の処理で複数の巻込みをモデリングする際に必要になってきます。どのようにリストが変化していくか、実際に Dynamo を実行して観察してみてください。

擁壁のサーフェスを生成

次は、擁壁のサーフェスを生成します。
擁壁天端の外側のラインと擁壁下辺(外側)の円弧Loft で繋いでサーフェスを生成します。

この時、擁壁天端の外側のラインは1~複数のナーブスカーブの集合になっていますが、擁壁下辺(外側)の円弧Loft する際には 擁壁天端の外側のラインを1つのポリカーブに結合する必要があります。

Dynamo のグラフでは、このようになります。

擁壁天端の外側のラインを1つのポリカーブに結合したいのですが、残念ながらナーブスカーブを結合することは出来ません。
そこで、先ず Curve.ApproximateWithArcAndLineSegments ノードを用いてナーブスカーブ線分および円弧により近似します。

次に、近似した複数のカーブPolyCurve.ByJoinedCurves ノードを用いてポリカーブに結合します。ここで、PolyCurve.ByJoinedCurves ノードを2回通していますが、
これは1回目の PolyCurve.ByJoinedCurves で 1つのナーブスカーブポリカーブに変換し、
そして、複数のナーブスカーブから成る場合は、2回目の PolyCurve.ByJoinedCurves で擁壁天端の外側のラインが1つのポリカーブに結合しています。

続いて、List.Flatten、List Create、List.Transpose の一連のノードで、擁壁天端のサーフェスLoft した時と同様に、擁壁天端の外側ポリカーブと擁壁下端(外側)の カーブ のペアになるようにリストを生成し、Surface.ByLoft ノードで Loft します。


巻込みの土工部のモデリング

巻込みの土工部は、グループ④で生成した巻込みの土工部のもととなる回転体(サーフェス)と、グループ⑧で生成した擁壁部の五分勾配のサーフェスに厚みを持たせたソリッドの交差部を抽出します。

この際の五分勾配のサーフェスですが、サーフェスを生成したときの条件によってサーフェスの表裏の向きが異なっています。
五分勾配のサーフェスに厚みを持たせる際に、巻込みの内側に向かってサーフェスに厚みを持たせたいので、サーフェスの表裏の向きを揃えないといけません。

サーフェスが巻込みの内側に向かっているかどうかの判別は、サーフェスの法線方向によって判別することにします。
法線方向の Z 成分が 0 以上なら 巻込みの外側を向いている、0 以下なら巻込みの内側を向いているということになります。
そして、巻込みの外側を向いている場合サーフェスの向きを反転させます。


Dynamo のグラフでは、このようになります。

Surface.NormalAtParameter ノードで、擁壁部の五分勾配のサーフェス(内側)の法線方向を取得します。
Vector.Z ノードで法線方向の Z成分を取得し、値が 0 以下かどうか判断します。
If ノードで、法線方向のZ成分が 0 以下なら擁壁部の五分勾配のサーフェス(内側)そのまま、0 以上なら Surface.FlipNormalDirection ノードで反転させたサーフェスを採択します。

Surface.Thicken ノードで、擁壁部の五分勾配のサーフェス(内側)に 厚みを持たせたソリッドを生成します。ここで厚みは 5mとしていますが、これはとりあえずの値なので、不具合がある場合は適宜調整して下さい。

Geometry.Intersect ノードで、擁壁部の五分勾配のサーフェス(内側)に 厚みを持たせたソリッドとグループ④で生成した土工部のもととなる回転体のサーフェスの交差部を取得します。

PolySurface.ByJoinedSurfaces ノードで取得した土工部のサーフェスを巻込み毎のポリサーフェスに結合します。

これで、巻込みの土工部のモデリングが出来ました。

サーフェスを Civil 3D上にポリメッシュとして生成

これまで生成した巻込みのサーフェスを、 Civil 3D 上にポリメッシュとして生成します。
Dynamo 上で、サーフェスからメッシュに変換する際に、土工部、擁壁部天端、擁壁部が個別のサーフェスになっているとメッシュ変換のポリゴン分割の際に、頂点の位置が揃わない箇所が出てきてしまいます。

Mesh.ByGeometry ノードの torelance, maxGridLines のパラメータで制御できるのかもしれませんが、このあたりの挙動がまだ良く分かりません。

Mesh.ByGeometryノードは 1つのポリサーフェスならばメッシュに変換する際に同じ精度でポリゴン分割されるようなので、土工部、擁壁部天端、擁壁部のサーフェスを巻込み毎に1つのポリサーフェスに結合しておきます。

Dynamo では次のようにします。

List Create ノードで
[ [土工部1, 土工部2, 土工部3,…], [天端1, 天端2, 天端3, … ], [擁壁1, 擁壁2, 擁壁3, … ] ]
というように 土工部、擁壁部天端、擁壁部のリストリストを生成します。
次に List.Transpose ノードで、リストが
[ [土工部1, 天端1, 擁壁1], [土工部2, 天端2, 擁壁2], [土工部3, 天端3, 擁壁3], … ]
という形に調整されます。

PolySurface.ByJoinedSurfaces ノードで、サーフェスを巻込み毎にポリサーフェスに結合します。

最後にこのポリサーフェスCivil 3D上にポリメッシュとして生成します。

まとめ

今回は、擁壁付きの法面巻込みのモデリングに挑戦してみました。
擁壁部の形状を自動で決定するなど、Dynamo らしいモデリング例になったと思いますが、いかがでしょうか。

試行錯誤の末、このようなグラフに至ったのですが、もっと効率のいいやり方がやり方があると思いますので、改善点があればコメントいただけると嬉しいです。

本来であれば、土工部と擁壁天端、擁壁部はそれぞれレイヤを分けて出力したいところなのですが、Dynamo上での サーフェスメッシュ変換の都合上、一つのオブジェクトにしてしまっています。
Civil 3D 上で土工部と擁壁天端、擁壁部のモデルに分けたいときは、ポリメッシュを [EXPLODE] コマンドで 3D面に分割して、然るべきレイヤに仕分けしてください。

また、Dynamo上で、擁壁部が発生しない場合のチェックをしていないので、擁壁部が発生しない場合はエラーが出てモデルが生成されませんがご了承ください。

今回の Dynamo のファイルは、こちらからダウンロードできますのでよろしければどうぞ。

法面、小段、擁壁部のポリメッシュを分けて生成するように Dynamoを改良した記事がありますので、こちらも併せてご覧ください。

コメント

タイトルとURLをコピーしました