loose read about Sverchok documents (Introduction Unit 01)
- Unit 01 - Introduction to modular components
- prerequisites
- Lesson 01 - A Plane
- 大雑把な処理の流れ
- Making a series of numbers
- Seeing the output of the Range Float node
- Setting up the input values of Number Range to generate the 4 multipliers
- Multiplying the Range by PI
- Getting the Sine and Cosine of this range
- Making Vectors from a range of numbers
- Display Geometry
- Increasing the Size of the Vertex
- Make some edges
- Make a first Polygon
- Controlling the size of the Polygon
- 参考
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) については以下の通り。
上記のような考えからの場合、最終的には 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) 円の中の正方形 とか見た方が早い
大雑把な処理の流れ
- 頂点を算出
- 頂点情報を作成
- 頂点を描画
- エッジを描画
- 面を描画
Making a series of numbers
Add -> Number -> Number Range
デフォルトでは、このノードは 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
あるいは、さきほど追加した
Number Range
ノードをCtrl + 右クリック
選択することでもStethoscope
ノードを追加できる。
Number Range -> Stethoscope
とノードをつなぐと、ツリービュー上に Number Range
が生成した数値を表示する。
もし数値が見えにくい場合は、 Stethoscope
ノードのカラーピッカーで表示色を変更できる。
Stethoscope
の表示内容に小数点以下の情報がないが、データ上はちゃんと保持している。 このノードは小数点表示をする際、整数に丸めても問題ない場合(=小数点以下全て 0)ならば整数で表示する。
Setting up the input values of Number Range to generate the 4 multipliers
Number Range
ノードに単位円に内包される正方形が持つ頂点位置の情報を設定する
- Set the Number Range mode to Step
Number Range
ノードのmode
をstep
へ変更する
- make sure the Start value is 0.25
- 'Start' の値を 0.25 に設定する
- Step value is 0.50
Step
の値を 0.50 に設定する
- Set the Count slider to 4
Count
の値を 4にする
Multiplying the Range by PI
Add -> Number -> Scalar Math
Scalar Math
には 円周率計算用のプロパティ (pi * x) があるので、これを Number Range
の出力に対して追加する。
これによって、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 のそれぞれの計算をしてくれているのが分かる。
Making Vectors from a range of numbers
Add -> Vector -> Vector In
Vector In
ノードで Sin & Cos
の出力結果をベクトル値へと変換する。
- Cos ( x ) を Vector in の最初の入力ソケットへ接続する。(Xへ接続)
- Sin ( x ) を Vector in の 2 番目の入力ソケットへ接続する。 (Yへ接続)
Vector In
の3番目のソケット (Z) は空にする。
Vector In
ノードは入力ソケットが接続されていない場合、対応する値を0.0
として扱う。 今回の利用方法だと Z = 0.0 となる
なぜ
Scala Math
ノードの出力を交差させているかについては割愛。 高校数学の美しい物語 - 三角関数の基本公式
Display Geometry
Add -> Viz -> Viewer Draw
前項の値を見ると、既に [x, y, z]
という3D座標に対応した値になったことが分かる。
Viewer Draw
ノードを追加すると、ようやく算出した座標を 3Dビューポート上に頂点として出力することができるようになった。
プログラムのように頂点の内部データを見る場合は
Stethoscope
、 3Dビュー上で確認したい(=視覚化したい)場合はViewer Draw
を使う必要があることがこれで分かった。
Increasing the Size of the Vertex
Viewer Node
ノードにはビューポート上に表示している頂点のサイズや色を変更する機能が備わっている。
Make some edges
頂点を作成することができたので、エッジを描画していく。
頂点が4つあるので頂点を示すインデックスも [0,1,2,3]
の4つが存在する。
この頂点インデックスを [[0,1],[1,2],[2,3],[3,0]]
という風に繋いで4つのエッジを生成する。
alt+space
でノード検索メニューを表示して top
と入力すると、 Topology Simple
ノードというノードがヒットするので、それを追加。
追加したノードには Edge
と Face
というにプロパティがあるので、 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
入力が終わった Toporology Simple
を Viewer Node -> Edges
へ接続する。
そうすると、ノードの Vertices
で指定した頂点群を利用して、指定したインデックス同士の繋がりをもったエッジがビューポート上に表示される。
Make a first Polygon
Topology Simple
ノードには Face
のプロパティもあることから、面を貼る場合にも利用できる。
ここでは、さっき作ったノードで同時に面も貼る。
Topology Simple -> Face
へ 面を貼るために利用する頂点インデックスを指定する。
今回は4つのインデックスがあるので 0 1 2 3
と指定。
そしてViewer Node -> Polygons
と接続すれば、ビューポート上に面が表示されるようになった。
ワインディングとかは気にしなくてもいいのかな?
Controlling the size of the Polygon
頂点のスケールを変更する方法は複数あり、ここでは Vector Math
ノードを用いたスケールアップ方法を記述している。
まず、 Vector -> Vector Math
でノードを追加する。
そして、 Vector Math
の計算方法を指定するプロパティを Multiple Scalar
へと変更。
スカラ値の乗算を処理するようにしたところで、頂点データへ変換している Vector In
ノードと接続する。
Multiple Scalar
はデフォルト値が 1
なので、これだけでは頂点データに特に変化はない。
乗算する値を Vector Math
のソケットへ直接指定する方法もあるが、プロシージャルということで乗算に用いる値もノードで用意しよう。
そのため、 A Number -> Number
ノードを追加してプロパティに値を入力、 Vector Math
の2番目の入力ソケットと接続すればビューポート上で Number
で指定した値の分だけスケールが変化する。