以下の内容はhttps://hainarashi.hatenablog.com/entry/20250124/1737704491より取得しました。


【Blender】Geometry Nodesで手軽な雲の作り方

※記事製作時のバージョン:Blender4.3

 

今回の記事は、Geometry Nodesを使ってボリューメトリックな雲を簡単に作る方法です。
下の動画のように、シンプルなメッシュ形状を元に、自動で雲を生成できます。

vimeo.com

 

ただ、最初にお伝えしておくと、残念ながらこの手法はあまり実用的ではありません。
理由は・・・

  • 細部の形状が完全にランダムなので、狙った形状に調整するのが難しい
  • 複数の雲を作ると、かなり処理が重くなる
  • 空を作るにはいろいろな種類の雲が必要だけど、この手法では一種類の雲しか作れないので物足りない

といったところです。
ただ、Geometry Nodesとマテリアルの作り方はちょっと面白いと思うので、その記録として記事にまとめました。
なにか皆さんの参考にもなれば嬉しいです。

 

今回作成する手順は次の通りです。
EEVEEをメインに説明しますが、Cyclesでも使えます。

では、さっそく作っていきましょう。

 

Geometry Nodesの設定

1. [Cube]に新規Geometry Nodesを追加します。

 

2.[面にポイント配置(Distribute Points on Faces)]を追加します。
 ※[Shift+A]>[ポイント]>[面にポイント配置]

これでCubeのサーフェス上にポイントが配置されます。
また、元のサーフェスは表示されなくなります。

 

3. [面にポイント配置]の[密度]を[200]に変更して、ポイントの数を増やします。

 

このポイントの位置にランダムな変化をつけます。

 

4. [位置設定(Set Position)]を追加します。
 ※[Shift+A]>[ジオメトリ]>[書込]>[位置設定]

 

5. [ノイズテクスチャ(Noise Texture)]を追加します。
 ※[Shift+A]>[テクスチャ]>[ノイズテクスチャ]

  • 接続:[カラー]>[位置設定:オフセット]
  • スケール:1

これでポイントの位置がランダムに変化します。
しかし、ノイズテクスチャから出力される値は[0~1]の範囲なので、ランダム変化の方向がX, Y, Zのプラス側に偏ります。

 

このランダム変化の偏りをなくして、全方向に変化するようにします。

 

6. [ベクトル演算(Vector Math)]を追加します。
 ※[Shift+A]>[ユーティリティ]>[ベクトル]>[ベクトル演算]

  • 処理:減算(Subtract)
  • ベクトルB:X, Y, Z すべて[0.5]

これで、ノイズテクスチャからの出力が[-0.5~0.5]の範囲に変換されてから[位置設定]に入力されるので、偏りのないランダム変化になります。

 

7. ランダム変化の強さを調整するため、もうひとつ[ベクトル演算(Vector Math)]を追加します。

  • 処理:スケール(Scale)
  • スケール:7

これで、いい具合に散らばったポイント群ができました。

 

このポイントをボリュームに変換します。

 

8. [ポイントのボリューム化(Points to Volume)]を追加します。
 ※[Shift+A]>[ポイント]>[ポイントのボリューム化]

 

9. [ID]と[ランダム値(Random Value)]を追加して、各ポイント毎のボリュームの[半径]にランダムな変化を付けます。
 ※[Shift+A]>[ジオメトリ]>[読込]>[ID]
 ※[Shift+A]>[ユーティリティ]>[ランダム値]

  • ランダム値 最小:0.2、最大:0.3

 

10. [ポイントのボリューム化(Points to Volume)]のパラメーターを調整します。

  • 解像度:サイズ(Size)
  • ボクセルサイズ:0.05

――――――――

【補足】ボリュームの解像度について

Geometry Nodesのボリュームは、空間を立体の格子状に区切って計算します。
この立体格子を「ボクセル(Voxel)」といいます。
ボクセルが細かいほどボリュームも細かく、きれいになりますが、処理も重くなります。

[ポイントのボリューム化]の[解像度]はボクセルのサイズを操作するパラメーターで、[量]と[サイズ]の2種類があり、それぞれ次のように働きます。

  • 量:ボクセルのサイズを相対的に計算します。
     [オブジェクト全体のサイズ]÷[ボクセル量]
  • サイズ:[ボクセルサイズ]の値で、ボクセルのサイズを直接設定します。

今回はメッシュ形状を元に自動で雲を作るのが目的です。
デフォルトの[量]のままだとメッシュ形状を変更した時に、オブジェクト全体のサイズも変わる ⇒ ボクセルのサイズも変わる ⇒ 雲の見た目(ディテールの細かさ)が変わる、と影響してしまいます。
それを防ぐため、[サイズ]に変更しました。

――――――――

 

以上でGeometry Nodesの設定は完了です。
ノード全体を見ると、下図のようになります。
※後で[マテリアル設定]ノードを追加します。

 

次は質感を設定します。
すぐにマテリアルを設定したいところですが、デフォルトの状態では雲の陰影などが描画されないので、まずはライティングとレンダリングの設定をしてボリュームレンダリングの環境を整えます。

 

ライティングとレンダリングの設定

1. レンダーエンジンを[EEVEE]にします。

2. 3Dビューポートを[レンダープレビュー]に切り替えます。

 

3. ワールドに[大気テクスチャ(Sky Texture)]を追加して、[背景]の[カラー]に接続します。
 ※[Shift+A]>[テクスチャ]>[大気テクスチャ]

  • 大気テクスチャ
    • スカイモデル:Hosek / Wilkie
  • 背景
    • 強さ:5

また、デフォルトの[Light]オブジェクトは使わないので削除します。

 

4. サンライトを2つ追加します。

  • Sun
    • 強さ:100(斜め上から)
  • Sun.001
    • 強さ:5(斜め下から)

 

5.[レンダープロパティ>サンプリング>影>ボリュームシャドウ]を[ON]にします。
これで、雲の陰影が描画されるようになります。
※雲の陰影が描画されない場合は、どれでもいいのでオブジェクトを何回かクリックすると描画されるようになります(不具合のようです)。

――――――――

【補足】Blender4.1以前の設定方法

ここまでの設定はBlender4.2以降のEEVEE用です。
4.1以前のバージョンの場合は、次のように設定します。

  • サンライトはボリュームに対して効果がない(照らさない・影もできない)ので、ポイントライトを使う。
    ※スポットライトかエリアライトでもOKですが、ポイントライトの方が光の向きを考えなくてよいので簡単です。
  • 陰影の描画は、[レンダープロパティ>ボリューメトリック>影>ボリューメトリックシャドウ]を[ON]にする。

――――――――

 

以上でライティングとレンダリングの設定が完了しました。

ここまでの操作で、マテリアルを設定していないのにレンダープレビューで雲が描画されています。
どうやらGeometry Nodesから出力されるボリュームは、何もしなくてもデフォルトのボリューム質感で描画されるようです。
しかし、この状態では雲の色や密度などは調整できないので、思い通りの雲を作るためにはマテリアルを設定する必要があります。

 

マテリアルの設定

1. 雲のオブジェクトに新規マテリアルを追加します。

 

2.[プリンシプルボリューム(Principled Volume)]を追加します。
 ※[Shift+A]>[シェーダー]>[プリンシプルボリューム]

  • 接続:[ボリューム]>[マテリアル出力:ボリューム]

また、[プリンシプルBSDF]は使わないので削除します。

 

この時点では、[プリンシプルボリューム]を操作しても雲の質感に反映されません。
雲に反映させるには、Geometry Nodesの方でマテリアルを割り当てる必要があります。

 

3. Geometry Nodesに[マテリアル設定(Set Material)]を追加して、先ほど作成したマテリアルを割り当てます。
※[Shift+A]>[マテリアル]>[マテリアル設定]

これで、マテリアルが雲に反映されるようになりました。

――――――――

【補足】Blender4.1以前の設定方法

ここまでの設定を4.1以前のバージョンで作ると、雲の中にCubeのボリュームが重なって描画されます。
※下の画像は分かりやすいように、雲の隙間とボリュームの密度を調整しています。

 

どうやら4.1以前のバージョンでは、「メッシュの形状に基づくボリューム(※)」と「Geometry Nodesから出力されたボリューム」の2つのデータが混在するようです。
※元のメッシュ形状そのものではなく、バウンディングボックス(メッシュ全体を包む直方体)のボリュームになります。

メッシュの形状に基づくボリュームには一番上のマテリアルスロットが割り当てられるので、次のように対応します。

  • マテリアルスロットを1つ追加して、2つめのマテリアルスロットに雲のマテリアルを作成する(1つめのマテリアルスロットは空っぽのままにしておく)

これで、雲のボリュームだけを描画することができます。

――――――――

 

では改めて、マテリアルの設定を続けます。

 

4.[プリンシプルボリューム]の[カラー]を、[明度(V):1]の白にします。

 

5.[ボリューム情報(Volime Info)]を追加します。
 ※[Shift+A]>[入力]>[ボリューム情報]

  • 接続:[密度]>[プリンシプルボリューム:密度]

この段階では何も変化しませんが、この後テクスチャと合成するための素材として必要になります。

 

6.[数式(Math)]を追加します。
 ※[Shift+A]>[コンバーター]>[数式]

  • 処理:乗算(Multiply)

これで、[数式]の値で雲の密度を操作できるようになります。

 

この段階で密度を上げると、雲にふわふわ感が無いのがよく分かります。

 

次は、ディテールを追加して雲のふわふわ感を表現します。

 

7.[テクスチャ座標(Texture Cordinate)]、[ノイズテクスチャ(Noise Texture)]、[カラーランプ(Color Ramp)]の3つのノードを追加します。
 ※[Shift+A]>[入力]>[テクスチャ座標]
 ※[Shift+A]>[テクスチャ]>[ノイズテクスチャ]
 ※[Shift+A]>[コンバーター]>[カラーランプ]

 

8. この3つのノードを、次のように接続します。

  • [テクスチャ座標:オブジェクト]>[ノイズテクスチャ:ベクトル]
  • [ノイズテクスチャ:係数]>[カラーランプ:係数]
  • [カラーランプ:カラー]>[プリンシプルボリューム:密度]

これで、[ノイズテクスチャ]だけが密度に入力された状態になります。

 

9.[カラーランプ]を次のように設定します。

  • 黒いカラーストップ 位置:0.5
  • 白いカラーストップ 位置:0.75

これで[ノイズテクスチャ]のコントラストが強くなり、全体的にスカスカになります。
これが雲のディテールの素材になります。

 

このディテールを、元の雲の密度に合成します。

 

10.[カラーミックス(Mix Color)]を追加します。

 ※[Shift+A]>[カラー]>[カラーミックス]

  • ブレンドモード:リニアライト(Linear Light)

 

11.[カラーミックス]を、次のように接続します。

  • [ボリューム情報:密度]>[カラーミックス:A]
  • [カラーランプ:カラー]>[カラーミックス:B]
  • [カラーミックス:結果]>[数式:値(上)]
  • [数式:値]>[プリンシプルボリューム:密度]

 

これで、[カラーミックス]の[係数]でディテールの合成具合を操作できるようになります。
[0]はディテールなし。[1]がディテールありです。

 

仕上げに、この係数を操作するためのマスクを作ります。

 

12.[数式(Math)]を追加します。
 ※[Shift+A]>[コンバーター]>[数式]

 

13.[数式(小さい)]を、次のように接続します。

  • [ボリューム情報:密度]>[数式(小さい):値]
  • [数式(小さい):値]>[プリンシプルボリューム:密度]

すると、ちょっと不思議な見た目になります。

 

これが何をしているかというと・・・

Geometry Nodesから出力されたボリュームは「ポイントを中心にした密度[1]の塊」です。
しかしその塊の端でいきなり密度[0]に切り替わるのではなく、表面に「1から0へ減衰する層」を持ちます。
そして[数式(小さい)]は、入力した値に対して、次の値を出力します。

ここでは[しきい値]を[1]にしているので、雲の表面の減衰層は[1]、内部は[0]の値に変換されます。
上の画像のちょっと不思議な見た目の雲は、この変換の結果による、雲の表面を[1]の値が覆う立体的なマスクです。

 

14. このマスクを[カラーミックス]の[係数]に接続します。

  • [数式(小さい):値]>[カラーミックス:係数]
  • [数式(乗算):値]>[プリンシプルボリューム:密度]

これで、雲の表面だけディテールが合成され、雲のふわふわ感が表現できました。

 

以上でマテリアルの設定は完了です。
ノード全体を見ると、下図のようになります。

 

最後に、作りたい質感に合わせて調整します。

 

雲の質感(密度)

途中でも説明しましたが、[数式(乗算)]の[値]で雲の質感(密度)を操作できます。
ふわふわした軽い雲は[1~2]、
雨雲や入道雲などの濃い雲は[3~5]くらいの値にします。

 

雲の色

雲の色はマテリアルではなく、ライトの色で表現します。

 

▼夕焼け空

ライトの色は赤~オレンジ系。強さは日中よりも弱くします。
また、夕日の位置を考えてライトの角度を横向きにします。

 

▼夜空

サンライトのままだと雲全体が照らされ、夜空の雲としては不自然な見た目になるので、ポイントライトに切り替えます。
色は青系が基本。
サンライトとは異なり、雲との距離によって照らし具合が変わるので、強さは適宜調整します。

 

上の見本では背景の空の色もBlenderで設定していますが、背景透過で雲だけレンダリングして、空の素材とコンポジットで合成する方法もあります。やりやすい方法で作成してください。

以上で、できあがりです。

 

補足

ライトの不具合について

途中でも少し触れましたが、Blender4.2と4.3には『ライトの設定変更がリアルタイムで雲の陰影に反映されない』という不具合があります。
「ライトの強さを変えたのに雲の見た目が変わらないぞ?」という場合は、どれでもいいのでオブジェクトを何回かクリックすると反映されます。
4.4では修正されていると良いのですが。
時間があったらバグレポートを提出しようかな・・・

 

[リニアライト]について

[カラーミックス]の[リニアライト]は、『合成色が明るい色の場合は明るく、暗い色の場合は暗くなるように合成する』モードです。
ここでは[ノイズテクスチャ]を合成した結果の雲のコントラストをくっきりさせるために[リニアライト]を使いました。
[乗算]と比べると、雲のディテールがくっきりしているのが分かります。

 

いろいろなブレンドモードの働きについては、こちらのサイトで詳しく解説されています。

知ってるようで知らない、Photoshopの描画モードを全て解説![3/4] | 株式会社ニジボックス

 

拡大すると角ばって見えるんだけど?

今回作った雲をアップで見ると、ボクセルの格子模様が見えてしまいます。

 

Geometry Nodesでボクセルサイズをもっと細かくすることもできますが、変な感じに雲が滑らかになってしまうので、残念ながら使えません。
この手法で作る雲は遠景用と割り切って、「雲の中を進む」というようなアップのシーンは、テクスチャだけで作る方が向いています。

テクスチャだけでボリュームの雲を作る方法は、下の2つの動画が参考になります。

www.youtube.com

 

www.youtube.com

 

Cyclesの場合

ここまでの設定は、すべてそのままCyclesでも使えます。

 

Cyclesはレンダリングに時間がかかりますが、次のようなメリットがあります。

  • 雲のディテールがきれい
  • 空の色が雲に反映される
  • カメラからの距離でレンダリングを制限されない
    ※EEVEEには「カメラからの距離が近すぎる(または遠すぎる)ボリュームはレンダリングから除外される」という制限があります。

ただし、ディテールがきれいすぎるためボクセル形状が見えやすいという欠点があります。
用途に合わせてEEVEEと使い分けてください。

 

以上、「Geometry Nodesで手軽な雲の作り方」でした。

 

twitter

灰ならし (@hainarashi) | Twitter




以上の内容はhttps://hainarashi.hatenablog.com/entry/20250124/1737704491より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14