Blender 3.0 の使い方 (17) ジオメトリノード (2)
前 (ジオメトリノード (1)) www.mztn.org 次 (カメラ)
Blender 3.0 のジオメトリノード (2)
Blender のジオメトリノードのチュートリアル動画に Entagma による Blender Geometry Nodes: Vertex Normals - Alien Orb というものがあります。 複数のオブジェクトに対して、それぞれ設定したジオメトリノードが連携して動作するアニメーションの作成方法がわかりやすく解説されています。 Blender のジオメトリノードの利用者の増加に影響しそうな良質なサンプルであると思います。
Blender Geometry Nodes: Vertex Normals - Alien Orb は Blender 2.93 のジオメトリノードを使っているので、 Blender 3.0 のジオメトリノードを使って書き直して、くわしい説明を加えました。 最終的にCyclesでレンダリングした動画です。記事の最後に Eevee版の動画と blend ファイルを置きました。
(この記事とほぼ同じ内容の2.9シリーズ用のジオメトリノードの解説記事(旧版) )
回転して広がる球体の配置
Blender を起動して、デフォルトキューブ(立方体)を選択して、[X]キーで削除します。 オブジェクトモードで、上の図の黄色の球体を生成するオブジェクトとして、「Add / Mesh / Ico Sphere」で球体を追加します。 あまりメッシュを細かくしなくても問題ありませんが、オリジナル を尊重して、細分化レベルを 5 にします。ここで作成した球体の表面に別の小さい球体を配置するために使うため、最終的にはこの球体自身は表示されません。
下側の領域を Geometry Node Editor にします。 このような画面の操作はBlender 2.8 の画面構成 を参考にしてください。
右上のアウトライナーで「Icosphere」をダブルクリックして、オブジェクトの名前を「01_Base」に変更します。 ジオメトリノードを作成するために、ヘッダーリージョンの「New」をクリックします。
「Geometry Nodes」という名前のジオメトリノードができました。 「Group Input」 というノードと、「Group Output」というノードが「Geometry」というソケットで接続されています。 「入力側の物体の形状を、そのまま表示側に出力する」という意味になります。 この間に色々なノードを挿入して、位置や形状を変化させていくことになります。
周りを回る小さい球体オブジェクトの中心となる点を生成するために「Add / Points / Distribute Points on Faces」を選択して「Distribute Points on Faces」ノードを追加します。 このノードは、オブジェクトのポリゴン上にランダムに点を生成する機能を持ちます。
IcoSphere の形状を持つ「Group Input」ノードが「Distribute Points on Faces」ノードで複数の点に変換されるため、Ico Sphere (球体) は消えて、面のあったところに点が現れます。
Density (密度) の値で点の密度が変化し、Density の値を大きくすると、点の数が増えます。
Random から Poisson Disk に変更すると、「Distance Min」で指定した値より近い点が生成されなくなります。ランダムに点を配置した上で、指定した距離より近い点が省かれることになります。
あとから作るジオメトリノードと区別するために、ヘッダーリージョンの「Geometry Nodes」をクリックしてジオメトリノードの名称を「Base」に変更します。
次に「Add / Utilities / Math」を選択して「Math」ノードを追加します。 「Math」ノードは機能を切り替えることができて、ノード名は機能の名前になります。 ここでは加算機能の「Add」という名前のノードになっています。
「Math」ノードは機能名をクリックすると、演算の種類を変更することができます。 ここでは、乗算を意味する「Multiply」を選択します。 今回は他に「Multiply Add」、「Sine」を使っています。
ベクトル演算用の「Add / Vector / Vector Math」も同じようになっているため、ノード名で探そうとすると見つけにくいかもしれません。
「Group Input」の何もつながっていないソケットに「Multiply」ノードを接続すると、「Group Input」のソケットの名称が「Value」に変わります。 「N」キーを押してサイドバーを表示すると、Inputs パネルに「Value」が追加されています。 Name の Value をクリックすると名前を変更できます。
プロパティタブからジオメトリノードモディファイアを見ると、Frame という入力パラメータが確認できます。ジオメトリノードに外から与える Frame というパラメータを追加することになります。
frame をドライバに設定
Frame項目の数値を入力する場所に 「#frame」と入力します。
Frame項目の背景色が変化して、アニメーション実行時のフレーム数と連動 (ドライバ) することになります。 このジオメトリノードのサンプルの心臓部となる部分で、アニメーション実行時のフレーム数からすべてのオブジェクトの運動と色の変化を求めています。 アニメーション用のキーフレームを設定することなく、ジオメトリノードの設定だけで、いろいろな長さのアニメーションを自動的に作成できてしまいます。
タイムラインエディタのフレーム数が、ジオメトリエディタの Frame パラメータと一致するように変化します。 アニメーションを再生すると、フレーム数がジオメトリノードに渡るため、この値を加工して時間の変化に伴った動作をさせることができます。
「Multiply」ノードの右側に「Math」ノードを追加して、演算の種類を「Sine」としてサイン関数を指定します。
「Add / Vector / Vector Math」を選択して「Vector Math」ノードを追加して、演算を「Multiply」、入力側を「Distribute Points on Faces」の normal ソケットにつなぎます。
さらに、「Vector Math」の「Multiply」ノードの入力に「Sine」ノードの出力を接続します。 元の球体 (Ico Sphere) の表面から垂直に外側に向く normal ベクトルに 、 サイン関数の ±1 の範囲の値が乗算されます。 外向きに遠くなったり、近くなったりするベクトル(相対位置) が得られます。
これを「Add / Geometry / Set Position」を選択して追加した「Set Position」ノードの Offset に接続します。 こうすることで、ランダムに配置された点は、元の球体 (Ico Sphere) の表面に垂直方向に、周期的に変化する値を相対位置 (Offset) に加えることになります。
フレーム数を少し変更すると、点の位置は中心に向かって移動することが確認できます。
点の移動速度を遅くするためにフレーム数に 0.05 を乗じています。
このままでは、すべての点が同じような動きとなるため、動きをばらつかせることにします。 フレーム数に定数を乗じた値と、乱数を生成する「Random Value」ノードを加算するため、「Sine」ノードの前に「Math」の「Add」ノードを追加して接続します。
点の位置と動きをバラバラにするため、「Random Value」ノードにπ * 2 (6.283)を設定します。 サイン関数の入力に 0 から 2π の範囲の乱数が加えられるため、これで360度(2π)にばらつく値がサイン関数から出力されます。
点の位置の変化はサイン関数なので ±1.0 の変化となりますが、変化量を小さくできるように、定数を乗算するため「Multiply」ノードを挿入します。
「Group Output」ノードの直前に「Transform」ノードを追加して、最終的に全体に回転を加えることにします。
「Combine XYZ」ノードで、X、Y、Zの各軸ごとに回転角を設定できるようにします。 Z軸が上下方向の軸になるため、X と Y には 0.0 を設定します。
回転の範囲を調節するため、「Combine XYZ」ノードの前に「Map Range」ノードを追加します。
「Map Range」ノードの Value 入力は「Group Input」ノードの「Frame」から接続します。0 から 250 までのフレーム数の変化を 0 から6.28 (2π:1回転) に変換します。 アニメーションのフレーム数が 0 から 250 まで変化する間に360度回転することになります。
スペースキーを押してアニメーションを実行して動作を確認しましょう。
回転して広がる球体の実体(インスタンス)化
これまでに作った回転して運動する点に形状を与えます。 まず、ジオメトリノードを作成するため、Plane オブジェクトを追加します。
識別できればどのような名前でも構いませんが、ここでは Plane オブジェクトの名前を「02_instance」にして、ジオメトリノードの名前を「instance」に設定します。
ジオメトリノードに、右上のアウトライナーから「01_Base」をドラッグして「Object Info」ノードを追加します。 また「Add / Instances / Instance on Points」を選択して「Instance on Points」ノードを接続します。
このオブジェクトに設定するジオメトリノードが、「01_Base」オブジェクトで作成した点の運動に、実体(インスタンス)としての形状(これも球)を関連付けます。「Add / Mesh Primitives / Ico Sphere」から「Ico Sphere」を追加して、「Instance on Points」の Instance ソケットに接続します。 半径は 0.2、細分化は 4 としました。
これで、「01_Base」のジオメトリノードで設定された点の位置に、the_instande の球体が表示され、フレーム数に従って移動するようになります。
中心部で変形する球体
周りを回る小さな球の中心で変形する大きな球体としてオブジェクトモードで Ico Sphere を追加します。 なめらかに変形させるため、細分化レベルは 7 に設定します。大きさは 1m のままです。 球体の名前は「03_displace」とします。
このオブジェクトにもジオメトリノードを追加して、名前を「Displace」にしました。
球体の変形
この球体を周りを回る小さい球との距離に従って表面の色を変えてみます。
- アウトライナーから「01_Base」をノードエディタにドロップして「Object Info」ノードを追加します。
- 距離を求めるため「Add / Geometry / Geometry Proximity」を選択して「Geometry Proximity」ノードを追加します。
- 「Object Info」ノードを「Geometry Proximity」の Target ソケットに接続します。
- ここで求めた距離がどのような値になるか確認するため、「Add / Color / ColorRamp」を選択して追加した「Color Ramp」を「Geometry Proximity」の distance 出力に接続します。
- distance の値の大きさに従って色が変化するように、「Color Ramp」の Color ソケットを「Group Output」の空きソケットに接続します。
- 「GeometryNodes」モディファイアの「Output Attributes」の Color に頂点グループの「Col」という名前を設定します。
シェイダーノードエディタに「Attribute」ノードを追加して、名前を「Col」としてベースカラーに接続します。 これで、ジオメトリノードで出力した色がマテリアルに反映されます。 小さい球に近い部分の表面の色が黒くなることが確認できます。
球体の変形
「Color Ramp」の Color ソケットから出力する値(RGB)を使って、大きい球体の表面を変形させます。 まず、Color ソケットから出力する色 (RGB) の値から、「Separete XYZ」ノードで青色の要素(Z)を取り出します。 「Math」ノードの「MultiplyAdd」を使って、青色の要素の 0 から 1 の変化を ±0.2 に変換して、球体表面から外に向かう Normal ベクトルと乗算して、「Set Position」ノードの Offset ソケットに入力して、球体表面の頂点を距離によって高さを ±0.2 変化させます。
ヘリにギザギザ感があるので、「Group Output」の前に「Set Shade Smooth」を挿入します。 なめらかになっていることが確認できます。
マウスカーソルを「Set Shade Smooth」の上に持ってきて、[M] を押すと「Set Shade Smooth」の機能をミュートできます。 もう一度 [M] を押すともとに戻ります。
マテリアルの設定
02_instance オブジェクトと 03_displace オブジェクトにマテリアルを設定して、それぞれ「Group Output」の直前に置いた「Set Material」ノードでマテリアルを指定します。
パラメータの設定
03_displace オブジェクトのジオメトリノードの「Color Ramp」ノードの色と範囲を変更すると色と形が変化します。 設定した色に含まれる青の要素の量によって高さが変わります。 色々と試してみて下さい。
外側を回る黄色の球体の動きの調節は、乗算する定数で変化します。 左側のノードでは速度、右側のノードでは動く範囲を変更できます。
回転軸を変えるには、オリジナルのように 01_Base のジオメトリノードを変更する事もできますが、カメラ自体を回転したほうが楽です。
ジオメトリーノードのまとめ
小さい球体の数と動きを操作するジオメトリーノード「Base」の全体像です。
小さい球体の形、大きさ、マテリアルを決定するジオメトリーノード「instance」です。
中央の変形する球体の形や色をコントロールするジオメトリーノード「Displace」の構成です。
3つのオブジェクトそれぞれに、簡単なジオメトリノードを設定するだけで複雑な動きをするアニメーションができました。
こちらは Eevee でレンダリングしました。 今回は Cycles でも Eevee でも画質に差はないと思います。
Blender 2.8 - 4.3 の使い方 [目次]
- (01) インストールと日本語化
- (02) 画面構成とモード
- (03) オブジェクトモード
- (04) 球と円柱でモデリング
- (05) スカルプトモード
- (06) 編集モード
- (07) リトポロジー
- (08) Python スクリプト
- (09) マテリアル (1)
- (10) マテリアル (2)
- (11) マテリアル (3)
- (12) アーマチュア(ボーン)
- (13) Rigifyによるリギング
- (14) パーティクルヘア
- (15) グリースペンシル
- (16) ジオメトリーノード (1)
- (17) ジオメトリーノード (2)
- (18) カメラ
- (19) ジオメトリーノード (3)
- (20) 新ヘアシステム Hair Curves
- (21) ヘアカーブの進化
- (22) Vector Displacement Mapブラシ
- (23) アセットライブラリ
- (24) シミュレーションゾーン
- (25) ボーンコレクションとRigify