こんにちは ISDです。
前回は、Dynamo を用いて法面の巻込み部を断面形状の単純な回転体でモデリングしてみました。
しかし、お察しの通り、法面の巻込みは単純な回転体のみで対応できるケースはあまり多くありません。
下図のように、巻込みの回転終了側の断面形状の A の点が B の位置にくるように巻込み形状を調整したくなります。
ということで、Dynamo で回転終了側の断面形状の端点の位置を調整できるように対応してみましょう。
Dynamo を用いて断面形状を調整した巻込み部をモデリングする
今回は、Dynamo を用いて、巻込みの回転終了側の端点が任意の位置にくるように調整した断面形状を用いた巻込み部のモデリングしてみたいと思います。
前回作成した、単純な回転体による巻込みをモデリングする Dynamo を改修していきます。
前回の Dynamo に対して、改修するポイントは以下の通りです。
・断面回転終了時のXY軸方向(水平方向)の断面拡大率を算出
・断面回転終了時のZ軸方向の断面拡大率を算出
・巻込み部断面オブジェクトの拡大
・断面位置合わせ用座標系の回転
・各断面を配置してLoft
使用するノード(今回新しく使用するもの)
Point.Z
point の Z 座標を取得します。
Vector.Length
ベクトルの長さを取得します。
Vector.ZAxis
基底 Z軸ベクトル (0,0,1) を取得します。
Plane.ByOriginNormal
指定した基準点および法線ベクトルもつ平面を生成します。
Geometry.Scale
基準点を中心に、XYZ軸に対して不均等に拡大します。
CoordinateSystem.Identity
基準点(0,0,0)、X軸(1,0,0)、 Y軸 (0,1,0)、Z軸 (0,0,1) をもつ座標系を生成します。
CoordinateSystem.Rotate
指定された平面の基準点と法線を中心として、座標系を回転します。
Geometry.Transform
指定した座標系をもとに、ジオメトリを変換します。
PolySurface.ByLoft
Loftによって、指定されたカーブを通過するポリサーフェスを生成します。
Dynamo のグラフ
ノードを上図のように配置します。
青くグループ化されている個所が、今回改修した個所です。
では、Dynamoの中身を順を追って見ていきましょう。
3Dポリラインから巻込みのモデリングに必要な情報を取得
前回と同様に、巻込みのモデリングに必要な情報を Dynamo に渡すために、AutoCAD上で3Dポリラインを作図します。
3Dポリラインの終点が、巻込みの回転終了側の断面形状の端点を持っていきたい位置になるように作図します。
Dynamo の
・3Dポリラインのジオメトリ取得
・巻込みの断面形状の取得
・3Dポリラインから巻込みのモデリングに必要な情報を取得
・巻込みの回転量
のパートは、前回のまま変更ありません。
回転終了側の断面形状の拡大率の算出
巻込みの回転終了側の断面形状の端部が持っていきたい位置にくるように、回転終了側の断面形状のXY軸方向(水平方向)およびZ軸方向(垂直方向)の拡大率を算出します。
回転終了側の断面のZ軸方向の拡大率
下図のように、断面形状の高さを H1 、回転終了側の断面形状の高さを H2 とすると、
H1 = P1.z – P4.z
H2 = P1.z – P5.z
回転終了側の断面の Z軸方向(縦方向)の拡大率を Sz とすると、
Sz= H2 / H1
と なります。
Dynamo のグラフでは、このような流れになります。
回転終了側の断面のXY軸方向の拡大率
続いて、XY軸方向(水平方向)の拡大率を求めます。
P1~P5 を XY平面に投影した Point を P1’~P5′ として、
P1′ → P4′ のベクトルを V1
P1′ → P5′ のベクトルを V2
とします。
回転終了側の断面の XY軸方向の拡大率を Sxy とすると、
Sxy = V2の長さ / V1の長さ
となります。
Dynamo のグラフでは、このような流れになります。
Vector.ByTwoPoints で V1,V2 を生成し、Vector.Length でV1,V2ベクトルの長さを取得します。
断面形状オブジェクトの拡大と配置
断面オブジェクトの拡大
断面形状の XY軸方向、および Z軸方向の拡大率が出ましたので、 配置用に拡大した断面オブジェクトを生成します。
Plane.ByOriginalNormal ノードにより、基点をP1としXY平面に平行な平面を生成し、断面形状オブジェクトを拡大するために、拡大の基準となる平面とします。
Geometry.Scale ノードに、断面形状オブジェクトのジオメトリ、拡大の基点を示す平面、XYZ軸各々の拡大率を設定し、拡大された断面形状オブジェクトを生成します。
また、巻込み部のサーフェスオブジェクトを Loft で生成する際に、
・回転開始側の断面形状
・中間の断面形状
・回転終了側の断面形状
の3つ断面が必要になるので、拡大率を設定している CodeBlock では、事前に算出された回転終了側の断面形状の拡大率を元に
[ 1(回転開始側の拡大率), 中間の断面形状の拡大率, 回転終了側の断面形状の拡大率 ]
となる リストを生成しています。
リストの内容は、
回転終了側の断面形状の拡大率を d とすると
lst = [1, (1+d)/2, d];
となります。
※ このリスト生成のコードは関数化しています。
関数化は、このDynamo のグラフで 複数の巻込みモデルを一度に生成させるために必要でした。
断面形状の位置合わせ
拡大した断面形状を配置するために必要な座標系を生成します。
CoordinateSystem.Rotate ノードで 基点を P1 とし Z軸を回転軸に任意の角度回転した座標系を生成します。
また、Loft には前記の3つの断面が必要になるので、
回転角を設定している CodeBlock では、事前に算出された回転終了側の断面形状の回転角度を元に
[ 0(回転開始側の回転角), 中間の断面形状の回転角度, 回転終了側の断面形状の回転角度 ]
となる リストを生成しています。
リストの内容は、
回転終了側の断面形状の回転角度を d とすると
lst = [0, d/2, d];
となります。
※ このリスト生成のコードも同様に関数化しています。
拡大した断面の配置
では、拡大した断面形状オブジェクトを配置していきます。
Geometry.Transform ノードで、各断面を各位置合わせ用座標系をもとに座標変換します。
Dynamo 上に拡大された3つの断面形状が配置されました。
断面形状のロフト
配置された断面形状をロフトして巻込みのモデルを生成します。
PolySurface.ByLoft ノードで、断面形状をロフトし巻込みモデルのポリサーフェスを生成します。
後は、前回同様にサーフェスからメッシュ変換し、Civil 3D 上に巻込みのモデルを生成します。
まとめ
今回は、巻込みの回転終了側の断面形状を調整し、断面形状の端部位置を任意の点に合わせられるように Dynamo を改修しました。
断面形状の調整量が大きくなると、多少は形状が歪んだりしますが…
LOD200なので、
コマけえことはいいんだよ!
の精神で行きましょう。
今回の Dynamo のファイルは、こちらからダウンロードできますのでよろしければどうぞ。
コメント