Blenderのモーショングラフィックスやアニメの演出、キャラクターの戦闘シーンなどでよく見かける、動いたあとにキラキラとした光の尾がついてくる「ライトトレイル(光の軌跡)エフェクト」。
これ、一見すると作るのがものすごく難しそうに見えますよね。でも実は、Blenderの「ジオメトリーノード」という機能を使えば、自分が描いた線のレールに沿って、光の残像を全自動で発生させることができるんです!
今回は、ノードの呼び出し方から繋ぎ方まで、初心者の方でも100%迷わずに完成できるよう、一から丁寧に解説します!
1. 準備:ベジエカーブのレールと走るオブジェクトを作る
今回は、手作業で1コマずつアニメーションをつけるのではなく、「コンストレイント(制約)」という機能を使って、自分で描いたカーブのレールの上をオブジェクトに自動で走らせます。
🧐 コンストレイント(制約)ってなに? アニメーションにおけるコンストレイントとは、オブジェクトに**「強力な縛りルール」**を与える機能です。今回は「指定したカーブの線上から絶対にハミ出してはいけない!」というルール(パスに追従)を使って、全自動で滑らかな移動アニメーションを作ります。
ステップA:通り道となる「ベジエカーブ」を描く
- 3D画面(ビューポート)で [Shift + A] > [カーブ] > 「ベジエ(Bezier)」 を追加します。
- 追加したカーブを選択して [Tabキー] を押し、「編集モード」 に切り替えます。
- 頂点を動かしたり、押し出し(Eキー)を使ったりして、ウネウネとした好きな通り道の形を作ります。できたら [Tabキー] で 「オブジェクトモード」 に戻します。
ステップB:走らせる「エンプティ」を用意してレールに縛る
- 3D画面で [Shift + A] > [エンプティ] > 「十字(Plain Axes)」 を追加します。
- エンプティを選択した状態で、画面右側にある青いタガ(ベルト)のようなマークの 「オブジェクトコンストレイントプロパティ」 タブを開きます。
- [オブジェクトコンストレイント追加] > 「パスに追従(Follow Path)」 を選択します。
- 設定パネルの 「ターゲット」 のスポイトを使って、先ほど作った 「ベジエカーブ」 を指定します(エンプティがカーブの始点にパッと吸い寄せられます)。
- そのすぐ下にある 「アニメーションパス(Animate Path)」 というボタンをカチッとクリックします。
これで準備完了です!スペースキーで再生すると、エンプティがカーブに沿って自動でスーッと走るようになります。
2. ジオメトリーノードの作成と「位置」の取得
動きの土台ができたので、ここからジオメトリーノードを組んでいきます。まずは「走るエンプティの現在地」をノード側に引っ張ってきましょう。
- 3D画面で新しく [Shift + A] > [メッシュ] > 「平面(Grid)」 など、何でもいいのでベースとなるオブジェクトを1つ追加します。
- それを選択したまま、画面下のジオメトリーノードエディターで [新規] を押します。最初からある 「グループ入力」は今回は使わないので、選択して [Xキー] で削除 しておきます。
- [Shift + A] > [ポイント] > 「ポイント(Points)」 ノードを追加し、最終的な「グループ出力」に繋ぎます(画面の原点に、ただの点が1つ現れます)。
- 先ほど動かしたエンプティの位置情報を取得します。[Shift + A] > [入力] > [シーン] > 「オブジェクト情報(Object Info)」 を追加します。
- オブジェクト欄に 「エンプティ」を指定 し、設定を「オリジナル」から 「相対(Relative)」 に変更します。
- [Shift + A] > [ジオメトリ] > [操作] > 「ジオメトリトランスフォーム(Transform Geometry)」 を追加し、「ポイント」のすぐ後ろ(右側)の線上に挟みます。
ノードを以下のように繋ぎます。
🔌 位置データの接続ルート
- 「オブジェクト情報」の [位置(Location)] ➔ 「ジオメトリトランスフォーム」の [移動(Translation)] へ繋ぐ
これで、エンプティの動きと完全に同期して動く「1つのポイント」ができあがりました!
3. ステップ1:【時間を巻き込む】シミュレーションで軌跡を作る
今のままでは点がただ移動しているだけなので、過去のフレームの点をその場に残して、数珠つなぎの「軌跡(トレイル)」に変えていきます。
- [Shift + A] > [ソルバー] > 「シミュレーションゾーン(Simulation Zone)」 を追加します。画面に「シミュレーションインプット」と「シミュレーションアウトプット」という2つの四角いエリア(箱)が現れます。
- この2つの箱が、メインの一本道を囲むように配置します。
- さらに、[Shift + A] > [ジオメトリ] > [処理] > 「ジオメトリ結合(Join Geometry)」 を追加し、シミュレーションゾーンの中に配置します。
これらを以下のように繋ぎます。
🔌 シミュレーションの接続ルート
- 先ほどの 「ジオメトリトランスフォーム(ジオメトリ)」 ➔ シミュレーションゾーン内の 「ジオメトリ結合」 へ繋ぐ
- 左側の箱 「シミュレーションインプット(ジオメトリ)」 ➔ 「ジオメトリ結合」 へ繋ぐ(これで過去の点が合流します)
- 「ジオメトリ結合」 ➔ 右側の箱 「シミュレーションアウトプット(ジオメトリ)」 ➔ 「グループ出力」
繋いだら、アニメーションをはじめから再生してみましょう。エンプティが通ったあとに、ポイントが消えずにどんどん残って線になっていくのが分かります!
💡 絶対に挫折しない!「最重要3大ノード」の役割と使い分け
いま作ったシミュレーションですが、このままだとポイントが無限に増え続けてパソコンの動作が重くなってしまいます。「古いポイントから順番に消す(寿命)」というシステムを作りたいのですが、ここで初心者が一番つまずきやすい3つのノードが登場します。
役割をイメージしやすい例えで、その本質を完璧に理解しておきましょう!
① シミュレーションゾーン(Simulation Zone)
- 役割: 過去のフレームのデータを消さずに、「時間を進めて記憶し続ける箱」
- 📦 イメージ:タイムカプセル(パラパラマンガのノート) 普通のノードは、1秒先の画面になったら1秒前の形は忘れます。しかし、この箱の中にノードを入れると、「前のフレームで起きたこと」を次のフレームに持ち越して記憶できるようになります。
② 名前付き属性格納(Store Named Attribute)
- 役割: 生まれたポイントに、名前付きの「シール(データ)をペタッと貼る」
- 🏷️ イメージ:生まれたての子に貼る「名札シール」 エンプティが動くたびに、新しい点が次々と生まれます。このノードは、生まれたばかりの点に対して、「お前の名前は『Age(年齢)』だ。生まれたてだから、中身の数字は『0』な!」と、シールを貼り付ける役割をします。
③ 名前付き属性(Named Attribute)
- 役割: 貼られたシールを「じっと見て、現在の数字を読み取る」
- 👀 イメージ:名札をチェックする「検査官」 こちらは貼られたシールを読み取る係です。ノードに「Age」と指定すると、空間にあるすべてのポイントのシールを見て、「この点はAgeが1だな」「こっちはAgeが5だな」と、現在の数字を読みて教えてくれます。
- 格納(Store) は、データを保存する(シールを貼る)側
- 属性(Attribute) は、データを呼び出す(シールを見る)側
と覚えておけば、もうごちゃ混ぜになって迷うことはありません!
4. ステップ2:【寿命を作る】古いポイントを自動で削除する
この3人組チームを使って、「毎フレーム年齢を+1していき、5歳より大きくなったら消去する」というロジックを組みます。
- [Shift + A] > [属性] > 「名前付き属性格納(Store Named Attribute)」 を追加し、シミュレーションゾーンの中の「ジオメトリ結合」のすぐ後ろに挟みます。
- データ型を「フロート」から 「整数(Integer)」 に変更します。
- 名前の欄に 「Age」 と入力します。
- 左側の箱「シミュレーションインプット」の右端にある、新しくできた空っぽの丸ソケットから、いま追加した「名前付き属性格納」の [値(Value)] に線を繋ぎます。
- [Shift + A] > [属性] > 「名前付き属性(Named Attribute)」 を追加します。
- データ型を同じく 「整数(Integer)」 にし、名前の欄に 「Age」 と入力します。
- この「名前付き属性」のすぐ後ろに、右側の箱「シミュレーションアウトプット」へ向かうための足し算ノードを挟みます。[Shift + A] > [ユーティリティ] > [数式(Math)] を追加します。
- 演算を 「加算(Add)」 にし、下の数値を 「1」 にします。
- [Shift + A] > [ジオメトリ] > [書込] > 「ジオメトリ削除(Delete Geometry)」 を追加し、シミュレーションゾーン内の「名前付き属性格納」のすぐ後ろに挟みます。
- [Shift + A] > [ユーティリティ] > 「比較(Compare)」 を追加します。
- タイプを「フロート」から 「整数(Integer)」 に、条件を 「より大きい(Greater Than)」 にし、下の数値を 「5」 にします。
🔌 寿命カウント&削除の接続ルート
これらを以下のように繋ぎます。
- 「名前付き属性(属性)」 ➔ 「数式(上のソケット)」
- 「数式(値)」 ➔ 右側の箱 「シミュレーションアウトプット(下側のソケット)」
- 「名前付き属性(属性)」 ➔ 「比較(A)」
- 「比較(結果)」 ➔ 「ジオメトリ削除(選択)」
アニメーションを再生してみましょう! 無限に増え続けていたポイントが、常に最新の6個だけを残して、古いものからシュッと綺麗に消えていくようになります。大成功です!
5. ステップ3:ポイントを滑らかな「ライトチューブ」にビルドアップする
あとは、この6つの点の並びを、レンダリングできる綺麗な光のチューブに変形させていくだけです。ここからはシミュレーションゾーンの「外側(右側)」で作っていきます。
- [Shift + A] > [ポイント] > 「ポイントのカーブ化(Points to Curve)」 を追加し、シミュレーションアウトプットのすぐ後ろに繋ぎます(点が1本の線になります)。
- Shift + A] > [カーブ] > [処理] > 「カーブのメッシュ化」を次に繋ぎます
- [Shift + A] > [カーブ] > [読み込み] > 「スプラインパラメ−タ−」 をスケ−ルに繋ぎます。
- 断面の形として、[Shift + A] > [カーブ] > [プリミティブ] > 「カーブ円(Curve Circle)」 を追加し、「カーブからメッシュへ」の [断面カーブ] に繋ぎます。
- ※カラ−ランプを使用して太さ調整してください。
これで、立体的なチューブ状のメッシュが完成しました! あとはマテリアルで「放射(Emission)」を設定してあげれば、暗闇でサイバーに輝く、美しいライトトレイルの完成です!
まとめ:今回のロードマップ
今回のライトトレイルエフェクトの仕組みを振り返ると、ジオメトリーノードが「過去の記憶」をどう扱っているかがハッキリ分かります。
- コンストレイント(パスに追従): ベジエカーブのレールにエンプティを縛り付け、滑らかな移動を作る。
- オブジェクト情報 ➔ ジオメトリトランスフォーム: エンプティの位置をリアルタイムでポイントに変換する。
- シミュレーションゾーン + ジオメトリ結合: 毎フレームの位置をタイムカプセルのように「記憶」して重ね合わせる。
- 名前付き属性(格納 & 呼び出し): ポイント1つ1つに「Age(年齢)」という名札シールを貼り、毎フレーム+1して寿命を数える。
- 比較 + ジオメトリ削除: 古くなったポイントを狙い撃ちして削除し、常に一定の長さをキープする。
「動いた軌跡が残る」という派手な演出も、シミュレーションという箱の中で「シールを貼って、年齢を数えて、古いものを消しているだけ」という、詳しく紐解けばシンプルなルールの繰り返しでできているんですね。
ぜひ色々なカーブの形を作って、あなただけの美しいライトトレイルを走らせてみてください!
💡 さらに深い仕組みを知りたい方へ
今回の「シミュレーションのデータ構造」や「アトリビュートの詳しい仕組み」について、さらに一歩踏み込んだロジックの解説は、メインサイトの【補足説明編】で公開する予定です。
