見出し画像

文系の blender 4.1 はじめての Geometry Node | If 条件分岐

もちろん用途にもよりますが、幸いなことに、プログラムを組むのに必ずしも高度な数学は必要ありません。

プログラムを構成しているほとんどの要素は、比較的単純な、条件分岐(If)と、繰り返し(for, while)です。それだけで、この note のウェブアプリケーションですら主要部分を構築できるでしょう。

そこで、ここでは、ジオメトリノードの条件分岐についての基本を簡単に紹介します。


環境 Blender 4.1.0 , Mac Mini M1 OS 14.4



Node による条件分岐


ジオメトリノードには、If というノードはないが、おもに Comparison(比較)ノードがその代わりになる。

たとえば、ジェームスは単純なひとで、満腹のときは幸せである。これをプログラム風に書くと次のようになる。

If (James's stomach == full) echo 'I feel good' else  'I feel bad' 
(もしかれの胃袋がいっぱいならば、最高だ、そうでなければ、最悪だ、と出力せよ)

これをジオメトリノードで組むと次のようになる。

String | 文字列

文字列を出力。ここではジェームスの胃袋と見立てる。デフォルトではなにも入っていないので空である。

Comparison - Equal  | 比較 - 同じ

比較ノード。ここではデータタイプを String(文字列) とした。左の String ノードから渡される A と、B の文字列を比較し、同じならば true(1)、異なるならば false(0)を出力する。

Switch  | スイッチ

これもデータタイプは String とした。左の比較ノードから渡された値が、true(1) ならば「I feel good」を、false(0) ならば「I feel bad」を出力する。


結果

String to Cuves(文字列のカーブ化)ノードで結果をカーブとして出力できる。

胃袋の String ノードが空なので、気分はよくない。String ノードに、happyなどの文字列を入れても悪いままだが、full と入力すると、

すっかり気分が直る。String ノードが full (満腹)になったためだ。



条件分岐 01


続いて、条件分岐ノードを使い、立方体オブジェクトを操作してみる。

Geometry Node

  • 平面など任意のオブジェクトを追加

  • 上部メニューの Geometry Nodes を選択

  • New(新規)ボタンをクリック

Group Input(グループ入力)はここでは必要ないので削除し、下のノードを組む。

Grid | グリッド

方眼紙のようなマス目(グリッド)を作成できる。ここでは 1 x 1 mの広さに、1 x 10 計 10 のグリッドを設定した。

Instance on Points | ポイントにインスタンス

Grid に設定した各ポイント上に、0.1 m の大きさの Cube(立方体) オブジェクトを配置している。ここでは Instance とは「オブジェクト」とみなしていい。

上のキューブは、左から 0 , 1 , 2, 3 … 8, 9 までの Index 番号が振り当てられている。5番のキューブのみ高さを2倍にする場合、プログラム風は、

if ( index of Cube == 5 ) Height of Cube = 2 

となり、ノードで組むと下になる。データタイプはすべて整数(Integer)

Instance on Points(ポイントにインスタンス)ノードの Scale に接続

流れはジェームスのノードとほぼ同じ。Index 番号が 5 ならば、2を、それ以外は、1 を、キューブのZ軸のスケールに渡している。


OR 分岐


複数の条件を組み合わせたい場合、AND OR を使う。A B のどちらも満たす条件は、A AND B であり、どちらかを満たす条件は、A OR B になる。

Index番号 2 あるいは 5 のキューブの高さを2倍するプログラム風は、

if (index of Cube == 2 OR index of Cube == 5) Height of Cube = 2 

Index番号2 と、5をどちらも満たす(AND)キューブは存在しない。

であり、ノードで組むと下になる。

Math(数式) > Boolean Math(ブール演算) ノードのプルダウンで Or を選択


AND 分岐


Index 番号が 2 以上、かつ、6 以下のどちらの条件も満たすキューブの高さを2倍する場合、プログラム風では、

if (Index of Cube >= 2 AND Index of Cube <= 6) Height of Cube = 2 

となり、ノードでは、下になる。

Greater Than or Equal(以上)、Less Than or Equal(以下)



実験


上の例で、Switch などに渡される Boolean(ブーリアン型、ブール演算子)は、true(真)、false(偽)のどちらかの値をとるが、同時に、true は数値の 1 、false は 0 でも表され、どちらも通用する。

また、0 および 0 以下の負の値は false とみなされ、0.001 など 0 よりも大きくなると true とみなされる。


Truncated Modulo

10 x 10 のキューブを配置した
右は、Instance on Points(ポイントにインスタンス)ノードの Scale に接続


Math(数式)> Truncated Modulo(剰余 切り捨て) は、上では Index値を 3 で割った余りを出す。このため、3 間隔で、 1(true)を出力する。

false ならば、上では 高さ0.1 のキューブが、true ならば、高さ 1 のサイズのキューブが表示されている。


Wrap

Math(数式) > Wrap(ラップ)に Index値を入力、それによって -3.1 〜 1.8 までの値が生成され、ゼロあるいは負の値ならば高さ 0.1の、それ以外は出力値の高さのキューブを表示している。

Wrap が正確にどのようにロジックになっているのかはわたしにはよくわかっていない。

これらの処理は、条件分岐を使わなくても実現できると思われるが、数値でも true, false とみなされることがわかると、ノイズなど関数からの出力による分岐の応用範囲が広くなる。



まとめ


数式が出てくると、マテリアルやライティングの説明にくらべて3倍ほど疲れます。参考になりますでしょうか。間違いがあれば指摘いただければ幸いです。

もちろん蛇足ですが、冒頭のジェームスは、ソウルミュージック界の大御所 James Brown のことで、I feel Good という名曲があります。James Brown - I Feel Good(YouTube)


この記事が気に入ったらサポートをしてみませんか?