On this page |
概要 ¶
Houdiniは Alembic (.abc
)ファイルの読み書きをサポートしています。
Alembicとは、ジオメトリとアニメーションのオープン交換フォーマットです。
初期の頃は、Sony Pictures ImageworksとIndustrial Light & Magicのチームによって開発されていました。
Houdiniは 要求に応じて読み込み可能な(Demand-loaded) Alembicデータに対応しています。 Alembicファイルのジオメトリをメモリにコピーすることなく、ビューアで表示することができます。 そして、Mantraは、AlembicのファイルからジオメトリをすべてRAMに読み込むのではなく、“ストリーム”することができます。 ジオメトリノードは、ポイントを動かさない“要求に応じて読み込まれた(Demand-loaded)”Alembicプリミティブに適用することができます。 さらに、AlembicデータをHoudiniのジオメトリとして読み込むこともできるので、そのサーフェスを編集することができます。
重いデータセットを取り扱うために、Houdiniでは同時にAlembicファイルの一部のみを読み込む方法が用意されています。 例えば、Alembic階層の特定のオブジェクトだけを読み込んだり、境界ボックス内のジオメトリだけを読み込んだり、境界ボックスやポイントとしてジオメトリを読み込み/表示することができます。
HoudiniはジオメトリをアニメーションをAlembicアーカイブに“レンダー”することもできます。
インポート ¶
Alembicシーンのインポートには2通りの方法があります。 1つ目が、Alembic SOPを使って全体のシーンを単一のジオメトリに読み込む方法です。 2つ目が、Alembic Archiveオブジェクトを使ってAlembicシーンを表現したオブジェクトレベルの階層を作成する方法です。
-
Houdiniは、Alembic SOPを使ってAlembicファイルの特定のジオメトリをGeometry objectに読み込むことができます。
Demand-loaded Alembicプリミティブ としてジオメトリを読み込むか、実際のHoudiniのジオメトリとして読み込むのか選択することができます。 Alembicプリミティブは少ないメモリで変換が可能ですが、ジオメトリを編集(ポイントの移動)することができません。 Houdiniのジオメトリとして読み込めばポイントを移動させることができますが、メモリが必要になります。
-
Alembicファイルのオブジェクト階層を使用するには、Alembic Archiveオブジェクトを使います。
オブジェクトのパラメータには、そのオブジェクトの内部のAlembic Transformオブジェクトのネットワークを構築するコントロールがあります。 Alembic階層をHoudiniサブネットワークとして複製するか、Alembicオブジェクトをすべて並べて読み込むか選択することができます。
メインメニューから File ▸ Import ▸ Alembic Scene を選択すると簡単にAlembic Archiveオブジェクトをセットアップすることができます。
メソッド |
長所 |
短所 |
---|---|---|
Alembic SOPの使用 |
これは静的なジオメトリをインポートするのにおそらく最速な方法です。 すべてのノードが別々のグループに分けられますが、グループの数が膨大になると、Houdiniでは管理が難しくなる場合があります。 メモリの効率が良いです。 |
アニメーションジオメトリは処理が遅くなる場合があります。その理由は、新しいオブジェクトトランスフォームを読み込むだけでなく、ジオメトリを変形しなければならないからです。 アトリビュートはすべてのオブジェクトで共有されます。 例えば、1個のオブジェクトだけがUV座標を失ってしまうと、HoudiniジオメトリがUV座標を持っていても、そのオブジェクトは無効な値を持つことになります。 |
Alembic Archiveオブジェクト |
一度シーンが読み込まれると、フレームが変わる度にアニメーションオブジェクトだけが更新され、変形するジオメトリを持つオブジェクトのみが処理されます。 これによって、おそらく再生パフォーマンスが速くなることでしょう。 |
Houdiniのオブジェクトは単純なジオメトリよりももっとリソースを消費する可能性があります。 ノード毎にShapeノードとして単純なボックスを含んだAlembicノードが膨大にあるシーンでは、Houdiniで全体のAlembicツリーを再構築するのが効率が悪くなる場合があります。 |
エクスポート ¶
-
Alembicファイルにエクスポートするには、Alembicレンダーノードを作成します。
-
Houdiniは、便宜的にジオメトリネットワーク内に直接Alembicレンダーノードを作成することができます。 これはジオメトリを直接レンダーノードに接続して、そのジオメトリだけをエクスポートすることができます。
重要: ジオメトリレベルでAlembicレンダーノードを使う時でさえ、Alembicファイルは そのジオメトリを含んだオブジェクトのトランスフォーム も考慮されます。
-
アニメーションをエクスポートするには、レンダーノードのパラメータで、 Valid Frame Range を“Render Frame Range”に設定します。 Alembic File にはAlembicファイルのファイル名を設定します。
(ファイル名に
$F
を 使わないで ください。Alembicレンダーノードは、画像をレンダリングするときにファイル名に$F
を使っていなくてもファイルを上書きすることなく、アニメーションの複数フレームを単一のAlembicファイルにちゃんとレンダリングします。) -
メインメニューから File ▸ Export ▸ Alembic を選択すれば、簡単に
/out
ネットワークにAlembicレンダーノードをセットアップすることができます。
双方向 ¶
AlembicファイルをHoudiniにインポートし、それを修正して、新しいAlembicアーカイブを同じ階層でエクスポートしたいことがよくあります。
Tip
HoudiniのImportとExportのサポートを使用することで、既存アーカイブを結合して、新しく結合したアーカイブを作成することができます。
-
AlembicファイルをAlembic Archiveオブジェクトとしてインポートする場合、それと同じ階層を出力するには、Alembicレンダーノードを使用するのが簡単です。
-
Alembicジオメトリノードを使用して、ジオメトリ(SOP)レベルでAlembicファイルをインポートする場合、そのノードには、元のアーカイブ内の形状のパスをHoudiniプリミティブの
path
文字列アトリビュートに記録するためのオプション( Add path attribute , デフォルトでオン)があります。例えば、/octopus_low/octopus_lowShape
です。Alembicレンダーノードは、( Build hierarchy from attribute パラメータがオンの時に)そのpath
アトリビュートを使用して、元の階層を再構築することができます。 -
エクスポートしたジオメトリに“パックAlembic”プリミティブ(ディスク上のAlembicファイルからジオメトリを取得するパックプリミティブのタイプ)が含まれていれば、Houdiniは、元のファイルから直接そのデータをコピーします。
起こり得る双方向問題と回避策に関する情報は、技術的な制約を参照してください。
ノード ¶
このオブジェクトはAlembicインポートの最上位に位置し、AlembicファイルのデータからHoudiniのオブジェクトノードを構築するコントロールが用意されています。 このノードの内部には、Alembicファイルのトランスフォームを意味するAlembic Transformオブジェクトがあります。
このオブジェクトは、Alembicファイルのトランスフォームを意味します。 このノードの内部には、実際にデータを読み込むAlembic SOPがあります。
AlembicデータをDemand-loaded Alembicプリミティブとして読み込むか、または実際のHoudiniジオメトリとして読み込むのか選択することができます。
このシェーダは、レンダリング時にAlembicファイルからデータを読み込みます。
-
通常では直接このシェーダを使う必要はありません。その理由は、Alembic ArchiveオブジェクトやAlembic SOPを使うと自動的にこのシェーダがセットアップされるからです。 しかし、このProceduralシェーダには役に立ちそうな技術的な機能が2つあります。
-
Alembic ユーザプロパティ をHoudiniのパラメータに読み込み/再マップすることができます。
-
別のAlembicファイルからアトリビュートをインポートすることができます。 これにより、例えば、アーティストがファイルの1つのコピーをアニメーションで使い、 テクニカルディレクタがもう1つのコピーでUVを付け、 レンダリング時にアニメーションを付けたファイルにUVを読み込むことができます。
HoudiniのジオメトリをAlembicファイルに“レンダー”します。 このレンダーノードは、便宜的に直接ジオメトリ(SOP)ネットワークに配置することができます。
Alembic-Houdiniのモデルミスマッチ ¶
-
Houdiniは、階層で配置された オブジェクト を使ってシーンを表現し、そのオブジェクトには、平坦な(階層になっていない)ジオメトリを生成する ジオメトリネットワーク が含まれています。
-
Alembicは、“オブジェクトノード”の階層を使ってシーンを表現し、そのいくつかのノードには、個々のジオメトリを持つ“シェイプノード”が含まれています。
これら2つのモデル間のミスマッチは、HoudiniでAlembicデータを“双方向”にやり取りするのに、膨大な数の“取り組み”が必要になります。
ジオメトリ変換 ¶
-
現在では、Houdiniはオブジェクト階層のインポート/エクスポート、ジオメトリのインポート/エクスポート、カメラのインポート/エクスポートに対応しています。
-
以下にAlembicとHoudiniのジオメトリタイプ間の変換に関するテーブルを載せます:
Alembicジオメトリ
Houdiniジオメトリ
Face Sets
Primitive groups
Subdivision Surfaces meshes
Polygon primitives
Polygon Meshes
Polygon primitives
Curve Sets
Open polygon primitives
Point Sets
Particle primitives
NuPatches
NURBS surface primitives
Shape nodes
Geometry groups
-
Houdiniは、AlembicジオメトリスコープとHoudiniアトリビュートタイプ間を変換します。そのマッチングは不完全ですが、一般的には以下のとおりです:
Alembicスコープ
Houdiniアトリビュートタイプ
Constant
Detail
Uniform
Primitive
Facevarying
Vertex
Vertex, Varying
Point
-
AlembicはHoudiniのすべてのジオメトリタイプをサポートしていないので、エクスポート時に、Houdiniジオメトリが複数のAlembicシェイプに“精製”されることがあります。 Alembicでは同階層レベルのシェイプが固有の名前である必要があるので、Houdiniは、それらのシェイプが作成できるように名前を変更します(例えば、
mesh
,mesh_1
,mesh_2
)。 -
新しいジオメトリグループはAlembic Shapeノード毎に作成されます。 グループ名はそのノードへのパスを誤魔化したバージョンです。その理由は、Houdiniのグループ名は有効な文字列の制限があるからです。
-
Polygon Meshプリミティブに関しては、レンダーノードは、それを含んだオブジェクトがPolygons as subdivisionまたは
ri_rendersubd
トグルプロパティのどちらを有効にしているのかチェックします。 どちらかが有効になっていれば、レンダーノードはPolygon MeshをAlembic Subdivision Meshとして出力します。 -
現在では、Alembicレンダーノードは、対応していないジオメトリすべてをPolygon Mesh、Curve Mesh、Point Setのどれかに変換します。
-
Alembic UVは2エレメントしか持たないのに対し、Houdini UVは3エレメント持ちます。
-
Alembicサブディビジョンサーフェスは、法線アトリビュートをファーストクラスアトリビュートとして保存しません。
可視性 ¶
Alembicの可視性は、“下から上に”計算されます: ノードは、可視、不可視、“deferred(遅延)”に指定することができます。つまり、“deferred(遅延)”になっていない階層の次に高いノードから可視性を取得します。 Houdiniの可視性は、“上から下に”計算されます: オブジェクトの可視性の設定が、その階層内のすべてのサブオブジェクトの可視性を決定します。
この違いから、Alembic Archiveオブジェクトを使用してAlembicアーカイブを読み込んだ時に問題が生じます。 デフォルトでは、 Flatten Visibility Evaluation パラメータが有効になっています。 これは、そのアーカイブオブジェクト内のすべてのAlembic Xformオブジェクトが可視になるように設定し、そのオブジェクト内のジオメトリにその可視性の設定を押し付けます。 それによって、フレーム毎に正しくジオメトリが可視になります。
とはいえ、これは双方向のやり取りには向いていません。なぜなら、Alembicファイル内のすべてのオブジェクトの可視性を書き換える可能性があるからです。 元の可視性の情報を維持することが重要な時は、アーカイブに対して Flatten Visibility Evaluation を無効にすることができます。 とはいえ、HoudiniがそのAlembicジオメトリをビューポート内で間違えて表示してしまう可能性があります。
Mayaカメラの取り扱い方 ¶
Mayaカメラモデルは、2つの“ゲート”を使用して動作しています: film gate と resolution gate 。film gate
は、カメラから見えるもの、resolution gate
は、レンダリングされるものです。
Mayaカメラには、Houdiniに相当するものがない lens squeeze アトリビュートというのがあります。そのアトリビュートを考慮して、HoudiniカメラをMaya film gateに合わせるには、以下の方程式が真でなければなりません:
-
a = 10h * l
-
p = (h * l * resy) / (v * resx)
意味:
-
h
= Alembic horizontal aperture -
v
= Alembic vertical aperture -
l
= Alembic lens squeeze -
a
= Houdini aperture -
p
= Houdini pixel aspect ratio -
resx
,resy
= Houdini X/Y resolution (ピクセル)
Houdiniカメラは、常にMayaカメラのfilm gateと同じものをキャプチャします。Houdiniカメラの Resolution を変更しても、Mayaの Resolution の変更と同じに なりません 。
-
Mayaでは、Resolutionを変更すると、アスペクト比を変更し、その結果、Resolution GateがFilm Gate内にフィットするように変わります。
-
Houdiniでは、Film Gateの内容がまだ表示されるように、上記の方程式を使用して Aperture と Pixel Aspect Ratio を調整します。MayaのFilm GateとResolution Gate間の関係性を模倣するには、Houdiniカメラの Crop パラメータを使用します。ネガティブクロップ(オーバースキャン)には対応していません。
Mayaカメラ |
Alembicカメラ |
Houdiniカメラ |
メモ |
---|---|---|---|
Focal length |
Focal length |
Focal length |
|
H. camera aperture |
H. aperture |
Aperture |
|
V. camera aperture |
Vertical aperture |
None |
|
H. film offset |
H. film offset |
Screen window X |
|
V. film offset |
V. film offset |
Screen window Y |
|
Lens squeeze ratio |
Lens squeeze ratio |
None |
|
Pre/Post/Camera scale |
FilmBackXformOps |
Screen window size |
|
Shutter open/close |
Shutter open/close |
Shutter time |
|
F stop |
同じ |
同じ |
|
Focus distance |
同じ |
同じ |
|
Near clip plane |
Near clipping plane |
Near clipping |
|
Far clip plane |
Far clipping plane |
Far clipping |
Tips ¶
-
現在のところ、Alembicのライトとマテリアルには対応していません。
-
Alembic Importノードは、Alembicジオメトリを実際のジオメトリではなく、境界ボックスやポイントクラウドとして読み込むことができます。 これは、そのジオメトリの情報だけが必要なときや、非常に膨大なファイルを可視化するのにも役に立ちます。
-
Alembic Importノードでは、特定のジオメトリタイプのみ、特定の境界ボックス内のオブジェクトのみ、アニメーションオブジェクトのみ、アニメーションなしのオブジェクトのみを読み込むようにすることができます。 (読み込むオブジェクトのリストは、フレーム毎に更新されるので、例えば、オブジェクトが境界ボックスを通過する時に、現れたり消えたりすることができます。)
-
Houdiniは通常ではAlembic Archiveオブジェクトで作成されたオブジェクト間に チャンネル参照 を作成します。 これらのチャンネル参照は非常に膨大なAlembicファイルを扱う時に遅くなる可能性があり、あるパラメータを変更する度に再クックします。
非常に膨大なAlembicファイルを扱う時は、Alembic Archiveオブジェクトのパラメータの Build Hierarchy With Channel References をオフにしてみてください。 これにより、チャンネル参照なしでオブジェクトを構築するので、再ククが速くなります。 実際に子ノードのパラメータを更新したい時は、Alembic Archiveノードのパラメータの Push Parameters To Children をクリックしてください。
-
Alembic Archiveオブジェクト内に あなたが作成したオブジェクトを配置しないでください 。 Alembic Archiveノードがネットワークを再構築すると、それらのオブジェクトが削除されてしまいます。
-
Demand-loaded AlembicプリミティブとしてAlembicジオメトリを読み込んだ後は、後でConvert SOPを使ってHoudiniのジオメトリに変換することができます。
-
Alembic Importノードの Remap Attributes を使えば、Alembic固有のアトリビュート名をHoudiniの名前に変更することができます。
-
Alembic Proceduralシェーダの Attribute File パラメータを使えば、別のAlembicファイルから特定のジオメトリアトリビュートを引き出すことができます。
オープンソース ¶
HoudiniのAlembic対応は、いくつかのプラグイン(SOP、OTLなど)で用意されています。 Houdiniのインストールでは、プラグイン用のソースコードが入っています。 Side Effects Software Inc.は改善内容をAlembicプロジェクトにフィードバックすることを約束しています。
技術的な制約 ¶
以下の制約は、ジオメトリ(SOP)レベルでのAlembicジオメトリの双方向のやり取りに適用されます。
-
エクスポート時に、Alembicレンダーノードは、Houdiniネットワーク階層に相当するAlembicノードを作成します。これは、
path
アトリビュートを持たないシェイプノードの格納場所です。すべてのジオメトリに有効なpath
値があれば、このノードは作成されません。 -
Alembicレンダーノードがパックプリミティブを書き出す時、“Packed Mode”を“Transformed Shape”に設定または“Use Instancing WHere Possible”を有効にすると、親オブジェクトとジオメトリオブジェクトの間に追加でトランスフォームオブジェクトを挿入し、パックジオメトリのローカルトランスフォームを保持します。