Houdini 17.5 群衆シミュレーション

エージェントプリミティブ

群衆シミュレーションの要員である動く"アクター"であるエージェントについて説明します。

On this page

概要

エージェントプリミティブは一種のパックプリミティブであり、通常では群衆シミュレーションのキャラクタ(エージェント)の表現に使用します。 他のタイプのパックプリミティブと同様に、エージェントプリミティブは単一ポイントを含んでいるので、たいていの状況ではパーティクルとして扱うことができます。

エージェント定義

エージェントプリミティブには、いくつかのデータの参照が記録されており、それらの参照がエージェントのコピー間で共有されていて、 エージェント定義 として参照されることが多いです。 エージェント定義は次のコンポーネントで構成しています: リグ, シェイプライブラリ, 一連のレイヤー, 一連のクリップ, オプションの一連のトランスフォームグループ。 エージェントの現在のレイヤーとトランスフォームは、エージェントをアンパックした時に生成されるジオメトリを決定します。

一連のエージェントプリミティブをディスクに保存した時、(パックジオメトリプリミティブと同様に)エージェント定義のコンポーネントもジオメトリファイルに埋め込まれます。 エージェント定義の各コンポーネントを別々にディスクに保存して、エージェントプリミティブから 外部参照 として扱うこともできます。 これによって、例えば群衆シミュレーションからフレームシーケンスを保存する時に大幅に冗長なデータを減らすことができます。 そのような場合では、(パックディスクプリミティブと同様に)エージェント定義のコンポーネント(例えば、シェイプライブラリ)のパスのみがジオメトリファイルに記録されます。 Agent ROPを使用すれば、既存エージェントプリミティブのエージェント定義をディスクに書き出したり、キャラクタリグまたはFBXファイルからエージェント定義を作成することができます。

リグ

リグには、エージェントのトランスフォーム階層(名前の付いたトランスフォームのツリー)が記録されています。 各トランスフォームは、単一の親を持っているか、または階層のルートのどちらかです。

File Format
VEX Functions
HOM

リグは、JSON形式で記録されています。 階層は、親からその子のリストまでのマップとして表現されており、トランスフォーム名は任意の順番で表わすことができます。

{
    "rig_version": 1,
    "transforms": {
        "root": ["LUpperArm", "RUpperArm"],
        "LUpperArm": ["LLowerArm"],
        "LLowerArm": [],
        "RUpperArm": ["RLowerArm"],
        "RLowerArm": [],
    }
}

以下のVEX関数を使用することで、エージェントのリグに関する情報を照会することができます:

以下のHOMクラスとメソッドを使用することで、エージェントのリグに関する情報を照会したり、エージェントのリグを作成することができます:

シェイプライブラリ

シェイプライブラリには、エージェントで使用可能なジオメトリの集合体(シェイプ)が備わっています。 シェイプライブラリ内の各シェイプは、固有の名前を持っており、 静的 または 変形 のどちらかです。 例えばロボットの腕のような静的シェプは変形せず、トランスフォームだけさせることができます。 変形シェイプのジオメトリは、静止ポーズにし、ジオメトリがリグ内のトランスフォームからどのように影響を受けるのかを記述したキャプチャアトリビュートを含める必要があります。

File Format
HOM

各シェイプはパックプリミティブとして保存されており、namePrimitiveアトリビュートにはシェイプの名前が含まれていて、シェイプのジオメトリはパックプリミティブの中身です。 シェイプライブラリそのものは、通常のgeo/bgeo形式で単一ジオメトリファイルとしてディスクに保存されます。

shapelib_includes文字列配列Detailアトリビュートを使用することで、シェイプライブラリを読み込む時に含めたい追加シェイプライブラリを指定することができます。 このアトリビュートはタプルサイズが2である必要があり、そこには短縮パス(例えば、$HIPまたは$JOBを基準としたパス)とシェイプライブラリファイルの絶対パスのペアを含めます。

以下のHOMクラスとメソッドを使用することで、エージェントのシェイプライブラリに関する情報を照会したり、シェイプライブラリを修正することができます:

レイヤー

レイヤーはエージェントのジオメトリを制御します: エージェントをアンパックした時に、シェイプライブラリからどのシェイプを使用するかどうか、さらにそれらのシェイプをどのようにトランスフォームするべきかどうか。

レイヤーは、一連の シェイプバインド で構成されています。これは、シェイプライブラリからシェイプをリグ内のトランスフォームに取り付けます(例えば、"sword_1"というシェイプを"RHand"トランスフォームに取り付けます)。 各シェイプバインドには、そのシェイプの境界ボックスのスケール係数を指定することもできます。

File Format
VEX Functions
HOM

レイヤーは、静的または変形のシェイプバインドを別々のリストにしてJSON形式で記録されています。

{
    "version": 1,
    "name": "soldier_display",
    "static": [
        {
            "transform": "LLowerArm",
            "shape": "shield",
            "bounds_scale": 1
        },
        {
            "transform": "RLowerArm",
            "shape": "sword",
            "bounds_scale": 1
        }
    ],
    "deforming": [
        {
            "transform": "root",
            "shape": "skin",
            "bounds_scale": 1
        }
    ]
}

以下のVEX関数を使用することで、エージェントのレイヤーに関する情報を照会したり、エージェントのレイヤーを変更することができます:

以下のHOMクラスとメソッドを使用することで、エージェントのレイヤーに関する情報を照会したり、エージェントのレイヤーを作成または変更することができます:

クリップ

クリップには、エージェントのトランスフォームの駆動に使用することができるアニメーションデータが備わっています。

File Format
VEX Functions
HOM

クリップは、通常の.bclip形式で保存されます。

エージェントのトランスフォームのチャンネルは、ローカル空間で記録され、その名前はtransform_name:channelの形式になっています。channelt[xyz], r[xyz], s[xyz]です。

Note

[srt]チャンネルには、各ジョイントの完全なローカルトランスフォームを記述しており、プリトランスフォームがあった場合、ソースアニメーションのオブジェクトの[srt]チャンネルには一致しません。

以下のVEX関数を使用することで、エージェントのクリップに関する情報を照会したり、エージェントのクリップを変更することができます:

以下のHOMクラスとメソッドを使用することで、エージェントのクリップに関する情報を照会したり、エージェントのクリップを作成または変更することができます:

トランスフォームグループ

トランスフォームグループは、エージェントのリグ内のトランスフォームの名前付きサブセットです。 エージェントのスケルトンの部分にクリップを適用する時に、このトランスフォームグループを使用することができます。 0から1までのウェイト値をグループの各メンバーに割り当てることもできます。

File Format
VEX Functions
HOM

トランスフォームグループは、JSON書式で保存します。

{
    "version": 2,
    "name": "upper_arms",
    "members": [
        {
            "name": "LUpperArm",
            "weight": 1
        },
        {
            "name": "RUpperArm",
            "weight": 1
        }
    ]
}

以下のVEX関数を使用することで、エージェントのトランスフォームグループに関する情報を照会することができます:

以下のHOMクラスとメソッドを使用して、トランスフォームグループに関する情報を照会したり、トランスフォームグループを作成することができます:

エージェント毎のデータ

トランスフォーム

概要
VEX Functions
HOM

各エージェントには、一連の 現行トランスフォーム が記録されています(リグ内の各トランスフォームの4×4マトリックス)。 それらのトランスフォームは、(現行クリップの名前, 時間, ウェイトを設定することで)エージェントのアニメーションクリップによって駆動させることができたり、手動で制御することができます。

他のタイプのパックプリミティブと同様に、エージェントは、自身の位置を決めるための全体的なトランスフォーム(これは、PorientのPointアトリビュートで制御します)も持ちます。

以下のHOMメソッドを使用することで、エージェントのトランスフォームを読み込んだり、修正することができます:

レイヤー

概要
VEX Functions
HOM

各エージェントは、そのエージェント定義からの 現行レイヤー を持ちます。このレイヤーは、エージェントをアンパックした時に使用されるジオメトリであり、ビューポートに表示されたり、レンダリングされます。

さらに、エージェントには Collisionレイヤー を持たせることができます。このレイヤーは、エージェントを簡易的に表示させる必要がある時(例えば、Bullet Solverを使ったラグドールシミュレーション)に使用されます。 Collisionレイヤーは、それが存在すれば、エージェントの境界ボックスを決定する時にも使用されます。

以下のVEX関数を使用することで、エージェントの現行レイヤーを読み込んだり、修正することができます:

以下のHOMメソッドを使用することで、エージェントの現行レイヤーを読み込んだり、修正することができます:

境界ボックス

エージェントにCollisionレイヤーがあれば、エージェントの境界ボックスを計算する時に、そのレイヤーが使用されます。 Collisionレイヤーが設定されていなければ、代わりにエージェントの現行レイヤーが使用されます。 レイヤーの境界ボックスは、そのレイヤーに参照されている各シェイプの境界ボックスを結合することで計算されます。

静的シェイプの場合、そのシェイプの境界ボックスは、そのシェイプバインドの境界スケールで拡張されてから、そのシェイプとバインドされているジョイントに応じてトランスフォームされます。 変形シェイプの場合、そのシェイプの境界ボックスは、Capture Weightに参照されているジョイントの位置から計算されてから、そのシェイプバインドの境界スケールで拡張されます。

See also

群衆シミュレーション

はじめよう

  • 基本

    Houdiniにおける群衆シミュレーションの考え方の概要を説明します。

  • セットアップ

    群衆シミュレーションのセットアップと編集の方法

動くパーツ

  • エージェント

    群衆シミュレーションの要員である動く"アクター"であるエージェントについて説明します。

  • ステート

    各エージェントのアニメーションや仕草を制御する仮想的な"雰囲気"。

  • トリガー

    エージェントの状態を変更する条件を指定する方法です。

  • キャッシュ

    群衆シミュレーションの効率的なキャッシュ化と読み込みのTips。

挙動

外観

  • 多様性

    エージェントに異なる外観と行動を作成することで、より現実的な群衆を作成する方法。

  • 布の取り付け

    Vellum Clothをエージェントシェイプジオメトリの一部として追加/拘束すれば、エージェントの動きに基づいて布をシミュレーションすることができます。

地形

  • 足の着地

    エージェントのアニメーションを地形に適応させて滑りを回避するためのセットアップ方法。

  • 地形

    エージェントが歩く地形ジオメトリを指定する方法です。

  • 障害物

    エージェントが回避する障害物を設定する方法です。