この記事はGeometry Nodesを触りはじめたときの記録です。その後街を丸ごと自動生成した回と道路と高低差を足した実践編で、「重くなる原因」を時間を測って追いました。そこで分かったことが、この記事の内容の続きにあたるので章として足しています。
Geometry Nodesって何?
最近、BlenderのGeometry Nodesがすごく気になっていて、ついに本腰を入れて触ってみました😊
Geometry Nodesとは、Blender 2.92から搭載されたノードベースのプロシージャルモデリング機能です。簡単に言うと、「ノードと呼ばれるブロックをつないで、3Dモデルを自動的に生成・変形する仕組み」です。プログラムを書かなくてもロジカルにモデルを作れるので、組み込み系エンジニアとしてはなんとなく回路図を書いている感覚に近くて親しみやすかったです。
従来のモデリングは頂点や辺を手作業でいじる必要がありましたが、Geometry Nodesを使えばパラメータを変えるだけで形状がダイナミックに変化します。これが本当に面白い!
基本的なノード構成を理解する
まずはGeometry Nodesの画面構成から確認します。オブジェクトを選択した状態で、上部のワークスペースタブから「Geometry Nodes」を開くか、エディタタイプを「Geometry Node Editor」に変更します。
最初に押さえておきたい基本ノードはこのあたりです。
| ノード名 | 役割 |
|---|---|
| Group Input / Output | ノードグループの入出力。必ず存在する |
| Mesh Primitive(例:UV Sphere) | 基本形状の生成 |
| Transform Geometry | 移動・回転・スケールの変換 |
| Join Geometry | 複数のジオメトリを結合する |
| Instance on Points | 点の上にオブジェクトを複製配置する |
この中でInstance on Pointsが特に強力で、後述する自動配置に大活躍します。
木を自動生成してみた
最初の実験として、シンプルな「木」のような形状を自動生成してみました。幹になる円柱の上に、葉っぱ代わりの球体を複数配置するイメージです。
Points on Facesでランダム配置
まず円柱を用意して、Distribute Points on Facesノードを使って表面にランダムな点を生成します。次にその点の上にInstance on PointsでUV Sphereを配置しました。
【ノードの接続順序】
Cylinder
└─ Distribute Points on Faces
└─ Instance on Points ← UV Sphere を Instance として接続
└─ Join Geometry(Cylinder と合流)
└─ Group Output
これだけで木のシルエットが完成します。DistributeノードのDensityパラメータを上げると葉っぱが増え、下げると減ります。スライダーひとつで見た目がガラッと変わるのが気持ちいい😊
Random Valueでサイズをバラけさせる
全部の球が同じサイズだと不自然なので、Random Valueノードを使ってスケールにランダム性を持たせます。
Random Value(Min: 0.3, Max: 1.0)
└─ Instance on Points の Scale 入力へ接続
これで葉のサイズがバラバラになり、一気に自然な雰囲気になりました。たった数ノード追加するだけでクオリティが上がるのがGeometry Nodesの魅力です。
数学ノードで波打つ地形を作る
次はもう少し発展的な例として、波打つ地形を生成してみました。
Grid(平面メッシュ)を生成してから、PositionノードでXY座標を取得し、MathノードのSine(サイン関数)を使ってZ方向に変位させます。
Grid(Vertices X/Y: 50×50)
└─ Set Position
└─ Offset入力:
Position
└─ Separate XYZ(X成分を取り出す)
└─ Math(Sine)
└─ Combine XYZ(Z成分として渡す)
Sineの周期(倍率)を変えると波の細かさが変わり、振幅を変えると山の高さが変わります。パラメータをアニメーションに繋げばさざ波が動く海の表現もできます。これは組み込みで言うとPWM制御みたいな感覚で、数値をいじると動作が変わる楽しさがありますね。
Attribute Statisticsでデバッグする
Geometry Nodesを組んでいると、「なぜかうまく動かない」という場面が出てきます。そんなときに便利なのがAttribute StatisticsノードやViewerノードです。
| デバッグ方法 | 使いどころ |
|---|---|
| Viewerノードをつなぐ | 途中のジオメトリの状態をビューポートで確認できる |
| Attribute Statistics | 数値の最大・最小・平均値を確認できる |
| Spreadsheetエディタ | 各頂点・面の属性値を一覧で見られる |
特にViewerノードはとても便利で、ノードチェーンの途中に挿しておくだけでその時点のジオメトリを確認できます。どこで意図しない変形が起きているか一目でわかるので、デバッグが格段に楽になりました。
【その後】「重い」には2種類あって、伸び方が正反対だった
ノードを組んでいくと、そのうち動きがもたついてきます。このとき「重い」と一言で言ってしまいがちですが、測ってみるとまったく別の2つが混ざっていました。
| 再計算 | 描画 | |
|---|---|---|
| いつ起きる | 数値を変えたとき | 視点を回したとき |
| 何をしている | ノードをたどって形を作り直す | できた形を画面に出す |
| 効くもの | ノードの数と処理の中身 | ★インスタンスの数 |
| 測り方 | depsgraph.update() の時間 | wm.redraw_timer の時間 |
この2つを分けて測ったところ、いちばん意外だったのがここでした。
- 画面に出る面の数が4割減ったのに、描画時間は2.3倍に増えた
面の数を減らせば軽くなる、というのが直感だと思います。ところが実際には逆でした。GPUにとっての負担は、面が何枚あるかより「いくつの物体を、何回に分けて描くよう指示されるか」で決まります。街のように同じ建物を大量に並べる場合、この「指示の回数」=インスタンスの数が支配的になります。
Geometry Nodesで重くなったとき、まず疑うのはポリゴン数ではなくインスタンスの数です。「点をたくさん置いて、そこに物を並べる」という作り方をしているなら、点の数がそのまま描画の重さになります。
【その後】ノードの実行時間は、隣のノードに計上されることがある
もう1つ、測って初めて分かったことがあります。地面の起伏に建物を載せるために Raycast というノードを使ったのですが、これが重いだろうと思って測ってみると——
- Raycastノード自体の実行時間は 0.1ミリ秒未満
- そのぶんの重さ(約15ミリ秒)は、隣の Set Position に計上されていた
理由は、Geometry Nodes の「フィールド」という仕組みにあります。Raycast が返しているのは計算結果そのものではなく「こう計算してね」という指示で、実際に計算が走るのは、それを受け取った側です。だから時間は受け取ったノードに乗ります。
これを知らないと、ノードの実行時間だけを見て「Raycastは軽い」と誤解します。重い処理を探すときは、フィールドがどこで実際に評価されているかまで追う必要があります。
入れる位置で結果が変わる
実践編では、地面に起伏をつける Set Position を枝分かれの前に置くか、後に置くかで結果が変わりました。建物と道路の2本に枝分かれしている構成で、後ろに置いたところ道路だけが起伏に乗らず、空中に取り残されるという状態になりました。
ノードは「つながっていれば同じ」ではありません。どの枝を通っているかが、そのまま結果になります。
【その後】軽くするときの選択肢と、その代償
重さの正体が分かると、対処も選べるようになります。実践編で試した中でいちばん効いたのが「実体化」でした。並べたインスタンスを、本物のメッシュに変換する操作です。
| 操作 | 描画 | 再計算 |
|---|---|---|
| 実体化(Realize Instances) | 10.1倍 速くなった | 3.6倍 遅くなった |
つまり実体化は「軽くする操作」ではなく、再計算を犠牲にして、描画を買う操作です。どちらを取るかは作業の段階で変わります。
- 数値を触りながら形を詰めている段階 → 実体化しない(再計算が速いほうがよい)
- 形が決まって、視点を回して確認する段階 → 実体化する(描画が速いほうがよい)
- 書き出す直前 → 実体化する(どのみち実体が要る)
作りながら覚えたのは、「軽くする」ではなく「どちらを速くしたいのか」を先に決めるということでした。ノードを組むのが楽しいのは変わりませんが、重くなってきたときに手が止まらなくなります。
まとめ:プロシージャルモデリングは楽しい
今回はGeometry Nodesの基本的な使い方から、木の自動生成・波状地形の作成までを試してみました。感想としては、「ロジックを組む楽しさとモデリングの楽しさが同時に味わえる」という感じで、エンジニア気質の人にはかなりハマれる機能だと思います。
特に以下の点が気に入りました。
- パラメータを変えるだけで形が変わるので試行錯誤が速い
- ノードが視覚的なのでロジックを把握しやすい
- 一度作ったノードグループを別のプロジェクトで再利用できる
- アニメーションと組み合わせると表現の幅が一気に広がる
次はCurve系のノードを使って蔦のような有機的な形状を自動生成してみたいと思っています。Blenderはまだまだ奥が深いので、引き続き探求していきます😊
同じくGeometry Nodesに挑戦している方がいれば、ぜひ問い合わせから情報交換しましょう!
実測した環境
Mac 完結。Apple M4 / メモリ32GB / Blender の Geometry Nodes。計測日は 2026-05-17 です。
この記事の内容は、すべてこの環境で実際に手を動かして確かめたものです。⚠機材や版が変われば結果も変わります。
⚠この回はmacOSと各ソフトの版を記録していませんので、書けるところまでにとどめています。
それでは、今回はここまで。ありがとうございました😊