こんにちは、ISDです。
前回、Dynamo での擁壁付き巻込みのモデリングをやりました。
しかし、いくつか問題点がありましたので改善したいと思います。
擁壁付き巻込みのモデリング Dynamo の問題点と対応方針
前回の、Dynamo での問題点は以下の通りです。
・巻込み形状の設定によっては、モデリングの結果が意図した結果にならない
・巻込みモデルの土工部および擁壁部が一つのメッシュになってしまう
巻込み形状の設定によっては、モデリングの結果が意図した結果にならない
これは、私の検証不足だったのですが、下図でいうところの 平面に投影された P5, P1, P4 のなす角が90°以下の場合、モデリングの結果が意図した結果になっていませんでした。
対応として、擁壁部下辺の円弧の始点での接線方向を P1,P5 のなす辺と直角に設定することとします。
巻込みモデルの土工部および擁壁部が一つのメッシュになってしまう
土工部と擁壁天端、擁壁部はそれぞれレイヤを分けて出力したいところなのですが、Dynamo上での サーフェス → メッシュ変換の都合上、一つのオブジェクトにしてしまっています。
これは、Dynamo 上で、サーフェスからメッシュに変換する際に、土工部、擁壁部天端、擁壁部が個別のサーフェスになっているとメッシュ変換のポリゴン分割の際に、頂点の位置が揃わない箇所が出てきてしまうため、土工部、擁壁部天端、擁壁部のサーフェスを巻込み毎に1つのポリサーフェスに結合してからメッシュに変換しているためです。
対応としては、以下の方針になります。
① 一つに統合したポリサーフェスから変換したメッシュを三角ポリゴン(サーフェス)に分解
② 各三角ポリゴン(サーフェス)を法面、小段、擁壁、擁壁天端に仕分け
③ 仕分けした各三角ポリゴン(サーフェス)毎に結合し、メッシュに変換
とても、処理が冗長な気もしますが…
一旦、一つに統合したポリサーフェスからメッシュに変換しないとメッシュの頂点位置が揃ってくれないので、このような手順になりました。
Dynamo を改修する
今回は、前回のDynamo を改修していきます。
改修ポイントは
・擁壁部下辺の円弧の始点での接線方向の設定
・統合したメッシュから各要素毎にメッシュを生成
となります。
Civil3DToolkit および MeshToolKit 、Springs のノードも使用していますので、それぞれ のパッケージをインストールしておいて下さい。パッケージ のインストール方法についてはこちらをご参照ください。
使用するノード(今回新しく使用するもの)
Line.ByStartPointDirectionLength
起点、方向、長さを指定して線分を生成します。
Plane.ByThreePoints
指定した3点を含む平面を生成します。
Mesh.Triangles
メッシュを構成する各三角ポリゴンを、サーフェスに変換します。
Mesh.TriangleCentroids
メッシュを構成する三角ポリゴンの中心点を取得します。
Surface.ProjectInputOnto
ジオメトリを、方向を指定してサーフェス上に投影します。
List.IsEmpty
指定したリストが空かどうか判断します。
List.FilterByBoolMask
指定したリストの要素を、対応するブーリアン値のリストをもとに仕分けします。
Math.Abs
指定した数値の絶対値を取得します。
Dynamo のグラフ
ノードを上図のように配置します。
青くグループ化されている個所が、今回改修した個所です。
では、Dynamo の改修部分を順を追って見ていきましょう。
擁壁部下辺円弧の始点での接線方向の設定
前回の Dynamo では、下図でいうところのV1′を擁壁部下辺円弧の始点での接線方向としていました。
V1’ を用いると、 P5, P1, P4 のなす角が90°以上の場合は問題ないのですが、90°以下の場合モデリングの結果が意図した結果になっていませんでした。
これは、P5, P1, P4 のなす角が90°以下の場合、円弧をオフセットされる方向がP1よりも内側に入ってしまうため、擁壁部のサーフェスと土工部のサーフェスが十分に交わらなくなるためです。
これを回避するため、擁壁部下辺の円弧の接線方向をP1,P5のなす辺と直角に設定することとします。
下図でいうところの、V2 を90°回転させたベクトルを V3 とします。
P4 と P5 の高低差分を調整するために、V3 を P4,P5,P7 の3点を含む平面に投影し、これを擁壁部下辺の円弧の接線方向 V3′ とします。
Dynamo のグラフでは、このようになります。
初めの Code Blockでは P4→P5への回転角を元に V2 の90°回転させる方向を判断しています。
Vector.Rotate ノードで V2 を回転させ V3 とします。
続いて、Line.ByStartPointDirectionLength ノードで P5 を基点に V3 の方向に長さ1の線分を生成。
Plane.ByThreePoints ノードで P4,P5,P7 の3点を含む平面を生成し、Curve.PullOntoPlane ノードで線分を平面に投影します。
最後に、Vector.ByTwoPoints ノードで 投影した線分の起点と終点からベクトル V3′ を生成し、これを擁壁部下辺の円弧の接線方向とします。
統合したメッシュから各要素毎にメッシュを生成
前回の Dynamo では、サーフェスからメッシュに変換する際に、土工部、擁壁部天端、擁壁部が個別のサーフェスになっているとメッシュ変換のポリゴン分割の際に、頂点の位置が揃わない箇所が出てきてしまうため、土工部、擁壁部天端、擁壁部のサーフェスを巻込み毎に1つのポリサーフェスに結合してからメッシュに変換していました。
Civil 3D 上で土工部と擁壁天端、擁壁部のモデルに分けたいときは、ポリメッシュを [EXPLODE] コマンドで 3D面に分割して、然るべきレイヤに仕分けすれば対応できるのですが、何かと手間がかかるので、やはり Dynamo 上で土工部と擁壁天端、擁壁部、小段に分割してメッシュを生成させたいと思います。
手順としては、
① 一つに統合したポリサーフェスから変換したメッシュを三角ポリゴン(サーフェス)に分解
② 各三角ポリゴン(サーフェス)を法面、小段、擁壁、擁壁天端に仕分け
③ 仕分けした各三角ポリゴン(サーフェス)毎に結合し、メッシュに変換
となります。
法面、小段、擁壁の仕分け方針
法面、小段、擁壁については、各三角ポリゴンの勾配により仕分けします。
勾配は 1:3.0 および1:0.7 を閾値として
・小段 → 勾配 1:3.0 以下の三角ポリゴン
・法面 → 勾配 1:3.0 ~ 1:0.7 の三角ポリゴン
・擁壁 → 勾配 1:0.7 以上の三角ポリゴン
とします。
各三角ポリゴンの勾配の大きさは、三角ポリゴンの法線ベクトル(単位ベクトルとする)のZ成分から判断します。
擁壁天端の仕分け方針
擁壁天端についてですが、擁壁天端の勾配は1:3.0以下 ~ 1:0.7以上 の、どれでも取りうるので別のアプローチで判断します。
擁壁天端については、各三角ポリゴンの中心のポイントが、1つのポリサーフェスに統合前の擁壁天端のサーフェス上に位置しているかどうかで判断します。
Dynamo のグラフ
一旦結合されたポリサーフェスをメッシュに変換した後、メッシュを三角ポリゴンに分解し、法面、小段、擁壁、擁壁天端に仕分けします。
法面、小段、擁壁、擁壁天端を仕分けするパートの Dynamo のグラフは、下図のようになっています。
大まかな流れとしては、
① メッシュを三角ポリゴンに分解
② 擁壁天端の三角ポリゴンを仕分け、ポリサーフェスに統合しメッシュに変換
③ 残った三角ポリゴンから擁壁の三角ポリゴンを仕分け、ポリサーフェスに統合しメッシュに変換
④ 残った三角ポリゴンから法面の三角ポリゴンを仕分け、ポリサーフェスに統合しメッシュに変換
⑤ 残った三角ポリゴンを小段の三角ポリゴンとして、ポリサーフェスに統合しメッシュに変換
となります。
では、Dynamo のグラフを見ていきましょう。
最初に、メッシュを三角ポリゴンに分解して擁壁天端の仕分けをするパートです。
擁壁天端の三角ポリゴンの仕分け
先ずは、Mesh.Triangles ノードで巻込みのメッシュから三角ポリゴンをサーフェスとして抽出します。
三角ポリゴンのサーフェスを Mesh.ByGeometry ノードでメッシュに戻し、Mesh.TriangleCentroids ノードで 三角ポリゴンの中心のポイントを抽出します。
続いて、Surface.ProjectInputOnto ノードで三角ポリゴンの中心のポイントを統合前の擁壁天端のサーフェスに投影します。
この時、擁壁天端のサーフェス上にないポイントは、投影の結果がEmptyとなっているので、List.IsEmpty ノードにより三角ポリゴンの中心のポイントが擁壁天端のサーフェス上に存在するかが判定されます。
そして、List.FilterByBoolMask ノードにより、三角ポリゴンの中心のポイントが擁壁天端のサーフェス上に存在するかの判定結果を用いて、三角ポリゴンを擁壁天端とそれ以外に仕分けします。
仕分けした擁壁天端の三角ポリゴン(サーフェス)をメッシュに変換し、Civil 3D上にポリメッシュとして生成します。
このパートのグラフの内容は、前回と同様なので解説は省略します。
擁壁部の三角ポリゴンの仕分け
続いて、擁壁部の三角ポリゴンの仕分けのパートです。
擁壁部は勾配 1:0.7が以上(三角ポリゴンの法線のZ成分が 0.5735 以下)となる三角ポリゴンを抽出します。
Surface.NormalAtParameter ノードで、残った三角ポリゴンの法線ベクトルを抽出します。
Vector.Z ノードで法線ベクトルのZ成分を抽出し、Math.Abs ノードでZ成分の絶対値を取ります。
絶対値を取っているのは、三角ポリゴンが上下のどちらを向いているか事前にわからないため、絶対値を取ってZ成分を正の値にしています。
<= ノードで法線ベクトルのZ成分が 閾値の 0.5735 以下かどうか判定し、判定結果のブール値のリストを生成します。
そして、List.FilterByBoolMask ノードにより、Z成分が 0.5735 以下か(三角ポリゴンの勾配が 1:0.7 以上か)の判定結果を用いて、三角ポリゴンを擁壁とそれ以外に仕分けします。
仕分けした擁壁の三角ポリゴン(サーフェス)をメッシュに変換し、Civil 3D上にポリメッシュとして生成します。
法面の三角ポリゴンの仕分け
続いて、法面の三角ポリゴンの仕分けのパートです。
法面は勾配 1:3.0 以上(三角ポリゴンの法線のZ成分が 0.9487 以下)となる三角ポリゴンを抽出します。
処理の流れは、擁壁部の三角ポリゴンの仕分けと全く同じです。
Z成分の判定の閾値が 0.9487 になっています。
List.FilterByBoolMask ノードにより、Z成分が 0.9487 以下か(三角ポリゴンの勾配が 1:3.0 以上か)の判定結果を用いて、三角ポリゴンを仕分けします。
三角ポリゴンの Z 成分が 0.9487 以下ならば法面、残りの三角ポリゴンが小段となります。
最後に、仕分けした法面の三角ポリゴン(サーフェス)と小段の三角ポリゴン(サーフェス)をそれぞれメッシュに変換し、Civil 3D上にポリメッシュとして生成します。
まとめ
前回作成した Dynamo の問題点を改修することによって、巻込みの法面、小段、擁壁部をメッシュを分けて生成することが出来るようになりました。
巻込みの生成については、とりあえずのところ一区切りはついたと思います。
今回の Dynamo のファイルは、こちらからダウンロードできますのでよろしければどうぞ。
コメント