Tips

Discrete Particles for Modo の使用方法

アイテムを重ならないように散布できるプラグイン「Discrete Particles」のメモです。使用バージョンは1.0です。
一部の設定を変更しないと機能が意図したように動作しなかったので、調べたこと残しておきます。

 

Discrete Particlesとは

Discrete Particlesは高速なパッキングアルゴリズムを使用して、メッシュの表面、またはメッシュのボリューム内にパーティクルを生成するプラグインです。
Replicatorを使用してアイテムを複製するときに、アイテム通しが重ならないようにパーティクルを生成できます。

modo標準の機能で例えると、Surface Particle Generatorの機能強化版です。

 

例えば下の画像は、ブーリアンとモーフィングを適用したメッシュにパーティクルを発生させる例です。

 

Surface Particle Generatorを使用すると、オブジェクト通しが重なります。またブーリアンでメッシュのトポロジーが変わる場合、パーティクルがランダムに生成されます。

 

Discrete Particlesはオブジェクトが重ならないようにパーティクルを生成します。また、テクスチャの投影のような仕組みになってるので、トポロジーが変わってもパーティクルの生成が安定しています。

また、Packing ModeにAABBを使用すると、デフォーマでサイズを変更してもオブジェクトが重ならないようにパーティクルが生成されます。

 

Chaosを使用するとパーティクルサイズをよりランダムにできますが、 パーティクル生成がランダムに変化してしまいます。

WhiteNoiseを使用するとパーティクルサイズをよりランダムにしながら、アニメーションしても大丈夫なようです。

 

 

使用方法

アイテム構成

Discrete Particlesをインストールするとアイテムが4つ追加されます。基本的に「Surface Distribution」「Volume Distribution」を追加して使用します。

  • Ray Domain
  • Ray Projection
  • Surface Distribution
  • Volume Distribution

 

Surface Distributionはメッシュの表面にパーティクルを散布するアイテムです。
Volume Distributionはメッシュのボリューム内にパーティクルを散布するアイテムです。

Ray DomainとRay Projectionはテクスチャロケータと同じ役割で、散布に使用するレイのプロジェクションタイプを指定するアイテムです。
Surface DistributionやVolume Distributionを追加すると、Ray DomainやRay Projectionは自動的に追加されます。

 

パーティクル生成

Surface DistributionやVolume Distributionを使用する場合は、アイテムの「Surface(Mesh)」「Volume(Mesh)」に散布用のメッシュを接続します。

 

サンプル見ずに使ってみたところ、一部の設定を変更しないと機能が意図したように動作しませんでした。疑問に思った設定をまとめておきます。

  • 「Sample Mode」 は「RayCast & Pack」に変更します。デフォルトだと「Preview」になっていてサーフェースやボリュームに散布されません。
  • 「Weight Map」を使用する場合は「WeightMap Blend」を1.0に変更します。デフォルトの0のままだと何も変化がありません。
  • Discrete Particlesでは「原型となるアイテム(プロトタイプ)」は1mを基準に動作します。1mより大きいとメッシュに重なりが発生します。

 

 

プロパティ

Discrete Particlesはドキュメントがないようなので、プロパティのツールチップを翻訳してみました。

 

Surface Distribution

Point Sampling

Sample Mode

4種類のサンプルモード

  • Preview : 投影ギズモ上のパーティクルを、MinSizeをパーティクルサイズとしてサンプリングします。
  • Raycast : MinSizeをパーティクルサイズとして、メッシュサーフェス上のパーティクルをサンプルし、レイキャスします。
  • Preview & Pack : MinSizeからMaxSizeまでのパーティクルサイズを使用して、プロジェクションギズモ上でパーティクルのサンプルとパックを行います。
  • Raycast & Pack : MinSizeからMaxSizeまでのパーティクルサイズを使用して、メッシュサーフェス上のパーティクルをサンプル、レイキャスト、パックします。
Backface Culling

バックフェイス ポリゴンのサンプリングが有効な場合は無視します。

Distribution

パーティクル分布の一様性

  • BlueNoise R2(一様)
  • Blue-Noise Hammersley (半統一)
  • WhiteNoise PSRand (ランダム)
Packing Mode

AABB = 軸方向に整列したバウンディングボックス (Axis Aligned Bounding Box)
AABBオプションを使用すると、プロトタイプをSurface DistributionとReplicatorノードに同じ順序でリンクする必要があります。

Point Count

頂点数。

Multiplier

Point Count * Multiplier はパーティクルの総数に相当します。
平面プロジェクションでMultiplierを1.0とした場合、ボックスプロジェクションではボックスの各面で同じパーティクル密度を得るために6.0に設定する必要があります。

Point Size

GLで描画するパーティクルの大きさ。

Point color

パーティクル色です。

 

Particle Settings

Prototype Domain

1.0mの原型基準領域を表示し、原型のサイジングの参考にできます。

Prototype Scale

パッキングアルゴリズムは、プロトタイプのサイズが1m以下であることを想定しています。プロトタイプのサイズをエレメントレベルで設定するか、このスケーリング値でスケールを調整してください。

Weight Map

ウェイトマップ。

MaxSize

パーティクルがサーフェースでサンプリングできる最大サイズ。

MinSize

パーティクルがサーフェースでサンプリングできる最小サイズ。

WeightMap Blend

ウェイトマップに基づいてパッキングパーティクルサイズを制御します。
値0.0はオフ。1.0は最大ブレンドに相当します。

Chaos

サンプリング中に各パーティクルが得るサイズのばらつきを制御します。
0.0ではパッキングアルゴリズムはデフォルトで各パーティクルのサイズを最大化しようとします。

Packing Distance

パーティクルサイズに比例して、パーティクルとパッキングボーダーの間に距離を追加します。
MaxSizeを大きくすることで縮小するパーティクル径を補うことができます。

Shrink Spacing

パーティクルを縮小し、パーティクルのパッキング境界線に間隔を作ります。

Post Sizing

ポストエフェクトとして、グラデーションに応じたサイジングを適用します。
グラデーションの左側が小さいパーティクル、右側が大きいパーティクルです。

Normal Alignment

サーフェース法線に対するパーティクルの向きのアライメント。値0.0はオフで、デフォルトはY-Up。

Surface Offset

サーフェス法線に基づいてパーティクルをオフセットします。

Display Packing

GLパッキングモードの描画。

PackMode color

パッキングモードの色です。

 

Performance Statistics

Enable

3Dビューポートのパフォーマンス統計情報を表示します。

Vertical Offset

垂直オフセット。

 

Volume Distribution

多くのプロパティがSurface Distributionと共通なので、Volume Distributionにあるプロパティだけ書いておきます。

 

Particle Settings

Packing Distance

パーティクル径に比例した充填距離。MaxSizeを大きくすることで縮小するパーティクル径を補うことができます。

Volume Constraint Mode

Shrinkモードは内包するメッシュと交差するパーティクルを縮小します。
Removeモードは内包するメッシュと交差しているパーティクルを削除します。

Volume Constraint

値を大きくすると内包するメッシュと交差するパーティクルを収縮させます。
1.0の値は交差が発生しないことを完全に保証するものではありません。

Normal Alignment

パーティクルの向きを最も近いポリゴン法線に揃えます。
0.0 を指定するとパーティクルは Y-Up 方向に整列します。

 

サンプルファイル

Discrete Particlesには11個のサンプルファイルが入ってます。
コメントノードにプロパティの解説やチュートリアルが書かれてるので、テキストを翻訳してみました。

 

1_Introduction.lxo

Discrete Particles は、Surface Distribution と Volume Distribution というパーティクルシステムを実装しています。これらは、DEX/Discrete Particlesセクションのアイテム追加ポップアップで見つかります。

これは、Discrete Particles システムを正しく動作させるために必要な基本的/最小限のノードの設定です。
以下のいずれかのノードのリンクを切断すると、パーティクルシステムは状態の評価を停止します。
Volume Distributionの設定は、Ray Projection 項目の代わりに Ray Domain 項目を使用する以外は同じです。

ただし、Ray Projectionアイテムの代わりに Ray Domainを使用します。Ray ProjectionとRay Domainを使用するため、シーンにDistributionアイテムを追加する必要があります。
Ray Projection と Ray Domain アイテムは自動的に追加されます。
先に進む前に「ロケータの表示」が有効になっていることを確認してください。

チュートリアル
  1. Ray Projectionアイテムをクリックし、Projectionドロップダウンリストから様々なプロジェクションタイプを試します。
  2. Planar projectionに戻します。
  3. Surface Distributionの項目をクリックし、そのプロパティフォームとチャンネルのツールチップを見ます。
  4. 半径 0.5m の球体を Prototype meshに追加し、アイテムリストで可視性をオフに設定します。
  5. シーン内の紫色の破線領域は、プロトタイプのサイズ制限を定義する 1m 単位の立方体です。
  6. この領域の外側にあるすべてのポリゴンは、重なりが発生する可能性があります。場合によってはプロトタイプをドメインより大きくしても良い場合があります。例えば平面上に高層ビルを詰め込むような場合です。
  7. Surface Distributionをクリックし、プロパティフォームで異なるSample Modesを試します。
  8. ツールチップを読んで、4つの異なるSample Modesが何をするのか理解してください。
  9. サンプルモードを Preview に戻します。
  10. Distributionのドロップダウンで3つの異なるDistributionを試します。そのツールチップを読んでください。
  11. サンプルモードを「Raycast & Pack」に設定します。
  12. Ray Projectionアイテム(ギズモ)を選択し、移動/回転/スケール変換を試します。
    次に、Surface Distributionシステムの様々な設定で遊んでみてください。
    Packing Modes については、別のチュートリアルで説明します。AABB モードを使用するには、最初にプロトタイプメッシュをSurface DistributionアイテムのAABBプロトタイプスロットに接続する必要があります。
    (AABBはAxis Aligned Bounding Boxの頭文字を取ったものです)。
  13. アイテムリストのSurface Tutoralフォルダの可視性をオフに設定します。
  14.  Volume Distribution を使って、同様のノード設定を行います。Volume Tutorial フォルダにアイテムを配置します。

チュートリアル終了

 

 

2_Surface_Packing_Modes.lxo

 

3_SurfaceDistribution_Falloff_example.lxo

この例ではBlend Falloff を使って、アニメーションするプロシージャルテクスチャをフォールオフフィールドに「変換」しています。
リニアフォールオフはテクスチャフォールオフとブレンドされます。
Ray Projectionはボックスプロジェクションモードに設定され、Surface Distribution パッキングモードはCircularに設定されています。

アニメーションをリアルタイムで見るには、タイムラインをスクラブしてください。

  • Distribution は完全にランダムな結果を生成するWhiteNoise PSRandに設定されています。
  • BlueNoise R2 は最も均一な結果を生成します。
  • BlueNoise Hammersley は「半」アンフォーム分布で、R2に比べてあまり均一な結果を生成しません。

 

 

4_SQUARE_vs_CUBE_Packing.lxo

スクエアvsキュービックパッキング

手順

  1. ノードグラフを調べます。
  2. SkyScraperプロトタイプメッシュの可視性をオンに設定します。
  3. SkyScrapersの下部が紫色のプロトタイプドメインの中央にどのように配置されているかを観察します。
    また、その上に拡張されます。パッキングはドメイン内のポリゴンのみを考慮します。
  4. SkyScraperプロトタイプメッシュの可視性をオフに設定します。
  5. タイムスライダーをフレーム70にドラッグします。
  6. SkyScraperの底面が平面ポリゴン上に完全に配置されていることを確認します。
  7. Surface Distributionを選択し、Packing modeをCubicに設定します。
    パックされたパーティクルのgl-drawing以外の違いは見られないはずです。
  8. Normal Aligmentを1.0に設定して、パーティクルが表面の湾曲にどのように整列するかを確認します。
  9. 次にSquare と Cubic パッキングモードを切り替えて、違いに注意してください。

結論
Normal Aligment を使用すると、Cubic パッキングによって曲面がオーバーラップする可能性が低くなります。Squareパッキングは少し高速で平らな面で使用する必要があります。

 

 

5_Volume_Packing_Modes .lxo

 

6_VolumeDistribution_Falloff_example.lxo

この例ではBlend Falloff を使用して、アニメートされたプロシージャルテクスチャをフォールオフフィールドに変換しています。
RayDomain は Box projection モードに設定され、Volume DistributionのPacking modeは Spherical に設定されています。

アニメーションをリアルタイムで見るには、タイムラインをスクラブしてください。

  • パーティクル分布は、最も均一な結果を生成するBlueNoise R2に設定されています。
  • BlueNoise Hammersleyは「半」アンフォーム分布で、R2よりも均一でない結果を生成します。
  • WhiteNoise PSRandは、完全にランダムな結果を生成する擬似ランダム分布です。

 

 

7_CUBE_vs_AABB_Packing_and_Transforms.lxo

Cubic vs AABB パッキングとトランスフォーム

AABBとは、Axis Aligned Bounding Boxの頭文字を取ったものです。

  • キュービック=黄
  • AABB = 緑

このチュートリアルでは、どちらのボリューム分布も VolumeMesh アイテムと Prototype アイテムを共有しています。
XYZのすべての寸法がちょうど1mなので、UnitCubeと名付けました。
Locatorアイテムはこの設定とは関係ありません。このチュートリアルのヘルパーとして機能するだけです。
Distributions は X 軸上で +/-1m 移動し、両者を離しています。

Distributions (Raycast mode)は、ボリュームメッシュやプロトタイプとは独立して動かすことができます。
シーンでの評価は、Ray Domain トランスフォームによって決定されるからです。同じルールが、Surface Distribution アイテムとRay Projectionアイテムにも適用されます。

 

チュートリアル
  1. シーン内のオレンジ色のロケータをクリックし、「Normal Aligment」チャンネルを開きます。
  2. Cubicパッキングが、すべてのバウンディングボックスの XYZ 寸法をどのように保持するかを観察します。
  3. AABBパッキングが、Replicatorのバウンディングボックスを動的に更新する様子を観察します。
  4. Particle Countを増やし(このチュートリアルリグでは1万個に制限)パッキングを観察します。AABBはパッキングをより最適化しますが、Cubicパッキングより若干パフォーマンスが劣ります。
    これはサイズや形状の異なる複数のプロトタイプがある場合に、より顕著になります。
    複数のプロトタイプを使用した AABB は、別のチュートリアルのシーンファイルで説明されています。トランスフォームの説明
  5. Ray Domain と Volume メッシュの可視性をオンにします。
  6. Volume Distribution アイテムの1つを移動します。
  7. 次に Ray Domain アイテムを動かして、何が起こるかを観察します。

    Ray DomainはDistributionがレイキャスティングを実行する場所をコントロールします。
    パーティクルは RayDomain が VolumeMesh と重なる場所にのみ追加されます。
    これらの2つの記述はSample ModeがRaycastingモードの時のみ有効です。

    Sample ModeがPreviewに設定されているときにステップ6と7を試してみると、結果がRay domain gizmoに束縛され、Volume meshのポリゴンを無視することが分かります。
    つまり、Previewはレイキャスティングのコストを無視して、特定のパッキングパターンをより速く見つけるための方法です。

     

     

    8_VolumeDist_Fill_a_Bowl_.lxo

    この例では球に立方体のパーティクルを充填するセットアップを紹介します。
    Ray DomainはBox projectionモードに設定され、Volume Distribution packingモードはCubicに設定されています。
    これらのモードは変更することができ、ユースケースによって異なる結果をもたらします。

    チュートリアル
    1. シーン内のパーティクルが球メッシュの「壁」内にどのように配置されているかを観察してください。
      レイキャスティングは各パーティクルに対して2本のレイを反対方向に送ります。両方のレイがポリゴンに当たった場合、法線がパーティクルの位置から離れる方向(つまりポリゴンの裏側)にあることから パーティクルがメッシュの内側にある可能性が高いことがわかります。
    2. プロパティのInvert Normalsパラメータをチェックし結果を確認します。
    3. レイキャスティングロジックを反転させたので、球にパーティクルが含まれているはずです。
    4. Replicatorの一部が球と干渉しています。これを修正するにはVolume Contraint を1.0に増やして、交差を減らします。
    5. Volume Contraint Mode を Replace に変更します。このパラメータのツールチップを見てください。

    DistributionはWhiteNoise PSRandに設定されています。均一なBlueNoise Distributionsを試して、その違いを見てください。

    チュートリアル終了

     

     

    9_Surface_Projection_Example.lxo

    タイムラインをスクラブすると、アニメーションが表示されます。
    Surface DistributionアイテムのPrototype Scale が 1.0 以上に設定され、プロトタイプのオーバーラッピングが意図的に発生するようになりました。Ray Projectionアイテムのスケールをアニメーションしています。

     

     

    10_Surface_Projection_Weightmap.lxo

    Plane メッシュを選択し、プロパティのWeight Mapにあるウェイトマップ「SurfDistWmap」を選択します。
    ウェイトマップツールでPlaneメッシュにペイントします。

     

    PalmTreeScene.lxo

    この数式ノードで使用する値によっては、かなり重いシーンになる可能性があります。そのため、クランプ関数は0.1〜5.0の間に値を制限しています。

    このシーンでは、2つのSurface Distributionが使用されています。
    一つはヤシの木用、もう一つは草用です。ヤシの木の下に草が生えるようにしたいので、これらの分布の間のパッキングは考慮されていません。

    また、Gound Planeにはウェイトマップが用意されています。いずれかの分布を選択し、ドロップダウンを使って選択します。ウェイトマップブレンドパラメータを使用して、それを微調整します。
    このシーンで遊んでみてください。

     

    参考

    Modo Tips



     

    記事のまとめページ

    コメントを残す