2019年10月13日日曜日

【Alias + Dynamo】SurfaceのUVを使ったグラデーションパターンを作ってみた


AliasとDynamoのチュートリアルが一通り終わったので、まずはUVを使ったパターンの再現にチャレンジしてみました。

ざっと作った手順を紹介します。

Step.1 事前準備


・このような、三枚のサーフェス上にパターンを配置することを想定します。

・連続してつながっているサーフェスをAliasで事前に作ります。

・UVを使うためには基本的に一枚のサーフェスにする必要があるため、この三枚のサーフェスを一枚にまとめる(近似面を作成する)作業から進めます。

Step.2-1 近似面の作成


・サーフェスの上端、下端のエッジからDuplicate CurveとAttachを使って二本のカーブを抽出し、それらを選択した状態でDynamoウィンドのSendボタンをクリックします。


・すると上図のような感じでDynamoに取り込まれます。

Step.2-2 近似面の作成


・取り込んだ二本の曲線をそれぞれ取り出し、カーブの長さを0から1の範囲で10分割した数列を作成します。

・作った数列を曲線のパラメータとして使い、カーブ上の点を求めます。このやり方でカーブを9分割に等分する点を求めることができます。

Step.2-3 近似面の作成


・Step.2-2で求めた点の、最初と最後は必要がないので取り除きます。

Step.2-4 近似面の作成


・Step.2-3で求めた点をそれぞれ直線で結びます。
 ※点の配置が逆の場合は、上図のようにreverseを挟みます。

・準備の段階で作成したサーフェス三枚をインポートし、直線を投影して面上にきっちりのせます。
 ※今回は、投影方向をX方向にしていますがお好みで。

・投影した曲線を結合して8本のポリカーブにしたかったのですが、今回は結合できなかったのでいったんAliasにbakeして、手作業でつなぎました。
 ※うまくつながった人は上図のまま進めてください。

Step.2-5 近似面の作成


・Aliasで結合した曲線と、冒頭で準備したサーフェスの左右両端の曲線、合計10本を取り込みます。

・10本の曲線が端から順番に並んでいない時は、10本の曲線の端点の座標(今回はY座標)を求め、ソートで順番に並ぶ機能を割り当てると綺麗に並びます。

・サーフェスを張る時は、曲線のCVが等間隔に並んでいないとうまく張れないので、リビルドカーブを使いたいところですが見当たらなかったので、今回は0から1まで10分割した数列を曲線上の点のパラメータとして求め、Nurvs Curveを引きました。

・最後はLoftで面化すれば近似面の完成です。

Step.3 近似面を縦に分割するアイソカーブの作成


・Step.2で作成した近似面を縦に均等に分割するためのアイソカーブを作成します。

・Getisolineノードを使いますが、分割する数に1を加えた数で0~1を等分する数列を作成し、parameterにさします。isoDirectionは、UとVのどちらかが0でもう片方が1です。作る環境に合わせて、どちらかを指定します。

step.4 近似面を縦に分割


・Step.3で作成したアイソカーブで近似面を分割します。

・アイソカーブのうち、上端と下端は必要がないので取り除きます。

・取り除いたカーブでサーフェスを分割したいのですが、GrasshopperでいうところのSulf Splitコンポーネントが見当たらないので、ここはPythonでノードを代用します。

Step.5 横に分割するアイソカーブの作成


・先ほど作成した縦分割面を、今度は横に分割するアイソカーブを引きます。

・使うノードは前回と同じくgetisolineですが、isoDirectionが異なります。

・すべてのサーフェスが分割できるよう、getisolineのノードのLacingをCross Productに変更するのを忘れずに。

Step.6 個別サーフェスの作成


・これまでの手順で作成した縦分割線、横分割線を使って個別にサーフェスを張り、76個のサーフェス(今回の場合)を生成します。

・ここで重要なのは、縦分割線と横分割線の、中身のリスト構造です。これがうまくかみ合わないと、望む答えが出ませんので、ChopノードとUse Levelを使って帳じり合わせします。
 ※リスト構造の考え方がプログラミング的な難しさの代表格ですが、ほぼ必須の部分でもあるので、苦手な人はまず紙に書き出して、どのような処理がなされているか、よく理解してみてください。

・pythonでは、カーブの組み合わせを二本ずつ作るのが目的です。

<上側>


<下側>


 ※Pythonについても、Grasshopperでは必要性があまりないのですが、Dynamoでは必須に近いアイテムです。基礎を覚える段階ではスルーしても構いませんが、中級にさしかかった当たりから少しずつ覚えていくことをおすすめします。

Step.7 徐変量の計算


・次に、サーフェスを徐々に狭くする割合と、面直に押し出す高さを徐々に高くする割合の2種類の数値を計算します。

・Step.6で求めたサーフェスのうち、どれか1行分を取出した後、リストの長さ(すなわち面の数)を計算し、その数までの、1ずつ増える数列を作成します。

・RemapRangeノードで上限と下限の間にリマップした数列を2種類、作成します。UV用と高さ用です。

・UV用のほうは、0から0.5の範囲に抑えておきます。

Step.8 徐変のためのアイソカーブを作成


・サーフェスを徐々に狭くするためのアイソカーブをもとめていきます。

・Step.6で求めた個別のサーフェス、手順⑦で求めたUV範囲、Step.3で設定した縦分割数をもっていきます。

・個別サーフェスはtransposeを使い、横列方向から縦列方向に転換します。

・UV範囲はwatchで中を見るとフラットな構造なので、Chopコマンドで個別の階層に分けます。その後、それぞれが縦分割数の数になるようOffrepeatedItemで増やします。
 ※Use Levelsを1にする必要があります。

・getisolineを使って、個別の各サーフェスに対し、4本のアイソカーブを作成します。U方向とV方向で、0から1に向けてずらす方向と1から0に向けてずらす方向の、合計4本です。

・作成した4本のアイソカーブをtransposeノードで元の構造に転換し直し、平たんな階層にしてからCreateノードで一つのノードにまとめます。

Step.9 個別サーフェスのカット作業


・Step.6で求めた個別サーフェスを、手順⑧で求めた、徐変させたアイソカーブでカットしていきます。

・階層のつじつま合わせをしたあと、Pythonノードで処理していきます。

Step.10 高さ方向の徐変量の計算


・このタイミングで、高さ方向の徐変量を計算します。

・Step.7で求めた高さのノード階層はフラットなので、Chopノードで個別階層にしたのち、Offrepeateditemで縦の数だけ増分させ、transposeで縦横転換しておきます。

Step.11 立体化_1


・Step.9で求めた、徐々に狭くなるサーフェスの中心点を求め、法線方向を求めます。

・同時に、各サーフェスのエッジを抽出し、結合してポリカーブ化します。これを法線方向にある程度の距離で移動させます。

・さらに、各エッジの端点(ここではスタート点)を求め、縦横に転換したあとで最初の点が最後にも入るよう挿入します。

・さらに、各サーフェスの中心点を、手順⑩で求めた数値にしたがって法線方向にそって移動させます。

Step.12 立体化_2


・Step.6で求めた個別サーフェスをFlattenで平たん化し、Step.11である程度の距離で移動させたポリカーブを法線方向に投影して面上線を作成します。

・この面上線で個別サーフェスをSplitノードで分割し、Getitematindexノードで0か1のどちらかを指定するとカットしたサーフェスが選択できます。

・Step.11で法線方向に移動させた中心点と、縦横に転換したエッジのスタート点を直線で結び、ByRuledLoftノードでピラミッド型のサーフェスが張られます。

Step.13 完成


・最後に色をつけたら完成です。

如何でしょうか。一通り使ってみたうえでのGrasshopperとの比較ですが、色々と不満がありまして正直なところ、使いづらいですね。

ノードの機能が微妙に足りないので、そこをPythonで補うわけですがパターンの数が多くなると処理に時間がかかり、頻繁に動作停止に陥るとか、バグがあります。

リストの構造も操作がしにくく、結局はPythonで組んだ方が早くて簡単なんですが、それだとビジュアルプログラミングの良さが無くなる方向なんですよね。

AliasとDynamoはそもそも別々のソフトウェアで、生い立ちが違うものを無理やりくっつけているような感じなのである意味、仕方のない部分もあるかもしれませんが、今後のアップデートで改良されていくとは思いますので、それに期待しましょう!

0 件のコメント:

コメントを投稿

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

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