Vellum Solver DOP

Table Of Content

Overview

Vellum Solver は、XPBD: position-based simulation of compliant constrained dynamicsという論文で提案されている eXtended Position Based Dynamics (XPBD) アルゴリズムを基盤として設計された GPU/OpenCL による並列処理が可能なソルバーであり、主に Cloth や Hair などがシミュレーション対象となる。XPBD は、PBD の課題であった反復回数によって剛性値 (stiffness) が変わってしまう問題を解決しており、反復回数に依存せず一貫した結果が得られやすくなっている。

XPBD Cloth

Vellum Solver における重要な要素として、Detangle SOP と Graph Color SOP がある。
Detangle SOP は衝突の検出・解決に使用され、Vellum のコリジョンパイプラインに組み込まれている。
一方、Graph Color SOP はシミュレーションの並列処理やリソースの最適化、衝突の検出・解決に使用されている。
Vellum Solver では、グラフ彩色アルゴリズムを用いて Constraint をいくつかのバッチに分割することで、並列処理を実現している。

Resources
Houdini Vellum 之 Graph Color 的算法分析 - 鹏_VFX - 博客园
追実装: Projective Dynamics (SIGGRAPH 2014) - yuki-koyama's blog
09 Getting ready to simulate the world with XPBD
論文読み: Unified Particle Physics for Real-Time Applications (SIGGRAPH '14) - yuki-koyama's blog


Common Settings

Common Settings

Enalble Collisions

衝突検出の有効化。


Self Collisions

自己衝突検出の有効化。
Vellum Solver における衝突の計算は主に Detangle SOP を用いて行っているので、Solver の中身を見てみると Self Collisions と紐付けられていることが分かる。

Self Collisions


Time Scale

シミュレーションタイムステップの変更。全体的に遅くしたり速くすることができる。

Vellum ソルバの実効時間をスケールします。 これを使用することで、バレットタイムのような効果を出すことができて、Houdini のプレイバーとは異なる時間レートで Vellum ソルバの物理計算が実行されます。 値を 2 にすると、布が 2 倍速で落下するようになり、0.1 にすると、0.1 倍速で遅くなります。(引用:SideFX 公式ドキュメント)


Velocity Damping

速度の減衰。値が 0.1 の場合は、10%速度量が減少する。

float scale = 1 - chf('damping');

// We want to scale v by scale over the given number of substeps.
// thus, scale = pow(subscale, substeps);
// subscale = pow(scale, 1/substeps);

float subscale = pow(scale, 1.0/chi('substeps'));
@v *= subscale;

Iterations

Self Collisions

Substeps

(GIF)

1 フレームあたりの分割数。値を 5 にした場合は、1 フレームが 5 分割されて計算が行われる。
作業時は大体 2 から 5、最終段階になると 10 から 15 にしていることが多い。

各フレームをこのサブステップの数で分割します。 高速移動する衝突オブジェクトまたは急なフォースには、サブステップを上げる必要があります。デフォルトのサブステップだと、非常に挑戦的な設定になっており、もし Vellum Solver があまりにも伸縮が大きいようでしたら、 通常だとサブステップを 2 とか 5 に上げると、ちょうど良く始めることができるでしょう。
Document: Vellum Solver dynamics node


Constraint Iterations

1 サブステップあたりにおける拘束の反復計算回数。計算手法はガウス・ザイデル法。
250 から 500 ぐらいの値をよく使う。Substeps よりも処理が軽い。
“Substeps: 1 / Constraint Iterations: 100” よりも “Substeps: 5 / Constraint: 20” の方が 1 サブステップあたりの予測位置が正確になるため良い結果が得られる。

(GIF or IMAGE: Simulation time)

各サブステップ内で、この回数だけ拘束が実行されます。 硬い拘束を収束させるには、この反復回数を上げる必要があります。 最初に設定する目安はジオメトリの直径です。要するに、一番遠くのポイントまでのエッジの数です。
Document: Vellum Solver dynamics node

XPBD は、布が硬化しすぎないようにうまく処理しますが、反復が十分でない場合には、収束が失敗する可能性があります。 その結果が伸張した感じになっている場合、Constraint Iterations を上げてください。 Substeps を上げるのも役立ちますが、通常では Constraint Iterations の方が処理が軽いです。
Document: Tipsとトラブルシューティング


Smoothing Iterations

(GIF)

ヤコビ法を用いたエラー箇所の平均化。Gas Interleave Solver の Passes と紐付けられている。
基本的にはデフォルト値で OK。重ね着など Multi Layer のシミュレーションを行うときは増やす。

Constraint Iterations は、収束が早いガウス・ザイデル法をデフォルトで使用しています。 しかし、剛性が高すぎたり、不可能な設定が原因で完全に収束しなかった場合、ひどい見た目の三角形でエラーを残してしまいます。 Smoothing Iterations は、収束が遅いけど、もっと感じの良い方法でエラーを残すヤコビ法を使用しています。 デフォルトの 10 回は、エラーを滑らかにしますが、全体的な Constraint Iterationsの回数が非常に多い場合は、この回数も上げる必要があります。
Document: Vellum Solver dynamics node

手に負えないオブジェクト
場合によっては、オブジェクトが運動量保存則に反して、なにかおかしな内部エネルギーで加速したりスピンしはじめることがあります。
考えられる原因は、自己交差で、特に pscale が大きすぎる場合に起こります。
解決方法は、Plasticity(可塑性)を使って、最終設定を Rest 設定にすることで、すべての内部エネルギーを除去することです。
他に考えられる原因は、解が収束せずに、システム内にエネルギーが非対称で残ってしまったからです。 こうなると、エネルギーが増大して、自己交差がなくてもシミュレーションでスピンが発生してしまいます。 これは、特に圧力拘束と支柱拘束で見受けられます。 Smoothing Iterations と Damping を上げることで、これを回避することができます。 場合によっては、(プリミティブによって)拘束の順番をランダムに並べたり、(拘束を構築する前の)ポイントをランダムに並べることで、解決することもあります。

不安定なピン
強い屈曲拘束とハードピンは、数値的な安定性に問題を起こす可能性があります。この回避策は、ソフト拘束を使用することです。 Smoothing Iterations は、それを対処します。
Document: Tipsとトラブルシューティング


Collisions

Collisions

Collision Passes

Detangle SOP を用いて衝突検出するパスの数。処理が重いので少しずつ上げる。
Collision Passes / Constraint Iterations + 1 または Collision Passes / Constraint Iterations - 1 というパラメーターが Gas Interleave Solver の Rate として入っている。

実行する衝突検出パスの数。この衝突検出パスは、拘束反復と交互に行なわれます。 衝突検出は処理が重いので、この数を最小限に抑えるのが良いです。 しかし、交互に頻繁に処理することによって、小さい Collider が非伸縮拘束に対して無駄に負荷をかけてしまうテントポールのような現象を回避するのに役立ちます。 実際に試してみると、ほとんどの状況において 10 が適切であることが分かり、品質を上げるならサブステップを上げることで解決されることが多いです。
Document: Vellum Solver dynamics node


Post Collision Passes

Constraint の反復計算が終わったあとに行う衝突検出のパス数。
ドキュメントに積み上げる層の数 + 2 が良いと書いてあるので、基本的にはこれに従う。

すべての拘束が実行された後に、最後決戦の衝突検出が行なわれます。 衝突が最も目立つ失敗モードになる場合が多くて、次のフレームでは交差していないジオメトリから開始できるのが理想です。 そのため、最終クリーンアップのパスによって、それらの要件を成し遂げることができます。 私どもは、このパスの数は“積み上げる層の数 + 2”が妥当であると分かりました。 これによって、下側にある Collider が、その上に積み上げられた層を完全に波立てるようにする伝搬させることができます。
Document: Vellum Solver dynamics node


Polish Passes

外部干渉や自己干渉が回避できなかった部分を再計算する際の最大パス数。
Detangle SOP の Resolve All Max Passes と同じ。

ある衝突パスにおいて、ある衝突ペアが完全に解決できないことがあります。 この数だけ追加した Collider ペアのパスは、その衝突ペアが解決されるまで実行されます。 これらのパスはアクティブな Collider に対してのみ実行されるので(そして、新しい衝突検索が実行されないので)、非常に計算が軽いです。
Document: Vellum Solver dynamics node

起こり得るすべての干渉に対して、初期 Gather(収集)パスが実行されます。 干渉は個々に解決されますが、それらの結果を平均化しても干渉を完全に解決することはできません。 これは、最大パスに到達または解決するまで、干渉回避の再計算を繰り返します。 この過程で作成された干渉はどれも検出しないことに注意してください。
Detangle geometry node


Layer Shock

(GIF)

異なるレイヤー間の相対質量を設定する係数。重なった布を扱うときに便利。Detangle SOP の Layer Shock と同じ。
layer という point attribute を設定すると干渉の優先度を制御でき、値が大きいほど上層を指す。
例えば、値を 2 にすると低いレイヤー番号の重さが高いレイヤー番号の重さの 2 倍になる。つまり、上層ほど質量が軽くなる。

layer整数 Point アトリビュートを使って、異なる層の布に属するポイントを示すことができます。 この番号が大きいほど、上層の布を参照します。 Layer Shock は、衝突を評価する際に、低いレイヤー番号ほど何倍も重くするので、高いレイヤー番号が低いレイヤー番号をよけるようになります。 他のダイナミクスは、このレイヤー番号の影響を受けません。 レイヤー番号の差分は、その 2 つの布間のレイヤーの数に関係なく修正されます。 この差分によって、一方向のシミュレーション、完全双方向のシミュレーションの制御方法が決まります。
レイヤー番号が異なる 2 個のポイントが干渉した場合に、この Layer Shock 係数によって、それらの相対質量が調整されます。 これによって、高いレイヤー番号が低いレイヤー番号をよけるようになります。 レイヤー番号の差の大きさは関係なくて、ただ単にそのレイヤー番号の大小を見ているだけであることを忘れないでください。 値を 2 にすると、干渉を回避するために、実質的に低いレイヤー番号の重さが高いレイヤー番号の重さの 2 倍になります。
Detangle geometry node

Frictions

Frictions

Static Threshold

(GIF)

静摩擦が適応される閾値。Detangle SOP の Static Threshold と同じ。

完全摩擦が適用される閾値。 接線 Velocity と法線インパルスの比率がこの閾値未満の時、接線 Velocity が完全に摩擦から除去されます。 これは、重力だけでスライド可能な勾配角度の tan()のようなものです。

https://www.sidefx.com/ja/docs/houdini/nodes/dop/vellumsolver.html

Static Threshold

https://seihin-sekkei.com/calculation-tool/friction-calculator/angle-to-friction/


Dynamic Scale

(GIF)

動摩擦が適用されたときの接線 Velocity が減少する割合。Detangle SOP の Scale Kinetic と同じ。


External Enable

外部干渉に適用される摩擦効果の度合い。Detangle SOP の External Friction と同じ。


Self Enable

自己干渉に適用される摩擦効果の度合い。Detangle SOP の Self Friction と同じ。


Static SDF Enable

Collision Volume の静摩擦が適用される度合い。摩擦のない地面の作成に役立つらしい。

Gas OpenCL DOP でmus = ch("../static_threshold") * ch("../static_sdfscale") という形で使われている。


Dynamic SDF Enable

Collision Volume の動摩擦が適用される度合い。

Gas OpenCL DOP でmuk = ch("../dynamic_scale") * ch("../dynamic_sdfscale") という形で使われている。


Advanced

Advanced

Integration

(GIF)

シミュレーションで用いられる数値積分の手法に関する設定。

Velocity によってポイント位置を前へ前へ積分させていく時、振り子のような弧を描く動きだと、拘束予測がその予測を誤ってその動きが減衰していまいます。 2 次プリディクタ(予測器)は、そのような弧を描く動きをもっと補って、システム内のエネルギーをもっと維持させます。
どのような場合でも、干渉が検出されれば、このシステムは、過度の跳ね返りを回避するために、1 次プリディクタに戻します。
Document: Vellum Solver dynamics node

Fisrt Order は、昔の Grain で使われていた手法である。
シンプルで計算量も少ないが、曲線のような非線形の動きが考慮されないため拘束を収束させるのに多くの反復回数が必要となり、エネルギーの減衰が大きくなる。
計算量が少ないので、2 段階に分けてシミュレーションを行う際の 1 段階目で使用することがたまにある。
Fisrt Order の基本的なアルゴリズムは以下のようになっている。

  1. oldP=PoldP = P
  2. P=P+vTimeIncP = P + v * TimeInc
  3. v=(PoldP)/TimeIncv = (P - oldP) / TimeInc
VEX Code: 1st order
vector origv = v@v;
@v = (@P - v@pprevious) / @Timeinc;

if (chi("limitaccel"))
{
    vector dv = @v - origv;
    float accel = length(dv);
    float maxaccel = chf("maxaccel");
    maxaccel *= @TimeInc;

    dv *= maxaccel / accel;
    @v = select(accel > maxaccel, origv + dv, @v);
}
// The result of solving BDF1 for w:
// q = q_prev + t * dqdt
// q = q_prev + t * 1/2 * w * q
// w = (q - qprev) * conj(q) * (2 / t)
vector4 qconj = p@orient * {-1, -1, -1, 1};
vector4 q = p@orient - p@orientprevious;
q = qmultiply(q, qconj);
v@w = (vector)(q) * (2 / @Timeinc);

Second Order は、1 タイムステップ分のデータが必要だが、非線形の動きを考慮し比較的少ない反復回数で正確に予測ができる。そのためエネルギーの減衰も少なくてすむ。バウンスするようなアーティファクトが発生するときは、Max acceleration のパラメーターを調整することで回避可能。
Fisrt Order と比較すると Second Order のアルゴリズムはもう少し複雑で、具体的には、BDF2(後退オイラー法)を用いて計算している。

VEX Code: 2nd order
// 2nd order velocity.
// vector v2 = (3 * @P / 2 - 2 * v@pprevious + v@plast / 2) / @TimeInc;
// The below expression loses less floating point precision than the one above.
vector v2 = ((2 * @P + (@P + v@plast)) - 4 * v@pprevious) / (2 * @TimeInc);

vector origv = @v;

if (accelfallback)
{
    // Check if our second order estimate violates maxaccel.
    vector accel = (v2 - v@vprevious) / @TimeInc;
    // Possible discontinuity if either fallback (user or Detangle)
    // or hitnum (DOP collisions) are set.
    fallback = (length(accel) > maxaccel && (fallback || i@hitnum || isgrain || phase > 0));
    // 1st order velocity.
    vector v1 = (@P - @pprevious) / @TimeInc;
    @v = select(fallback, v1, v2);
}
else
{
    @v = v2;
}

// Limit acceleration if necessary
if (limitaccel)
{
    vector dv = @v - origv;
    float accel = length(dv);
    maxaccel *= @TimeInc;

    dv *= maxaccel / accel;
    @v = select(accel > maxaccel, origv + dv, @v);
}
vector4 qconj = p@orient * {-1, -1, -1, 1};
if(i@fallback)
{
    // The result of solving BDF1 for w:
    // q = q_prev + t * dqdt
    // q = q_prev + t * 1/2 * w * q
    // w = (q - qprev) * conj(q) * (2 / t)
    vector4 q = p@orient - p@orientprevious;
    q = qmultiply(q, qconj);
    v@w = (vector)(q) * (2 / @Timeinc);
}
else
{
    // The result of solving BDF2 for w:
    // q = 4/3 * q_prev - 1/3 * q_last + 2/3 * t * dqdt
    // q = 4/3 * q_prev - 1/3 * q_last + 1/3 * t * w * q
    // w = (3 * q - 4 * q_prev + q_last) * conj(q) / t
    vector4 q = 3 * @orient - 4 * p@orientprevious + p@orientlast;
    q = qmultiply(q, qconj);
    v@w = (vector)(q) / @Timeinc;
}

External Forces

DOP フォースの適用。
これを無効にすると POP Solver 内の Gas External Forces が適用されなくなるため、DOP フォースの影響を受けず、POP フォースのみの影響を受けるようになる。

External Forces

Defalut Mass

massアトリビュートが存在しなかった場合のデフォルト値。


Default Thickness

pscaleアトリビュートが存在しなかった場合のデフォルト値。


Secondary Constraint Pass

Secondary Constraint Pass

Enable Secondary Constraint Pass

Secondary Pass の有効化。
これを有効にすると、Constraint Group で指定したものだけが別に計算されるようになる。
例えば、@type==bend というように Bend Constraint を指定し、Solve Frequency を 0.5 にした場合、Bend Cosntraint だけ 2 パスおきに 1 回計算されるようになるので計算量が減少しパフォーマンスが向上する。
硬い材質は収束させるのに反復回数が多く必要なので向いていないが、絹や綿織物などの柔らかい布を扱うときには有効。
四面体を扱う際に生じる jitter を軽減させるのにも使える。

このチェックボックスを有効にすると、指定した Constraint Group 内のすべての拘束が別々に計算され、交互に残りの拘束に渡されるようになります。
このオプションの主な用途が 2つあります。 1つ目の用途は、他の拘束ほど頻繁に計算する必要のない負荷の高い拘束タイプがいくつか存在するので、このオプションを有効にして Solve Frequency を低く設定することでパフォーマンを上げることができることです。 例えば、絹や綿織物といった曲げ剛性の低い高解像度の布に対する Cloth Bend 拘束がそうです。 布が伸縮しないように必ずすべてのパスで Distance 拘束を計算する必要があります。 しかし、絹や綿織物は曲げ抵抗が非常に弱く皺が寄りやすいので、Bend 拘束は負荷が高く、さほど強くする必要がありません。 Bend 拘束をセカンダリパスとして計算すれば、パフォーマンスが大幅に向上します。 ただし、この方法は革などの硬い材質には実用的ではありません。
2つ目の用途は、拘束トポロジーの頻繁な変化を引き起こす拘束です。 このような場合では、ソルバに拘束の計算順を変更させてしまうので、残りの拘束でジッターが発生する可能性があります。 例を挙げると、四面体で表現された有機組織があって、そこに滑りを有効にした Stitch 拘束が取り付けられているとします。 この滑りが拘束トポロジーの変化を引き起こすと、拘束の計算順が変わるので四面体に若干ジッターが起こり得ます。Constraint Group を@type=ptprimに設定し、Solve Frequency を 1 に上げることで Stitch 拘束を別のパスに移動させると、同じ剛性を維持しつつも、 計算順の変更が原因による四面体のジッターは軽減されます。
Document: Vellum Solver dynamics node


Constraint Group

Secondary Pass で使用する拘束グループ。

交互でセカンダリパスで計算される拘束グループ(s)。 このパラメータは標準のグループ構文に対応しているので、明示的なグループ名と ad-hoc(一時的な)グループを含めることができ、@type==bendのように 1 つ以上の拘束タイプを指定することが多いです。 これらのグループに含まれていない拘束は通常通りプリマリパスで計算されます。
Document: Vellum Solver dynamics node


Solve Frequency

Secondary Pass で計算する頻度。

セカンダリパスを計算する頻度。 1 に設定するとプライマリパスと同じ頻度でセカンダリパスが計算されるのに対して、0.25 に設定するとプライマリパスの 4 パスおきに 1 回計算されます(4 分の 1 の回数)。
Document: Vellum Solver dynamics node


Multi-Pass Solve

Secondary Constraint Pass

Enable Multi-Pass

Multi-Pass の有効化。これを有効にすると、Disable Stretch Ratio で指定した分だけポイントがストレッチした場合に、自動的に自己・外部干渉を無効にする。例えば、コリジョンオブジェクトに引っかかって必要以上にポイントが伸びてしまうことによる形状の破綻を回避することができる。

Multi-Pass オプションによって、特定の条件が満たされるまでサブステップを繰り返すことができます。 現在の条件は、無効化されたポイントが原因でジオメトリが引っかかり、無効化されていないポイントがストレッチを生成してしまう問題を修復するように設計されています。 コリジョンは常に拘束を未然に防ぐので、その結果として、布やヘアーがストレッチします。 自動的に無効化されたポイントに隣接したポイントは、過度なストレッチが検出されるとそれらのポイント自体が無効化されます。 この解決ステップは、ジオメトリが解放されるまで繰り返されます。
Document: Vellum Solver dynamics node

VEX: compute_stress_ratios
#include <pbd_constraints.h>

if (s@type == "distance" || isTriARAP(s@type) || isTetARAP(s@type))
{
    // 差分の計算
    // abs(current length - rest length)
    @vizval = computeRestLengthDifference(1, primpoints(0, @primnum), s@type,
                                          @restlength, p@restvector,
                                          v@restdir, s@target_path, i@target_prim, 3@restmatrix);

    // rest lengthを基準として、どのくらいの比率で変化したか
    @vizval /= restMetric(s@type, f@restlength, p@restvector, 3@restmatrix);
}
else
{
    @vizval = 0;
}
VEX: update_disable_and_set_keep_running
// Input 1: Myself (No Reads of Outputs)
// Input 2: $OBJID/ConstraintGeometry
// ---
// maxstretch <- 0.0 to 1.0

// 変化率
@vizval = point(1, 'vizval', @ptnum);

// If this point counts as stretched, disable it
// if it is connected (by a constraint...) to a
// point that is disabled.

// maxstretchよりも変化量が大きい場合に、ポイント衝突を無効化
// disableselfとdisableexternalを2または3へ
if (@vizval > ch('maxstretch'))
{
    int disableself = point(0, 'disableself', @ptnum);
    // 自己干渉が0 => ポイント衝突が有効
    if (disableself == 0)
    {
        // Potential failure, check our neighbours!
        int n[] = neighbours(1, @ptnum);
        int neighbourdisable = 0;

        foreach (int npt; n)
        {
            neighbourdisable = point(0, 'disableself', npt);

            // 隣接点のdisableselfが2または3であれば、break
            if (neighbourdisable & 2)
                break;
        }

        // 隣接点のdisableselfが2または3
        if (neighbourdisable & 2)
        {
            // notconverged (detail) <- 1
            // Gas Repeat SolverのWhile Dataで使用
            setdetailattrib(geoself(), 'notconverged', 1);

            // disableself (point) <- disableself | 2
            // 0|1 => 2, 1|2 => 3, 2|2 => 2, 3|2 => 3
            setpointattrib(geoself(), 'disableself', @ptnum, disableself | 2);  // ビット演算
        }
    }

    int disableext = point(0, 'disableexternal', @ptnum);
    // 外部干渉が0 => ポイント衝突が有効
    if (disableext == 0)
    {
        // Potential failure, check our neighbours!
        int n[] = neighbours(1, @ptnum);
        int neighbourdisable = 0;

        foreach (int npt; n)
        {
            neighbourdisable = point(0, 'disableexternal', npt);

            // 隣接点のdisableexternalが2以上であれば、break
            if (neighbourdisable & 2)
                break;
        }

        if (neighbourdisable & 2)
        {
            // notconverged (detail) <- 1
            // Gas Repeat SolverのWhile Dataで使用
            setdetailattrib(geoself(), 'notconverged', 1);

            // disableexternal(point) <- disableext | 2
            // 0|1 => 2, 1|2 => 3, 2|2 => 2, 3|2 => 3
            setpointattrib(geoself(), 'disableexternal', @ptnum, disableext | 2);
        }
    }
}

Maximum Passes

Multi-Pass の計算を行う最大サブステップ数。

サブステップを繰り返す最大回数。 無効化する必要のある新しいポイントがなくなれば、そのプロセスが即座に停止します。
Document: Vellum Solver dynamics node


Disable Stretch Ratio

ポイントのストレッチ量。

ポイントが無効化の対象となる判断をするための解決ステップの終わりにおけるストレッチ量。 これは、失敗したコリジョンが Vellum オブジェクトを引き離している時期を検出するためにあります。 無効化するポイントを増やして失敗させることで、通常ではオブジェクトを解放することができるので、ストレッチを続けるよりも良い結果が得られます。
Document: Vellum Solver dynamics node


Collisions

Collision2

Disable Failed Collisions

Detangle SOP における Update Disabled Points の有効化。
これを有効にすると、指定したサブステップ数内で干渉が解決できなかったポイントに対して、干渉を無効化するためのポイントアトリビュートが設定される。(設定されるポイントアトリビュートはおそらくdisableselfdisableexternal

ポイントがポストコリジョンパスの後で干渉を解決できなかった場合、そのポイントに disabled フラグを立てて、そのポイントとそれが属するプリミティブが干渉なしで移動できるように許可します。
Document: Vellum Solver dynamics node

すべての干渉を適切に制御できるわけではないので、これは、現在干渉しているポイントに対して disable の Point アトリビュートを設定します。 これを使用することで、現在の不正な位置にあるポイントに対する干渉回避の試みを回避させることができるので、それらのポイントを徐々にサーフェスの正しい方へ戻させることができます。
Disabled ポイントが設定されている時、その値が2で or(論理和)されます。
Document: Detangle geometry node


Reset Collided Points

Detangle SOP における Reset Detangled Points の有効化。
干渉の無効化を設定したポイントが解決できる状態になった場合、再度干渉を有効化する。

disabled フラグのポイントは、絡みついた状況において何も干渉を検出しなくなっていて、且つ、disabled フラグのないポイントと繋がっている場合、そのポイント自体が再度アクティブになります。 disabled フラグのポイントは、あらかじめジオメトリの正しい側に移動させておくことが望ましいです。
Document: Vellum Solver dynamics node

Disabled ポイントが干渉関係を解決して、もはや Detangle(ほどく処理)が不要になれば、再度干渉が開始できるように、その Disabled 状態をリセットします。
ポイントがリセットされると、その値は2の否定で and(論理積)されます。 これは、その値を手動で 1 に設定してポイントを Disabled にしている場合、このリセットパスでは解除されず、自動で Disabled に設定されたポイントのみがリセットされます。
Document: Detangle geometry node


Initialize Overlap Distances

Detangle SOP の干渉検出に使用するoverlap_selfoverlap_externalアトリビュートの作成と初期化。初期値は 10000。

// Set defaults if attribute missing so net-new points get these values.
float @overlap_self = 10000;
float @overlap_external = 10000;

@overlap_self = 10_000; // '_'で桁区切りできる
@overlap_external = 10_000;
Initialize Overlap Distances

overlap_selfoverlap_externalのアトリビュートを作成し、ソルバの初期セットアップを評価できるように初期化します。
これらのアトリビュートが既に存在していれば、初期化されないことに注意してください。 モデリング操作が原因で設定が変わってしまった場合、それらのアトリビュートを削除しておいた方が良いでしょう。
オリジナルのpscaleが重なった量を格納します。つまり、0 はpscaleが完全に使用されていることを意味します。 これは、干渉に対して実質的に影響のあるpscaleoverlap_fooだけ小さくしてポイントが重なり始めないようにすることによって、最初のフレームにおける爆発を回避します。 厚みを可視化すると、この方法で修正されたポイントは緑ではなくシアンで描画されます。 ポイントが引き離されると、露出した空間を表示するためにこの厚みが小さくなります。 そのため、非常に大きなpscaleは、ポイントが大きくなって Distance 拘束とぶつかった時に不安定になります。
Document: Vellumアトリビュート

干渉を検出する際に使用されるそのままのpscaleアトリビュートを調整するためのアトリビュートが 2 つあります。 そのアトリビュートがoverlap_selfoverlap_externalです。 これらのアトリビュートは、隣接ポイントの初期オーバーラップを記録し、初期設定がフルのpscaleを考慮しない時に破裂を回避します。
Document: Detangle geometry node


Upadate Overlap Distances

overlap_selfoverlap_externalアトリビュート更新の有効化。

overlap_selfoverlap_externalを更新して、現在の設定を反映します。 これらの値は、この処理によって減少していくだけなので、初期化する時は大きな初期値を設定してください。
Document: Vellum Solver dynamics node


Tetrahedral Open Faces

Detangle SOP における Collide with Tetrahedral Open Faces の有効化。
四面体メッシュの隣り合っていない外側部分をコリジョンとして扱う。

これを設定すると、四面体メッシュの非共有フェースから干渉ジオメトリが生成されるようになります。 場合によっては、三角形シェルと四面体メッシュの両方を使って、この処理を冗長化したいことがあります。
Document: Detangle geometry node


Motion

Collision2

Max Acceleration

加速度の最大値。

色々な加速度制限オプションを使うことで、シミュレーションが非現実的なフォースの追従にあまりこだわらないようにさせることができます。 加速度制限オプションを使わないと、大きなエネルギースパイクが発生してしまうことがあります。
Document: Vellum Solver dynamics node


Fallback to First Order Integration on Collision

First Order へのフォールバックの有効化。加速度が最大加速度を上回った場合に、First Order で計算する。

ポイントが Max Acceleration を超過すると、鋭くて不連続な干渉の信号が出ていれば、2 次予測が誤って、跳ね返りの形式で間違った動きを追加してしまうことが多いです。 この場合では、影響を受けるポイントに対しては、1 次の積分に戻されます。
Note: Grain パーティクルと Fluid パーティクルは、衝突の場合だけでなく、1 次の積分へのフォールバックでも考慮されます。 このコントロールはシミュレーションを落ち着かせてパーティクルが迷子になるのを回避するのに役立つと同時に、 Grain や流体の動きの全体的な跳ね具合を緩めることができます。Max Acceleration を上げることで、その跳ね具合を戻すことができます。
Document: Vellum Solver dynamics node

VEX Code: calc_v_2nd_order_fallback
// ...

if (accelfallback)
{
    // Check if our second order estimate violates maxaccel.
    vector accel = (v2 - v@vprevious) / @TimeInc;
    // Possible discontinuity if either fallback (user or Detangle)
    // or hitnum (DOP collisions) are set.
    fallback = (length(accel) > maxaccel && (fallback || i@hitnum || isgrain || phase > 0));
    // 1st order velocity.
    vector v1 = (@P - @pprevious) / @TimeInc;
    @v = select(fallback, v1, v2);
}

// ...

Limit Acceleration in Velocity Update

最大加速度を用いた速度の制限化。Grain や Fluid などで役に立つ。

パーティクルの Velocity がダイナミクスの何かの結果として変更可能な量を制限します。 これは、なにか瞬間的な動きが大きなフォースとして認識されないのを回避することができるので、 パーティクルが遠くに飛んでいってしまわないようにするのに役立ちます。
Document: Vellum Solver dynamics node

VEX Code: calc_v_1st_order
vector origv = v@v;
@v = (@P - v@pprevious) / @Timeinc;

if (chi("limitaccel"))
{
    vector dv = @v - origv;
    float accel = length(dv);
    float maxaccel = chf("maxaccel");
    maxaccel *= @TimeInc;

    dv *= maxaccel / accel;
    @v = select(accel > maxaccel, origv + dv, @v);
}

Limit Displacement on Collision

Detangle SOP の Max Displacement の有効化。
衝突を解決する時に大きくポイントが移動してしまうようなエラーを回避するのに役立つ。

衝突を解決する時に、その衝突補正が加速度の量よりも大きくパーティクルを動かしてしまう場合に、その効果を制限します。 モデルの一部が布にひっかかって、ありえないような形で布を引っ張ってしまう時は、潔く失敗するのが望ましいです。
ポイントを動かす最大移動量。 この距離よりも遠くにポイントを動かしても、この距離でクランプされるので Disabled ポイントと同様になり、干渉の解決に失敗します。
Document: Detangle geometry node


Disable Broken Welds

Weld が解除されbroken グループが追加されたポイントに対して、i@disableself = 2を設定する。

接合が切断された時、2 つの新しいポイントが隣接した状態から動き始めます。 切断を発動させたものが原因でサーフェスが自然な感じに離れない場合、衝突検出を発動してサーフェスを押し離すため、 切断が発生した時に爆発のような動きを招きます。 このオプションは、ポイントの接合を解除した時にそれらのポイントが自己干渉しないようにdisableselfアトリビュートを設定します。 ただし、これによって、層になった布が自己貫通を引き起こしてしまうことに注意してください。
Document: Vellum Solver dynamics node


Normalize Stress

応力の正規化。サブステップ数やメッシュの解像度になるべく依存せず、一貫したシミュレーション結果を得ることが可能。

時間と共に応力計算を正規化するので、Substepsパラメータを上げるほど計算結果の精度が良くなります。
Document: Vellum Solver dynamics node

サブステップ数が1の低解像度メッシュ サブステップ数が 1 の低解像度メッシュ

サブステップ数が3の高解像度メッシュ サブステップ数が 3 の高解像度メッシュ

Vellum SolverAdvancedタブには Normalize Stressチェックボックスがあります。 これは Houdini18 以降ではデフォルトで有効になっています。 このチェックボックスは、サブステップ値が変わっても計算値が予測しやすくなるように、時間軸で応力計算を正規化することができます。
これは、応力閾値に基づいて布を粉砕または引き裂く際にその閾値をあまり変更する必要なくサブステップ数を変えることができるので便利です。 例えば、非常に高速に移動する衝突オブジェクトがあってサブステップ数を上げる必要がある場合、その閾値は若干調整するだけで済みます。
これは、密度から計算された質量と組み合わせても上手く動作します。 例えば、密度が一定な布があって解像度を変更しても、その応力値もそのままうまく整合性が保たれるはずです。 これによって、サブステップ数や解像度が大きく変わっても動作するように応力値をセットアップしやすくなります。
Document: 時間軸で応力計算を正規化


Breaking Frequency

Weld 部分にかかっている力が Threshold を超えたかどうかを計算する頻度の設定。

接合と拘束が切断ポイントに到達したかどうかをテストする回数。 値が大きいほど、計算精度が良くなりますが、切断された拘束のトポロジーの変化量に応じて計算が遅くなってしまいます。

Never
切断のテストをしません。

Per Frame
サブステップ数に関係なくフレーム毎に 1 回だけチェックします。

Per Substep
サブステップ毎にチェックします。
Document: Vellum Solver dynamics node


Sliding Method

Sliding を設定した際に、次のターゲットとなる隣接点を探索する手法の設定。

Attach to Geometryまたは Stitch Pointsの拘束を滑らせた時に、ターゲットジオメトリ上の次に近い位置を検索する際に使用されるメソッド。

Closest Pointは、単に投影した滑り位置からターゲットジオメトリ上の一番近いポイントを選択します。 この手法は高速ですが、ターゲットジオメトリ内の凹部分では不適切に飛んでしまう可能性があります。

Traverse Polygonsは、現在のターゲットプリミティブから開始して継続して外側へ走査して周辺のプリミティブ上で一番近いポイントを検索します。 この手法は処理が重いですが、凹状のターゲットジオメトリを上手く制御することができます。**Traverse Triangles (Optimized)**は、改良された凹部分の制御において以前のオプションと同様ですが、特別な三角形距離関数を使用しているので何倍も高速化されています。しかし、三角形で構成されたターゲットジオメトリにしか使用することができません。
Document: Vellum Solver dynamics node


Sleeping

Sleeping

Enable Auto Sleep

Velocity Threshold で設定した速度以下になったポイントに対してstoppedアトリビュートを設定し静止させる。

十分長い間ほぼ静止状態になっているパーティクルのstoppedアトリビュートを1に設定して、そのパーティクルをスリープ状態にします。  Pinned ビジュアライゼーションを使用すれば、どのポイントがスリープ状態になっているのか視覚化することができます。
Document: Vellum Solver dynamics node


Velocity Threshold

Auto Sleep を有効にする速度の閾値。
この閾値以下の速度になったポイントにはdeactivation_time が蓄積していき、Sleep Delay で設定した値delay を超えたときにstoppedアトリビュートが追加される。

パーティクルがスリープ状態となる条件として必要となるパーティクルの移動速度。 この速度以下で移動している時間はdeactivation_timeアトリビュートに累積されます。 この速度を超えると、deactivation_timeアトリビュートは 0 にリセットされます。
Document: Vellum Solver dynamics node


Sleep Delay

ポイントが Velocity Threshold 以下になり静止するまでの秒数。POP Awaken DOP で静止を解除できる。

パーティクルがスリープ状態となる条件として必要となる Velocity Threshold以下でパーティクルが移動している秒数。 再度パーティクルを目覚めさせる方法に関しては、POP AwakenDOP を参照してください。
Document: Vellum Solver dynamics node


Grain Collisions

Sleeping

Grain の干渉に関する設定。パラメータの意味は POP Grain と同じ。


Search Scale

近接ポイントの探索範囲(pcfind / pcfind_radius)の設定。POP Grain の Neighbor Query Scale と同じ。
VEX を見てみると@pscale * scaleとなっていて、@pscale でスケールされている。

2 個のパーティクルのpscaleアトリビュートの平均値をこの値でスケールした距離の範囲内にあるパーティクルが交差の候補となります。 通常では拘束の反復中にコリジョンは更新されないので、これは過大評価です。 そのため、現在衝突しているパーティクルだけでなく、以前の反復によって衝突をし始める可能性のあるパーティクルも記録する必要があります。
これは、凝集での引力の範囲にも影響します。
Document: Vellum Solver dynamics node

起こり得る交差パーティクルは、2 つのpscaleアトリビュートの平均をこの値でスケールした距離の範囲内にあります。 これが過剰評価である理由は、通常、衝突は拘束反復の間では更新されないため、現在衝突しているパーティクルだけではなく、 それよりも前の反復により衝突が始まったパーティクルも記録する必要があるからです。
これは、凝集の引き寄せる力の範囲にも影響を与えます。
Document: POP Grains dynamics node

VEX Code: get_neighbours
int @ptnum;
int @neighbors[];
float @pscale = 1.0;
int @phase = 0;
vector @P;
int @neighbors[];
int @piece = -1;
string @name;

// Target both grains and fluid (usually won't be both)
string targetgrp = '@isgrain=1 @phase>0';

if (@phase > 0)
{
    scale = fluidscale;
    maxn = fluidmaxn;
}

int tmp[];
if (uniformradius)
{
    // pgfind is faster, but fails if particles are too separated in
    // OpenVDB 3.0
    // tmp = pgfind(0, @P, @pscale  * scale, maxn+1, 0.5 * particleseparation * scale);
    tmp = pcfind(0, targetgrp, 'P', @P, @pscale  * scale, maxn+1);
}
else
{
    tmp = pcfind_radius(0, targetgrp, "P", "pscale", 0.5 * scale, @P,  0.5 * @pscale * scale, maxn+1);
}

if (ignorepiece && haspointattrib(0, "name") && @name != "")
{
    resize(@neighbors, 0);
    foreach(int n; tmp)
    {
        string nname = point(0, "name", n);
        if (n != @ptnum && @name != nname)
            append(@neighbors, n);
    }
}
else if (ignorepiece && haspointattrib(0, "piece") && @piece >= 0)
{
    resize(@neighbors, 0);
    foreach(int n; tmp)
    {
        int npiece = point(0, "piece", n);
        if (n != @ptnum && @piece != npiece)
            append(@neighbors, n);
    }
}
else
{
    removevalue(tmp, @ptnum);
    @neighbors = tmp;
}

Max Neighbors

近接ポイントの探索に使用する最大ポイント数。POP Grains の Max Neighbors と同じ。

サブステップで起こり得る衝突を検索する際に考慮されるパーティクルの最大数。 この最大数を制限することで、ある時点でパーティクルがたくさん生成されて過度な計算がされないようにするのに役立ちます。 このパラメータは、OpenCL Neighbor Searchが有効な場合は無視されます。 その場合、Search Scaleで決定された範囲内にあるすべての隣接パーティクルが考慮されます。
Document: Vellum Solver dynamics node


Global Weight

全体の Weight 量を調整できる。Repulsion Weight, Attraction Weight, Self Enable の値がスケールされる。


Assume Uniform Radius

近接ポイントの探索手法の変更。有効になっている場合はpcfindを用いるのに対し、無効の場合はpcfind_radiusを用いる。
POP Grains の Assume Uniform Radius と同じ。

pscaleアトリビュートを使用して、各パーティクルの半径を決めます。 すべてのパーティクルが同じ半径であれば、もっと高速な加速化構造を利用して隣接パーティクルを検索することができます。
Document: Vellum Solver dynamics node

VEX Code: get_neighbors
// ...

if (uniformradius)
{
    // pgfind is faster, but fails if particles are too separated in
    // OpenVDB 3.0
    // tmp = pgfind(0, @P, @pscale  * scale, maxn+1, 0.5 * particleseparation * scale);
    tmp = pcfind(0, targetgrp, 'P', @P, @pscale  * scale, maxn+1);
}
else
{
    tmp = pcfind_radius(0, targetgrp, "P", "pscale", 0.5 * scale, @P,  0.5 * @pscale * scale, maxn+1);
}

// ...

Ignore Neighbors with Same Name or Piece

有効の場合は、同じnameまたはpieceアトリビュートを持つ隣接点を無視して計算を行う。両方のアトリビュートが存在する場合は、nameが優先される。
Cluster や Shape Match 使用した Grain シミュに使える。

piecePoint アトリビュートがマイナスでない同じ値を持つ隣接パーティクルを無視します。 このオプションを有効にすることで、他のクラスタにのみ相互作用する Grain のクラスタを分けて作成することができます。 これと Shape Match拘束を併せて使用して剛体の挙動を取得するといったことをよくします。 重なった Grain でオブジェクトを充たしたい場合はVDB To Spheres SOP を使用するのも良いでしょう。
Document: Vellum Solver dynamics node

以下の記事も参考になる。(日本語の方には書いてないっぽい?)
Shape matching

VEX Code: get_neighbors
// ...

if (ignorepiece && haspointattrib(0, "name") && @name != "")
{
    resize(@neighbors, 0);
    foreach(int n; tmp)
    {
        string nname = point(0, "name", n);
        if (n != @ptnum && @name != nname)
            append(@neighbors, n);
    }
}
else if (ignorepiece && haspointattrib(0, "piece") && @piece >= 0)
{
    resize(@neighbors, 0);
    foreach(int n; tmp)
    {
        int npiece = point(0, "piece", n);
        if (n != @ptnum && @piece != npiece)
            append(@neighbors, n);
    }
}
else
{
    removevalue(tmp, @ptnum);
    @neighbors = tmp;
}

// ...

Enable Constraint Averaging

パーティクルが同時に衝突したときに生じる、引き離す方向の拘束を平均化する。
POP Grains SOP の Disable Constraint Averaging と同じ。Vellum Solver ではデフォルトで無効になっている。
Kernel Options に以下の記述がある。
ifs(ch("../doconstraintaveraging"), "", "-D DISABLE_CONSTRAINT_AVERAGING ")`-D MASSSHOCKTYPE=`ch("../domassshock")*2` `chs("../kerneloptions")

複数のパーティクルが同時に衝突した時、これは、すべての拘束を平均化します。 これは、安定性を保証するのに効果がありますが、運動量を維持しません。 そのため、凝集などの内部フォースと組み合わせた場合、凝集したパーティクルが自身のフォースで加速してしまいます。
Document: Vellum Solver dynamics node

複数のパーティクルが同時に衝突した時、デフォルトでは、それらを引き離すための拘束が平均化されます。 これは、安定性を確保するのに効果的ですが、運動量を保持しません。 そのため、Clumping(凝集)などの内部フォースと組み合わせた時に、たくさんのパーティクルが、それらのフォース下で促進されます。 この平均化を無効にすると、それらのゴーストフォースを回避することができますが、 Friction With Particles, Internal Weight, Clumping Weight すべてが最低でも 0.5 に下げる必要があり、安定性を確保するなら できるだけさらに下げる必要があります。
Document: POP Grains dynamics node


Repulsion Weight

衝突時に生じる反発力のウェイト量。POP Grains SOP の Internal Collisions Weight と同じ。

パーティクルの衝突力の度合いを決めるウェイト。 値を 0 にすると、パーティクルの衝突が無効になります。
これは、repulsionweightPoint アトリビュートでスケールすることができます。
Document: Vellum Solver dynamics node


Repulsion

パーティクル同士を引き離す強さ。
POP Grains SOP の Internal Collisions Stiffness と同じ。


Attraction Weight

パーティクルの凝集度合いを決めるウェイト。POP Grains SOP の Clumping Weight と同じ。

パーティクル同士が近づいた時に自然にひっつく度合いを決めるウェイト。 値を 0 にすると、パーティクルの凝集が無効になります。
これは、attractionweightPoint アトリビュートでスケールすることができます。
Document: Vellum Solver dynamics node


Attraction

パーティクル同士の付着力。
POP Grains SOP の Clumping Stiffness と同じ。


Enable Mass Shock

重なったパーティクル間に相対質量を適用するかの設定。
Shock Axis で設定した方向(通常は重力の逆方向)に適用され、上層にいくほど質量が軽くなる。
POP Grains SOP の Enable Mass-Shock Scaling と同じ。

重力に対してパーティクルの位置でパーティクルの質量を人為的にスケールします。 パーティクルが上方に位置するほど軽くすることで、パーティクルの積み上がりが速く且つ安定して収束するようになります。
Document: Vellum Solver dynamics node

重力に対するパーティクルの位置に応じて、パーティクルの質量を人工的にスケーリングします。 上方に行くほどパーティクルを軽くすることにより、パーティクルのスタックは収束が速くなり、より安定します。
Global メソッドは、反復前のすべてのパーティクルの仮想質量を記録するshockmassアトリビュートを追加します。 オーバーフローを回避するためには、適切に設定された原点が必要です。
Local メソッドは、必要に応じて相対質量スケールを計算します。 このアトリビュート値を読み込まないと、余計な計算時間がかかることが多いです。 使用する指数の近似が原因で、効果的なショックスケールパワーが、ほぼ 7 に制限されます。
Document: POP Grains dynamics node


Shock Scaling Power

適用する相対質量のスケーリング量。

値を 0 にすると、パーティクル間の比率がなくなり、値を 1 にすると垂直に積み上がった 2 個のパーティクル間は 15%の比率でスケールされる。

実行するスケールの度合い。 値が大きいほど、連続するパーティクル間の差異が大きくなります。 値を 0 にすると、パーティクル間の比率がなくなり、値を 1 にすると垂直に積み上がった 2 個のパーティクル間は 15%の比率になります。
値が大きすぎると、パーティクルが極端に軽くなって、システムが不安定になってしまいます。
Document: Vellum Solver dynamics node

pdg_granular.h

float
__taylor_exp(const float is)
{
    // This becomes increasingly unstable as we move away from 0,
    // however we are supposed to be in the range -.3 to .3 here.
    // To account for people dialing shockscale to 11, we want to
    // clamp the incoming s.
    float s = clamp(is, -1.0, 1.0);
    float s2 = s * s;
    float s3 = s2 * s;
    // Taylor expansion of e^s
    return (1 + s + s2/2 + s3 / 6);
}

void computePointDistanceDelta ( ... )
{

// ...

if (shocktype == 2)		// local
{
  ks = __taylor_exp( shockscale * dot(r, shockaxis));
}

float weight = ks * massj / (mass + ks * massj);

// ...
}

Shock Axis

相対質量を適用する方向。

パーティクル質量の勾配を定義する際に使用される Up ベクトル。
この軸は、積み上げる方向となるので、通常では重力の逆方向を指定してください。
Document: Vellum Solver dynamics node


Fluids

Fluids

Vellum で流体シミュレーションを行う際の設定。Particle Fluid Forces CL DOP のパラメータと同じ。

Vellum 流体は、密度拘束を使用して流体を非圧縮性に維持し、さらに、粘度と表面張力を備えます。phaseアトリビュートが 0 でないパーティクルが流体と見なされます。
Document: Vellum Solver dynamics node


Kernel Radius Scale

流体計算に使用するパーティクルの範囲。どの程度の距離までのパーティクルが影響を与えるかの設定。

流体計算に使用されるカーネルの半径。 一般的には、デフォルト値の 4 が推奨されていますが、この値を少し増減させて違った効果を得ても構いません。 特に、この値は表面張力で生成される滴のサイズに影響を与え、値が大きいほど大きい滴が生成され、個別のパーティクルの数が少なくなります。

Note
値が大きいほどシミュレーションが遅くなり、隣接パーティクルのリストのためにメモリ使用量が増えます。 また、3 未満または 5 より大きい値は不安定に陥る可能性があります。
Document: Vellum Solver dynamics node

SPH 密度を評価する際に使用する各パーティクルの近接パーティクルのサイズ。この値は、それらのパーティクルのpscaleアトリビュートのスケールです。
Document: Particle Fluid Forces CL dynamics node


Viscosity

粘度の設定。

流体の粘度。 粘度の値が低いと、シミュレーションが安定するのに対して、 値が高いほど蜂蜜のような液体をシミュレーションすることができます。 パーティクル単位のviscosityアトリビュートを使用してこの値を乗算することで、粘度を可変させることができます。phase値が異なる流体パーティクルの粘度は個別に計算されるので、Multi-Phase 流体(多相流)の挙動を実現することができます。
Document: Vellum Solver dynamics node


SDF Collision Viscosity

SDF コリジョンと接触した流体の粘度。 混在のところ、この値は、Enable Minimal Solver が有効で、ソルバが地面または SDF コリジョンオブジェクトを使用した場合にのみ使用されます。
Document: Vellum Solver dynamics node


Viscosity Tolerance

粘度の計算手法。Explicit は高速であるが不安定、Implicit は遅いが安定しやすい。
ナビエ・ストークス方程式の粘性項を陽解法で解くか陰解法で解くか。

実行する粘度ソルバのタイプ。Explicitは高速ですが、パーティクル数が多かったり、または、サブステップ数が少ないと不安定になる場合があります。Implicitは遅いですが、パーティクル数が多くても、粘度値が高くても安定します。
Document: Vellum Solver dynamics node


Max Viscosity Iterations

Implicit法を使用した場合の粘度計算のエラー許容値。値が小さいほど精度が良いが、反復回数が増える。


Surface Tension

Implicit法を使用した場合の粘度計算の最大反復数。


Spatial Sort Interval

有効にした場合、ここで設定したフレーム間隔でパーティクルのソートが行われる。
Gas Intermittent Solve DOP の Frames Between Solves と同じ。

Vellum Fluids と Vellum Grains は、隣接ポイントを必要とした計算をたくさん実施します。 一般的には、3D 空間内の隣接ポイントがメモリ内でもお互いに近くにあるようにすることで、パフォーマンスは大幅に改善されます。 このオプションは、指定したフレーム間隔で空間的なパーティクルのソートを有効にします。

Note
このソートは、パーティクルのポイント番号を変えてしまうので、シミュレーションをする前にidアトリビュートを追加すると良いでしょう。**
Document: Vellum Solver dynamics node

計算中に経過させるフレーム数。 これは Houdini のグローバルフレームであり、シミュレーションフレームではないことに注意してください。
Document: Gas Intermittent Solve dynamics node


Minimal Solver

Fluids

Enable Minimal Solver

Minimal Solver の有効化。Vellum Brush SOP の内部で使われている機能だが、現在は非推奨。

Vellum Brush SOPで使用されている制限付きバージョンのソルバを有効化します。 現在のところ、これは制限事項があるのでブラシでのみ使用されている内部機能です。 布や他のソフトボディを非常に高速に静的ジオメトリと相互作用させることができます。 しかし、これはアニメーションするコリジョンまたは何かのアニメーション入力には動作しません。 このオプションはエンドユーザーには推奨していません。
Document: Vellum Solver dynamics node


Bypass Initialization in Minimal Solver

Minimal Solver を使用する際に行うアトリビュート初期化の無効化。


Ground Position

地面の位置。


Ground Up Direction

地面のUp方向。


Gravity

重力設定。


SDF Collision Path

衝突に使用する Collision Volume のパス。


Collision Passes

衝突検出のパス数。


Polish Passes

Constraint の反復計算が終わったあとに行う衝突検出のパス数。


Use Accurate Gradient

有効にすると、より正確な計算手法を用いて Collision Volume による衝突検出を行う。


OpenCL

Fluids

Kernel Options

コンパイルフラグの指定。-Dで#define を定義できる。
Vellum Solver ではDISABLE_CONSTRAINT_AVERAGINGMASSSHOCKTYPEが定義されていることが多い。
__H_GPU____H_CPU____H_NVIDIA____H_AMD____H_INTEL____H_APPLE_でデバイスの区別が可能。

カーネルに対して必要なコンパイルフラグを指定します。

Note
Apple OSX OpenCL コンパイラは、カーネルオプション間にはスペースを 1 個だけにする必要があります!
Document: Vellum Solver dynamics node


Finish Kernels

無効の場合、OpenCL カーネルの完了を待たなくなるのでバックグラウンドで走らせることが可能。

Finish Kernels が無効な時、次のソルバに進む前に OpenCL カーネルが完了するのを待たなくなります。 これによって、ソルバの結果が実際に必要となるまで、バックグラウンドで OpenCL カーネルを走らせることができます。 デバッグまたはタイミングを単純化したいのであれば、正しい箇所でエラーが検出できるようにカーネルが終了するのを待った方が便利です。
Document: Vellum Solver dynamics node


Recompile Kernels

有効にすると、カーネルを強制的に再ロードしてコンパイルする。デバッグ時に使える。

ディスクからカーネルを読み込む時、計算毎にそのカーネルを再生成されないようにそのカーネルをキャッシュ化します。 これを有効にすると、強制的にそのカーネルを再ロードして再コンパイルします。 これは、変更されたコードを#include ファイルが参照していたり、そのカーネルファイルを外部テキストエディタで変更した場合に役立ちます。
これは、プロトタイプが完了した時には必ず無効にしてください。
Document: Vellum Solver dynamics node


OpenCL Graph Coloring

有効にすると、OpenCLを用いてグラフ彩色を行う。

グラフカラーを実行した時、高速な並列の OpenCL アルゴリズムが使用されます。 残念なことに、これは四面体メッシュに対する他の計算と比べて 10 倍以上のメモリを必要とします。 そのため、その計算を収めるほどのメモリのないシステムでは、そのカラーパスは成功しません。 これを無効にすることで、すべてのグラフカラーを強制的に遅い逐次手法で処理させて、実際の計算にかかる RAM を抑えることができます。
Document: Vellum Solver dynamics node


有効にすると、OpenCL を用いた近傍検索を行う。