On this page |
概要
エージェントプリミティブは一種のパックプリミティブであり、通常では群衆シミュレーションのキャラクタ(エージェント)の表現に使用します。 他のタイプのパックプリミティブと同様に、エージェントプリミティブは単一ポイントを含んでいるので、たいていの状況ではパーティクルとして扱うことができます。
エージェント定義
エージェントプリミティブには、いくつかのデータの参照が記録されており、それらの参照がエージェントのコピー間で共有されていて、 エージェント定義 として参照されることが多いです。 エージェント定義は次のコンポーネントで構成しています: リグ, シェイプライブラリ, 一連のレイヤー, 一連のクリップ, オプションの一連のトランスフォームグループ。 エージェントの現在のレイヤーとトランスフォームは、エージェントをアンパックした時に生成されるジオメトリを決定します。
一連のエージェントプリミティブをディスクに保存した時、(パックジオメトリプリミティブと同様に)エージェント定義のコンポーネントもジオメトリファイルに埋め込まれます。 エージェント定義の各コンポーネントを別々にディスクに保存して、エージェントプリミティブから 外部参照 として扱うこともできます。 これによって、例えば群衆シミュレーションからフレームシーケンスを保存する時に大幅に冗長なデータを減らすことができます。 そのような場合では、(パックディスクプリミティブと同様に)エージェント定義のコンポーネント(例えば、シェイプライブラリ)のパスのみがジオメトリファイルに記録されます。 Agent ROPを使用すれば、既存エージェントプリミティブのエージェント定義をディスクに書き出したり、キャラクタリグまたはFBXファイルからエージェント定義を作成することができます。
リグ
リグには、エージェントのトランスフォーム階層(名前の付いたトランスフォームのツリー)が記録されています。 各トランスフォームは、単一の親を持っているか、または階層のルートのどちらかです。
リグは、JSON形式で記録されています。 階層は、親からその子のリストまでのマップとして表現されており、トランスフォーム名は任意の順番で表わすことができます。
{ "rig_version": 1, "transforms": { "root": ["LUpperArm", "RUpperArm"], "LUpperArm": ["LLowerArm"], "LLowerArm": [], "RUpperArm": ["RLowerArm"], "RLowerArm": [], } }
以下のVEX関数を使用することで、エージェントのリグに関する情報を照会することができます:
以下のHOMクラスとメソッドを使用することで、エージェントのリグに関する情報を照会したり、エージェントのリグを作成することができます:
シェイプライブラリ
シェイプライブラリには、エージェントで使用可能なジオメトリの集合体(シェイプ)が備わっています。 シェイプライブラリ内の各シェイプは、固有の名前を持っており、 静的 または 変形 のどちらかです。 例えばロボットの腕のような静的シェプは変形せず、トランスフォームだけさせることができます。 変形シェイプのジオメトリは、静止ポーズにし、ジオメトリがリグ内のトランスフォームからどのように影響を受けるのかを記述したキャプチャアトリビュートを含める必要があります。
各シェイプはパックプリミティブとして保存されており、name
Primitiveアトリビュートにはシェイプの名前が含まれていて、シェイプのジオメトリはパックプリミティブの中身です。
シェイプライブラリそのものは、通常のgeo/bgeo形式で単一ジオメトリファイルとしてディスクに保存されます。
shapelib_includes
文字列配列Detailアトリビュートを使用することで、シェイプライブラリを読み込む時に含めたい追加シェイプライブラリを指定することができます。
このアトリビュートはタプルサイズが2である必要があり、そこには短縮パス(例えば、$HIP
または$JOB
を基準としたパス)とシェイプライブラリファイルの絶対パスのペアを含めます。
以下のHOMクラスとメソッドを使用することで、エージェントのシェイプライブラリに関する情報を照会したり、シェイプライブラリを修正することができます:
レイヤー
レイヤーはエージェントのジオメトリを制御します: エージェントをアンパックした時に、シェイプライブラリからどのシェイプを使用するかどうか、さらにそれらのシェイプをどのようにトランスフォームするべきかどうか。
レイヤーは、一連の シェイプバインド で構成されています。これは、シェイプライブラリからシェイプをリグ内のトランスフォームに取り付けます(例えば、"sword_1"というシェイプを"RHand"トランスフォームに取り付けます)。 各シェイプバインドには、そのシェイプの境界ボックスのスケール係数を指定することもできます。
レイヤーは、静的または変形のシェイプバインドを別々のリストにして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クラスとメソッドを使用することで、エージェントのレイヤーに関する情報を照会したり、エージェントのレイヤーを作成または変更することができます:
クリップ
クリップには、エージェントのトランスフォームの駆動に使用することができるアニメーションデータが備わっています。
クリップは、通常の.bclip形式で保存されます。
エージェントのトランスフォームのチャンネルは、ローカル空間で記録され、その名前はtransform_name:channel
の形式になっています。channel
はt[xyz]
, r[xyz]
, s[xyz]
です。
Note
[srt]
チャンネルには、各ジョイントの完全なローカルトランスフォームを記述しており、プリトランスフォームがあった場合、ソースアニメーションのオブジェクトの[srt]
チャンネルには一致しません。
以下のVEX関数を使用することで、エージェントのクリップに関する情報を照会したり、エージェントのクリップを変更することができます:
以下のHOMクラスとメソッドを使用することで、エージェントのクリップに関する情報を照会したり、エージェントのクリップを作成または変更することができます:
トランスフォームグループ
トランスフォームグループは、エージェントのリグ内のトランスフォームの名前付きサブセットです。 エージェントのスケルトンの部分にクリップを適用する時に、このトランスフォームグループを使用することができます。 0から1までのウェイト値をグループの各メンバーに割り当てることもできます。
トランスフォームグループは、JSON書式で保存します。
{ "version": 2, "name": "upper_arms", "members": [ { "name": "LUpperArm", "weight": 1 }, { "name": "RUpperArm", "weight": 1 } ] }
以下のVEX関数を使用することで、エージェントのトランスフォームグループに関する情報を照会することができます:
以下のHOMクラスとメソッドを使用して、トランスフォームグループに関する情報を照会したり、トランスフォームグループを作成することができます:
エージェント毎のデータ
トランスフォーム
各エージェントには、一連の 現行トランスフォーム が記録されています(リグ内の各トランスフォームの4×4マトリックス)。 それらのトランスフォームは、(現行クリップの名前, 時間, ウェイトを設定することで)エージェントのアニメーションクリップによって駆動させることができたり、手動で制御することができます。
他のタイプのパックプリミティブと同様に、エージェントは、自身の位置を決めるための全体的なトランスフォーム(これは、P
とorient
のPointアトリビュートで制御します)も持ちます。
以下のVEX関数を使用することで、エージェントのトランスフォームを読み込んだり、修正することができます:
以下のHOMメソッドを使用することで、エージェントのトランスフォームを読み込んだり、修正することができます:
レイヤー
各エージェントは、そのエージェント定義からの 現行レイヤー を持ちます。このレイヤーは、エージェントをアンパックした時に使用されるジオメトリであり、ビューポートに表示されたり、レンダリングされます。
さらに、エージェントには Collisionレイヤー を持たせることができます。このレイヤーは、エージェントを簡易的に表示させる必要がある時(例えば、Bullet Solverを使ったラグドールシミュレーション)に使用されます。 Collisionレイヤーは、それが存在すれば、エージェントの境界ボックスを決定する時にも使用されます。
以下のVEX関数を使用することで、エージェントの現行レイヤーを読み込んだり、修正することができます:
以下のHOMメソッドを使用することで、エージェントの現行レイヤーを読み込んだり、修正することができます:
境界ボックス
エージェントにCollisionレイヤーがあれば、エージェントの境界ボックスを計算する時に、そのレイヤーが使用されます。 Collisionレイヤーが設定されていなければ、代わりにエージェントの現行レイヤーが使用されます。 レイヤーの境界ボックスは、そのレイヤーに参照されている各シェイプの境界ボックスを結合することで計算されます。
静的シェイプの場合、そのシェイプの境界ボックスは、そのシェイプバインドの境界スケールで拡張されてから、そのシェイプとバインドされているジョイントに応じてトランスフォームされます。 変形シェイプの場合、そのシェイプの境界ボックスは、Capture Weightに参照されているジョイントの位置から計算されてから、そのシェイプバインドの境界スケールで拡張されます。
See also |