はじめに
これはSverchokのjson exampleにある建物の例の1つで、ProfileBuilding.jsonというファイルに保存されている内容。
今回はこのデモファイルを読み解き構造を理解する
全体像
- 少しわかりやすくする為、窓とそれ以外(コンクリート)の部分のマテリアル設定を行っている
- フレームの色も目立たない黒色から明るめのグレーにしている
- 下に見えるノードツリーは5つのフレームが見えるそれぞれの内訳は左から
- 断面作成
- 基本の型作成
- 一番下の面と一番上の面以外を選択
- 面の差し込み
- マテリアル適用
となっている。これを順番に見ていく
断面作成
まずこの建物は階数が9ありそれぞれを隔てる為の面が10あると考えられる。
そこで最初のフレームを見てみると下の図のようになっている。
- 左端にある5つの Number Rangeの Countがすべて10という事で各階を隔てる部分を生成していると予想できる。
10個の数列を5個作成してすべてProfile Parametric ノードに渡している。
- このノードはSVGのような記法で辺が作れる。
そしてここでの出力結果は下の図の通り
10個の閉じた辺が重なり合っている
基本の型作成
– Number Range で0 から 13.96を10分割した配列を生成し Vector InのZに接続しており下記のような結果になる。
[[(0.0, 0.0, 0.0), (0.0, 0.0, 1.5511111153496637), (0.0, 0.0, 3.1022222306993275), (0.0, 0.0, 4.653333346048991), (0.0, 0.0, 6.204444461398655), (0.0, 0.0, 7.755555576748319), (0.0, 0.0, 9.306666692097982), (0.0, 0.0, 10.857777807447647), (0.0, 0.0, 12.40888892279731), (0.0, 0.0, 13.960000038146973)]]
断面作成で作成した10個の辺があり、それぞれ順番に上記の位置に配置する為、Matrix Applyをおこなっている。
Matrix Applyで頂点配置後に UV Connection で縦方向に頂点を結び新しく面を作成している。
ここでの結果
一番下の面と一番上の面以外を選択
このフェーズと次のフェーズはセットみたいなもので一番上の面と一番下の面を除いた面に面を差し込み窓を作成する。
ここではまず一番上と下の面を見つけ2つをあわせたMaskを生成してそれを反転させることで、上下を除く面を選択している。
Select mesh elements By locationは位置的な条件で頂点・辺・面を選択するノード。モードが By Sideになっているため指定した側を選択する。
そしてDirectionが (0, 0, 1)
と(0, 0, -1)
になっているのは頂上と底面を意味している。
ちなみに FacesMaskの出力は上のSelect mesh elements by locationを見てみると、下記のようになっている。
[false,false,false,false,false,false,false,false,false,false,false,false,false, false,false,false,false,false,false,false,false,false,false,false,false,false, false,false,false,false,false,false,false,false,false,false,false,false,false, false,false,false,false,false,false,false,false,false,false,false,false,false, false,false,false,false,false,false,false,false,false,false,false,false,false, false,false,false,false,false,false,false,false,false,false,false,false,false, false,false,false,false,false,false,false,false,false,false,false,false,false, false,false,false,false,false,false,false,false,false,false,false,false,false, false,false,false,false,false,false,false,false,false,false,false,false,false, false,false,false,false,false,false,false,false,false,false,false,false,false, false,false,false,false,false,false,false,false,false,false,false,false,false, false,false,false,false,false,false,false,false,false,false,false,true]
- 155個ある面の選択状態で False が選択しておらず、Trueが選択する事を意味している
- ここでは一番最後の面のみ True となっている
この配列と底面を選択する配列を OR でつなぐことで合わせた配列を生成している。
その結果を NOT演算ですべてを反転させ頂点と底面を除く全ての面を指定。
- select mesh elements by location について簡単にまとめたものがあるので、興味があれば見てみてください
面の差し込み
inset face で面を差し込んでいる。Verts(頂点)とFaces(面)は Base Formで生成した時の頂点と面が接続されている。
Face maskに接続されているのはこの前のステップで生成した Maskを接続している。
これによって頂点と底面を除いた面に対し面の差し込みを実行している。
出力する際にMaskを In にしておけば入力された面のマスクを次に引き継ぐ事が可能で、ここでそれが意味するのは頂点と底面の除く面であり、最終的に窓に該当する面となる。
MaskをInにしてそのMaskを次の Inset FacesのMaskに渡し窓の部分にのみ差し込みが機能するようにしている。
ここではThickness 0で面を差し込まずに Depthを指定し、窓の部分を奥に凹ませている。
※depthの影響
マテリアル適用
- Inset faces の結果を BMesh Viewer に接続することでオブジェクト化している
- material_idxによって2つのマテリアルを割り当てている、1つはコンクリートの部分、もう一つは窓の部分
- BMesh Viewer の material_idxが期待するのは面ごとに割り当てるべきマテリアル index の番号
- Inset faces のMaskから出力される値は 1(True) または 0(False) の配列
- True = 窓を Index 1 としてそれ以外を 0 するため Switch 演算が使われ 1(True), 0(False) を 1,0に変換している
- MaskとSwitchの結果が同じため意味はないと思われるが、他の番号にも変換できる為、変換例として示してくれていると思われる。
終わり
- BMesh Viewer について簡単にまとめたものがあるので、興味があれば見てみてください
最後に
profileってプロフィール?プロファイル?そしてどういう意味?となった。というのもファイル名が Profile Building であり、最初のFrameにもProfileと名前がつけられている。
調べた結果プロフィールはイタリア、プロファイルは英語らしい。どちらも意味はそこまで変わらないみたいだけど、普段使われているプロフィールというのは今風に言うと誰かのスペックみたいなイメージがある。
わからないこともないけど違うような気がして調べてたら断面図というのがあった。この意味に違いないということで断面図を採用。