アイテムを重ならないように散布できるプラグイン「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 アイテムは自動的に追加されます。
先に進む前に「ロケータの表示」が有効になっていることを確認してください。
チュートリアル
- Ray Projectionアイテムをクリックし、Projectionドロップダウンリストから様々なプロジェクションタイプを試します。
- Planar projectionに戻します。
- Surface Distributionの項目をクリックし、そのプロパティフォームとチャンネルのツールチップを見ます。
- 半径 0.5m の球体を Prototype meshに追加し、アイテムリストで可視性をオフに設定します。
- シーン内の紫色の破線領域は、プロトタイプのサイズ制限を定義する 1m 単位の立方体です。
- この領域の外側にあるすべてのポリゴンは、重なりが発生する可能性があります。場合によってはプロトタイプをドメインより大きくしても良い場合があります。例えば平面上に高層ビルを詰め込むような場合です。
- Surface Distributionをクリックし、プロパティフォームで異なるSample Modesを試します。
- ツールチップを読んで、4つの異なるSample Modesが何をするのか理解してください。
- サンプルモードを Preview に戻します。
- Distributionのドロップダウンで3つの異なるDistributionを試します。そのツールチップを読んでください。
- サンプルモードを「Raycast & Pack」に設定します。
- Ray Projectionアイテム(ギズモ)を選択し、移動/回転/スケール変換を試します。
次に、Surface Distributionシステムの様々な設定で遊んでみてください。
Packing Modes については、別のチュートリアルで説明します。AABB モードを使用するには、最初にプロトタイプメッシュをSurface DistributionアイテムのAABBプロトタイプスロットに接続する必要があります。
(AABBはAxis Aligned Bounding Boxの頭文字を取ったものです)。 - アイテムリストのSurface Tutoralフォルダの可視性をオフに設定します。
- 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キュービックパッキング
手順
- ノードグラフを調べます。
- SkyScraperプロトタイプメッシュの可視性をオンに設定します。
- SkyScrapersの下部が紫色のプロトタイプドメインの中央にどのように配置されているかを観察します。
また、その上に拡張されます。パッキングはドメイン内のポリゴンのみを考慮します。 - SkyScraperプロトタイプメッシュの可視性をオフに設定します。
- タイムスライダーをフレーム70にドラッグします。
- SkyScraperの底面が平面ポリゴン上に完全に配置されていることを確認します。
- Surface Distributionを選択し、Packing modeをCubicに設定します。
パックされたパーティクルのgl-drawing以外の違いは見られないはずです。 - Normal Aligmentを1.0に設定して、パーティクルが表面の湾曲にどのように整列するかを確認します。
- 次に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アイテムにも適用されます。
チュートリアル
- シーン内のオレンジ色のロケータをクリックし、「Normal Aligment」チャンネルを開きます。
- Cubicパッキングが、すべてのバウンディングボックスの XYZ 寸法をどのように保持するかを観察します。
- AABBパッキングが、Replicatorのバウンディングボックスを動的に更新する様子を観察します。
- Particle Countを増やし(このチュートリアルリグでは1万個に制限)パッキングを観察します。AABBはパッキングをより最適化しますが、Cubicパッキングより若干パフォーマンスが劣ります。
これはサイズや形状の異なる複数のプロトタイプがある場合に、より顕著になります。
複数のプロトタイプを使用した AABB は、別のチュートリアルのシーンファイルで説明されています。トランスフォームの説明 - Ray Domain と Volume メッシュの可視性をオンにします。
- Volume Distribution アイテムの1つを移動します。
- 次に 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に設定されています。
これらのモードは変更することができ、ユースケースによって異なる結果をもたらします。
チュートリアル
- シーン内のパーティクルが球メッシュの「壁」内にどのように配置されているかを観察してください。
レイキャスティングは各パーティクルに対して2本のレイを反対方向に送ります。両方のレイがポリゴンに当たった場合、法線がパーティクルの位置から離れる方向(つまりポリゴンの裏側)にあることから パーティクルがメッシュの内側にある可能性が高いことがわかります。 - プロパティのInvert Normalsパラメータをチェックし結果を確認します。
- レイキャスティングロジックを反転させたので、球にパーティクルが含まれているはずです。
- Replicatorの一部が球と干渉しています。これを修正するにはVolume Contraint を1.0に増やして、交差を減らします。
- 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にはウェイトマップが用意されています。いずれかの分布を選択し、ドロップダウンを使って選択します。ウェイトマップブレンドパラメータを使用して、それを微調整します。
このシーンで遊んでみてください。