CG 日記

modoでレゴや8bitなエフェクト作ってみた


作り方の流れはこんな感じです。
Particle Generatorを使って空間にブロックを等間隔に敷き詰める。
ブロックの「サイズ」はデフォルト状態で0に設定して見えないようにし、Intersectを使ってトーラスの近くと判定したブロックだけ「サイズ」を100%にして現れるようにする。

ブロックの色はバリエーションテクスチャ使用。トーラスのサーフェイス色を拾って、ブロックが単色になるように設定したかったけど上手い方法が思いつかなかった。Raycastノードで拾った色をパーティクルに渡して、リプリケータ側で単色でブロックを塗るように組めるかと思ったけど、シェーダは最終段階で計算されるためかパーティクル計算に割り込めない気がする。

スケマティックはこんな感じです。

少し細かく解説してみます。
まずスケマティックの上の処理は単純です。Particle Generatorで空間にブロックを生成するためのパーティクルを生成しています。
Particle Generatorは直接Particle Simulationに接続できないので、Source Emitterの「パルス」を使用してParticle Generatorが生成するパーティクルから、パーティクルが1個だけ発生するように設定しています。このときパーティクルが移動すると困るので「初期速度」「速度の広がり」を0に設定します。こんな感じ↓

スケマティックの下はトーラスオブジェクトに近いか遠いかを判定してます。
まずParticle Operatorを追加して「位置」「サイズ」を追加します。つぎにトーラスのポリゴンメッシュと、パーティクルの距離をIntersectを使用して判定します。

Intersectはオブジェクトの表面にオブジェクトを沿わせることができる便利なノードですが、今回はパーティクルとポリゴンの距離を測定するのに使用します。
Intersectはマトリクスを使用して計算するノードなので、Particle Operatorの「位置」をMatrix Constructを使ってマトリクスに変換します。
トーラスは移動、回転、スケールをアニメーションさせるので Matrix Composeを使用して移動、回転、スケールを含んだマトリクスにします。Matrix Composeの「マトリクス入力」は接続順で計算するので、スケール、回転、移動の順番でチャンネルをリンクします。

最後にIntersectの「距離出力」をRelationshipを使用して「サイズ」にリンクします。Relationshipのグラフではパーティクルとトーラスの距離が10㎝のとき「サイズ」を100%にするというように設定します。

最初ブロックの表示/非表示にディゾルブを試してみたところ、レンダリングでは反映されるけどビューポートでは表示されたままになって不便だったため、サイズを使用することにしました。

こんな単純なシーンだけどサイズが0でも内部的には全部のメッシュを計算してるようで、ビューポートの動作がとても重いです。こういうところは早く最適化して欲しいですね。

コメントを残す

*