2023年3月19日日曜日

【Grasshopper_77】順番がずれてしまったデータをそろえる各種方法

今回のテーマはタイトルにある通り、データの順番をそろえる様々な方法を紹介したいと思います。

Grasshopperは計算能力を活用したモデリング手法であるため、必然的にたくさんのサーフェスや曲線を扱うことが多くなります。

その際に、扱うデータの位置関係が端から順番に並んでいることが理想であり、データを様々な形に加工する上でのやりやすさが段違いとなります。ところが、自動車の造形面のほとんどの部位では複数の自由曲面で構成されており、ここに曲線を投影したりすると、その位置の順番がずれてしまう場合があります。

そうなってしまうと、それ以降の工程でのデータ作成がうまくいかず、その対策に時間ばかりが過ぎてしまい、にっちもさっちもいかなくなる、なんてことにもつながります。そのような場合にうまく挽回する方法をいくつか紹介したいと思います。

1.点の座標値を使ってデータの順番を揃える

・例として、縦に5個並べた四角形をX軸方向に15列並んだ場合を考えます。縦列ごとにパスの階層が分かれている状態です。

・今回はJitterコンポーネントを使ってわざとランダムに入れ替えてますが、上の図では各列ごとの0番目の四角形が赤色のサーフェスとなっており、ずれてしまっている状態です。

・このケースの対処法ですが、まずは四角形の中心点を求め、Deconstructコンポーネントにつないで座標値をX、Y、Zそれぞれに分解します。今回のケースではY座標値をSort Listコンポーネントにつなぎ、小さい数値から大きい数値にむかって数値が並ぶように四角形を順番に整列させます。

・Sort ListコンポーネントはK入力側が参照する数値データ、A入力が実際に揃えるデータをつなぎますので間違えないようにします。サーフェスやカーブ、点など何でも揃えることができます。

2.点の座標値を使って行ごとに階層を分ける

・今度は最初のケースとは逆のパターンですが、階層に分かれていない四角形を横行ごとに分けるやり方です。

・1と同じく四角形の中心点を求めて、Deconstructコンポーネントにつないで座標値を分解します。このケースでは、Y座標値を用いて揃えていきますが、Y座標値の小数点以下は省いたほうがより正確に分けることができますので、Text Splitコンポーネントにつないで"."の左右の数値を取り出し、List Itemコンポーネントの0番目を指定して整数値のみにします。

・Create Setコンポーネントは数値のダブりを無くす状態にする機能です。この後ろにEqualityコンポーネントにつないでTrueもしくはFalseの状態にして、最後にCull Patternコンポーネントにつないで分解すると横行ごとに階層を分けることができます。


3.ポリサーフェスに投影したカーブの向きを揃える

・複数のサーフェスを一つに結合したBrepに曲線を投影すると、場所によって向きが反転してしまうケースがあります。こうなると、この後の工程でLoftを使ってサーフェスを張ったりする時に面がねじれてしまいます。

・これを防ぐ方法は、Flip Curveコンポーネントにつないで向きをそろえるやり方です。投影前のカーブの向きをガイドとするためG入力につなぎ、投影後の曲線をC入力につなげばOKです。パスの階層合わせのため、G入力をGraftに設定しておきます。

4.Brep上の法線ベクトルを求める

・Brepはサーフェスを一つに結合した状態のデータですので、投影する際に便利なデータ形式ではありますが、サーフェスの法線ベクトルを求める時はどうすれば良いのかという話です。

・おすすめのやり方ですが、BrepをひとまずDeconstruct Brepコンポーネントにつないで構成するサーフェスに分解します。その次に、面上の点に対し、分解したすべての構成サーフェスまでの最短距離をSurf Closest Pointコンポーネントを使って求め、D出力から取り出した最短距離をSort Listコンポーネントにつないで最小値から順番に並べます。

・求めたい法線ベクトルの対象サーフェスは距離が0のサーフェスになりますので、List Itemコンポーネントの0番目を指定してUV座標値とサーフェスを取り出し、Evaluate Surfaceコンポーネントにつないで法線ベクトルを求めることができます。

5.投影した四角形を分解した時の辺の順番を揃える

・今回も投影絡みの話ですが、平面上の四角形(閉曲線)をBrepに投影し、DiscontinuityとShatterコンポーネントを使って4つの辺に分解したとき、その4辺の順番が上の図のようにずれる場合があります。このケースも、この後のデータ作成に影響してしまいますね。

・対処法ですが、投影して4つに分解した状態の辺を、まずは投影元の平面上にいったんProjectコンポーネントにつないで戻します。

・平面に戻した曲線の中点を求め、まずはX座標値を使って揃えます。これでひとまず0番目と3番目が左辺と右辺のどちらかに揃います。

・次に、1番目と2番目の辺とその中点のY座標値を取り出し、同じくSort Listコンポーネントにつないで揃えます。1番目と2番目がそれぞれ上辺と下辺のどちらかに揃うことになります。最後にMergeコンポーネントにつないで一つにまとめると、辺の順番がそろった状態になります。

6.分割したサーフェスの片側を選択する

・適当な形の四角柱(赤色)をSplit Brepコンポーネントにつないで分割し、曲面(グレー)よりも手前側を選択したいと考えたとします。分割に使うBrepによっては、上の図のようにList Itemコンポーネントを使って片方を選択してもアベコベになってしまい困る場面があります。

・このようなケースでは、分割したサーフェスをAreaコンポーネントにつないで面積を求め、Sort Listコンポーネントにつないでその面積値を小さい方から順番にそろえることで、どちらか片方をきれいに選択することができます。

7.抜き勾配の角度の向きを揃える

・ラストは抜き勾配の角度の向きをそろえる方法です。AsToolプラグインの中に含まれているFrange Vectorコンポーネントを使って面上線から指定した方向及び指定した角度で抜き勾配面を作る際、上の図のように抜き角度の向きが反転する場合があります。(わかりやすいように2個だけにしています)

・対処法ですが、作成した抜き勾配面の下端部の端点をどこか一か所選択し、面上線とともに最寄りの作業平面に投影します。角度の向きが異なる場合、投影した端点が同じく投影した面上線の内側と外側に分かれることになります。

・Point In Curveコンポーネントにつなぐと片方がTrue、もう片方がFalseに分かれますのでCull Patternコンポーネントを使って面上線を二つに分類し、どちらか片方を今度は角度をマイナス方向に変更した状態で再度Frange Vectorコンポーネントにつないで抜き勾配面を作成したら両者の形状がそろうことになります。

以上が簡単なデータをそろわせるやり方です。要点は、点の座標や曲線の長さ、サーフェスの面積やUV座標などを使って数値的に順番に整列させる方法をうまく利用するということです。これ以外にもいろんなやり方があると思いますので工夫してみてください。

0 件のコメント:

コメントを投稿

【Grasshopper_98】SporphとSurface Morphingの特徴、違いなどについて

今年もまたGWに突入しましたね。コロナ明けに円安、インバウンド特需のおかげで東京から郊外に出かけると例年以上に混雑に巻き込まれそうなので、昨年と同様、連休中は家に籠ってブログを更新します。今回のテーマは、Surface MorphingとSporphの違いについてまとめてみました。