ニッチなblender手記

世の中には自分に似た人が3人いるとされています。その人達へと情報共有するために主にblenderの記事を書いていきます。

loose read about Sverchok documents (Introduction Unit 01)

Unit 01 - Introduction to modular components

prerequisites

ここからの記述は基本的なベクトルと三角法を理解している必要がある。
もし Sverchok を最大限に活用したいと思っていても、数学のバックグラウンドを持っていないのであれば、まずは数学の知識を重ねるか別のアプローチで利用する必要がある。

作者は KhanAcademy のコンテンツをここで提示している。 ただし英語。

Lesson 01 - A Plane

このレッスンで扱うノードは以下の通り。

  • Scalar Math
  • Vector In
  • Number
    • グループ名?、ノード名は A Number
  • Number Range
  • Viewer Draw
  • Stethoschope
  • Simple Topology
  • Vector Math

全て Sverchok のノード

これらのノードを用いて Sverchok のみでblender上へ平面を作成する。
4つのベクトルが必要となるが、それらを数学で定義します。 単位円 (unit-circle) の三角関数を使って、0.5PIの座標を求める。

本家の説明画像リンク

単位円と内包される正方形 (Plane) については以下の通り。


円の外周:{\displaystyle C={2}\pi{r}}=360^\circ \\
単位円の半径:1 \\
外周: {\displaystyle C={2}\pi} \\
内包される正方形の頂点の間隔:\frac{{2}\pi}{4}=0.5\pi=90^\circ

上記のような考えからの場合、最終的には 0, 90, 180, 270 の角度に作れば Plane は作成できる。
しかしその場合は各頂点がXY軸線上に乗っかった形となるので、ビューポート上ではひし形の Plane として生成される。 デフォルトのBlender が作成する Plane オブジェクトのようにするためには45º回転させる必要があるため、始点となる頂点は0*PI=0ºではなく、0.25PI=45ºになる。

そのためには、 Sverchok のノード上でも [0.25π, 0.75π, 1.25π, 1.75π] の頂点群となるように表現する必要がある。
この頂点群の範囲指定には Number Range ノードを用いる。

数学的な説明を書ききるつもりはないので、ざっくりメモ。 ここに関しては 働きアリ the 2nd - math 算数のコツ(18) 円の中の正方形 とか見た方が早い

大雑把な処理の流れ

  1. 頂点を算出
  2. 頂点情報を作成
  3. 頂点を描画
  4. エッジを描画
  5. 面を描画

Making a series of numbers

Add -> Number -> Number Range

f:id:r9aArrowhead:20201127133301p:plain f:id:r9aArrowhead:20201127133307p:plain

デフォルトでは、このノードは 0 - 10 までの数値を 1.0 刻みで生成する。
より正確には 0.0 から 1.0 刻みで数値を 10 個生成する

[0.0, 1.0, 2.0, 3.0.....9.0] 9.0で止まっている点に注意。これは日本語的には「0以上10未満」なので、10は含まれない。 31日までとか言うと31日も含めるから厄介だよね・・・ ちなみにこの挙動は float と int の違いはあれど、 python の range(0, 10, 1) と同じ 内部処理が python だからこうなっているんだろうなと推測 Python Doc - func range Python Doc - typesseq-range

Seeing the output of the Range Float node

Add -> Text -> Stethoscope

f:id:r9aArrowhead:20201127133313p:plain f:id:r9aArrowhead:20201127133318p:plain

あるいは、さきほど追加した Number Range ノードを Ctrl + 右クリック 選択することでも Stethoscope ノードを追加できる。

Sverchok - Stethoscope

Number Range -> Stethoscope とノードをつなぐと、ツリービュー上に Number Range が生成した数値を表示する。
もし数値が見えにくい場合は、 Stethoscope ノードのカラーピッカーで表示色を変更できる。

Stethoscope の表示内容に小数点以下の情報がないが、データ上はちゃんと保持している。 このノードは小数点表示をする際、整数に丸めても問題ない場合(=小数点以下全て 0)ならば整数で表示する。

Setting up the input values of Number Range to generate the 4 multipliers

Number Range ノードに単位円に内包される正方形が持つ頂点位置の情報を設定する

  1. Set the Number Range mode to Step
    • Number Range ノードの modestep へ変更する
  2. make sure the Start value is 0.25
    • 'Start' の値を 0.25 に設定する
  3. Step value is 0.50
    • Step の値を 0.50 に設定する
  4. Set the Count slider to 4 Count の値を 4にする

f:id:r9aArrowhead:20201127133325p:plain

Multiplying the Range by PI

Add -> Number -> Scalar Math

Scalar Math には 円周率計算用のプロパティ (pi * x) があるので、これを Number Range の出力に対して追加する。

f:id:r9aArrowhead:20201127133329p:plain f:id:r9aArrowhead:20201127133337p:plain f:id:r9aArrowhead:20201127133100p:plain f:id:r9aArrowhead:20201127133105p:plain

これによって、2つのノードを経由した値は [0.25, 0.75, 1.25, 1.75] * pi すなわち [0.25 * pi, 0.75 * pi, 1.25 * pi, 1.75 * pi] となる。

Getting the Sine and Cosine of this range

Add -> Number -> Scalar Math

三角関数の計算用に Scalar Math ノードを更に追加して、さっき作成した円周率計算用ノードの output と接続する。
ノードを追加した後で、計算方式を Sin & Cos へと変更する。
Sin & Cos のノードは output が2つあるので、それぞれに Stethoscope を接続して計算結果を出力させると Sin と Cos のそれぞれの計算をしてくれているのが分かる。

f:id:r9aArrowhead:20201127133110p:plain f:id:r9aArrowhead:20201127133116p:plain f:id:r9aArrowhead:20201127133121p:plain

Making Vectors from a range of numbers

Add -> Vector -> Vector In

Vector In ノードで Sin & Cos の出力結果をベクトル値へと変換する。

  1. Cos ( x ) を Vector in の最初の入力ソケットへ接続する。(Xへ接続)
  2. Sin ( x ) を Vector in の 2 番目の入力ソケットへ接続する。 (Yへ接続)
  3. Vector In の3番目のソケット (Z) は空にする。

Vector In ノードは入力ソケットが接続されていない場合、対応する値を 0.0 として扱う。 今回の利用方法だと Z = 0.0 となる

f:id:r9aArrowhead:20201127133126p:plain f:id:r9aArrowhead:20201127133131p:plain

なぜ Scala Math ノードの出力を交差させているかについては割愛。 高校数学の美しい物語 - 三角関数の基本公式

Display Geometry

Add -> Viz -> Viewer Draw

前項の値を見ると、既に [x, y, z] という3D座標に対応した値になったことが分かる。
Viewer Draw ノードを追加すると、ようやく算出した座標を 3Dビューポート上に頂点として出力することができるようになった。

プログラムのように頂点の内部データを見る場合は Stethoscope 、 3Dビュー上で確認したい(=視覚化したい)場合は Viewer Draw を使う必要があることがこれで分かった。

f:id:r9aArrowhead:20201127133137p:plain f:id:r9aArrowhead:20201127133142p:plain

Increasing the Size of the Vertex

Viewer Node ノードにはビューポート上に表示している頂点のサイズや色を変更する機能が備わっている。

f:id:r9aArrowhead:20201127133147p:plain f:id:r9aArrowhead:20201127133152p:plain f:id:r9aArrowhead:20201127133200p:plain

Make some edges

頂点を作成することができたので、エッジを描画していく。
頂点が4つあるので頂点を示すインデックスも [0,1,2,3] の4つが存在する。
この頂点インデックスを [[0,1],[1,2],[2,3],[3,0]] という風に繋いで4つのエッジを生成する。

alt+space でノード検索メニューを表示して top と入力すると、 Topology Simple ノードというノードがヒットするので、それを追加。
追加したノードには EdgeFace というにプロパティがあるので、 Edge の方に以下のコード(頂点インデックスを指定したエッジのトポロジ)を入力する。

# input
# 頂点インデックスの組み合わせを指定している
0 1, 1 2, 2 3, 3 0          <--- easy to input as a human

# produces
# python標準の書き方はこっちだが、これをそのまま入力するとエラーのなるので注意
[[0,1],[1,2],[2,3],[3,0]]   <--- let python worry about the list syntax

f:id:r9aArrowhead:20201127133205p:plain f:id:r9aArrowhead:20201127133210p:plain f:id:r9aArrowhead:20201127133216p:plain

入力が終わった Toporology SimpleViewer Node -> Edges へ接続する。
そうすると、ノードの Vertices で指定した頂点群を利用して、指定したインデックス同士の繋がりをもったエッジがビューポート上に表示される。

f:id:r9aArrowhead:20201127133221p:plain

Make a first Polygon

Topology Simple ノードには Face のプロパティもあることから、面を貼る場合にも利用できる。
ここでは、さっき作ったノードで同時に面も貼る。

Topology Simple -> Face へ 面を貼るために利用する頂点インデックスを指定する。
今回は4つのインデックスがあるので 0 1 2 3 と指定。

そしてViewer Node -> Polygons と接続すれば、ビューポート上に面が表示されるようになった。

ワインディングとかは気にしなくてもいいのかな?

f:id:r9aArrowhead:20201127133227p:plain

Controlling the size of the Polygon

頂点のスケールを変更する方法は複数あり、ここでは Vector Math ノードを用いたスケールアップ方法を記述している。

まず、 Vector -> Vector Math でノードを追加する。
そして、 Vector Math の計算方法を指定するプロパティを Multiple Scalar へと変更。
スカラ値の乗算を処理するようにしたところで、頂点データへ変換している Vector In ノードと接続する。

f:id:r9aArrowhead:20201127133233p:plain f:id:r9aArrowhead:20201127133238p:plain f:id:r9aArrowhead:20201127133242p:plain

Multiple Scalar はデフォルト値が 1 なので、これだけでは頂点データに特に変化はない。
乗算する値を Vector Math のソケットへ直接指定する方法もあるが、プロシージャルということで乗算に用いる値もノードで用意しよう。
そのため、 A Number -> Number ノードを追加してプロパティに値を入力、 Vector Math の2番目の入力ソケットと接続すればビューポート上で Number で指定した値の分だけスケールが変化する。

f:id:r9aArrowhead:20201127133249p:plain f:id:r9aArrowhead:20201127133255p:plain

参考

Sverchok - Introduction to modular components