作り方の流れはParticle Generatorを使って空間にブロックを等間隔に敷き詰める。
ブロックの「サイズ」をデフォルト状態で0に設定して見えないようにし、Intersectを使ってトーラスの近くと判定したブロックだけ「サイズ」を100%にしています。
ブロックの色はバリエーションテクスチャ使用しています。トーラスのサーフェイス色を拾って、ブロックが単色になるように設定したかったけど上手い方法が思いつかなかった。
スケマティックはこんな感じです。
少し細かく解説してみます。
スケマティックの上の処理は単純で、Particle Generatorで空間にブロックを敷き詰めるためにパーティクルを発生させています。
Particle Generatorは直接Particle Simulationに接続できないので、Source Emitterの「パルス」を使用してParticle Generatorが生成するパーティクルから、パーティクルが1個だけ発生するように設定しています。このときパーティクルが移動すると困るので「初期速度」「速度の広がり」を0に設定します。こんな感じ↓
スケマティックの下の部分はトーラスオブジェクトにパーティクルが近いか遠いかを判定してます。
まずParticle Operatorを追加して「位置」「サイズ」を追加し、つぎにトーラスのポリゴンメッシュと、パーティクルの距離をIntersectを使用して判定します。IntersectデフォルトではTypeがLineになっているので、Surfaceに変更します。
Intersectはオブジェクトの表面にオブジェクトを沿わせることができる便利なノードですが、今回はパーティクルとポリゴンの距離を測定するのに使用しました。
Intersectはマトリクスを使用するので、Particle Operatorの「位置」をMatrix Constructを使ってマトリクス型に変換します。
トーラスは移動、回転、スケールをアニメーションさせるので Matrix Composeを使用して移動、回転、スケールを含んだマトリクスにします。Matrix Composeの「マトリクス入力」は接続順で計算するので、スケール、回転、移動の順番でチャンネルをリンクします。
最後にIntersectの「距離出力」をRelationshipを使用して「サイズ」にリンクします。Relationshipのグラフではパーティクルとトーラスの距離が10㎝のとき「サイズ」を100%にするというように設定します。
最初ブロックの表示/非表示にディゾルブを試してみたところ、レンダリングでは反映されるけどビューポートでは表示されたままになって不便だったため、サイズを使用することにしました。
サイズが0でも内部的には全部のメッシュを計算してるようで、ビューポートの動作が重いです。こういうところは早く最適化して欲しいですね。