On this page

アスキー.geoとバイナリ.bgeoファイルフォーマットは、Houdiniジオメトリを保存する標準フォーマットです。.geoフォーマットにはHoudiniのジオメトリディテールに含まれた情報すべてが記録されています。

ヘッダセクション

Magic Number: PGEOMETRY
Point/Prim Counts: NPoints # NPrims #
Group Counts: NPointGroups # NPrimGroups #
Attribute Counts: NPointAttrib # NVertexAttrib # NPrimAttrib # NAttrib #     

これらのケースでは、#は記述するエレメントの番号を意味します。グループには名前を付けて、ポイントまたはプリミティブを含めて定義します。ポイントやプリミティブは、いくつものグループのメンバーになることができます。したがって、メンバーシップは1グループにのみ属するわけではありません。

GPDのアトリビュートは一般化されています。アトリビュートはポイント単位、頂点単位、プリミティブ単位、ディテール単位で割り当てることができます。そのため、アトリビュートの数はファイルの上部で宣言します。後で、それらのアトリビュートを完全に定義します。

アトリビュート定義

内部的に各エレメントに関連したアトリビュートは"辞書"で定義しています。これらの辞書ではアトリビュートの名前、タイプ、サイズを定義します。またアトリビュートのデフォルト値も辞書に記録しています。

辞書を保存したとき、各アトリビュート(特定の順番で)が定義されます。定義は基本的には以下の通りです:

Name Size Type Default

例えば、法線のアトリビュート名は"N"です。つまりアトリビュート定義は次のようになります:

N 3 float 0 0 0

アトリビュート名に"N"を指定するとエレメントは3つ、タイプはFloatになります。デフォルト値は(0, 0, 0)です。

エレメント定義の後には、エレメントに関係するアトリビュートデータを定義します。アトリビュートデータを記述するには括弧を付けます。アトリビュートデータは定義したエレメントの辞書の順番で表示します。

例えば、辞書は次のようになります:

PointAttrib
Cd 3 float 0 0 0 # Color attrib., 3 floats, default 0 0 0
Alpha 1 float 1 # Alpha attribute, 1 float, default 1
N 3 float 0 0 0 # Normal attribute
uv 2 float 0 0 # Texture coordinate     

ポイントのデータは次のようになります:

0 0 0 1 (1 0 0 1 0 0 1 .5 .5)
^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ Position Attributes 

ポイントは次の情報を持ちます:

Cd = (1, 0, 0)
Alpha = 1
N = (0 0 1)
uv = (.5, .5) 

アトリビュートデータのタイプは、integer、float、string、indexをサポートしています。"string"タイプは、32文字として記録されます。というのは、各アトリビュートは固定長でなければならないからです。integerとfloatタイプはそのままの意味です。indexアトリビュートタイプは、マテリアルのようなものを指定するのに使います。このタイプには文字列のリストが含まれていて、そのリストの項目を整数値でインデックス化しています。従って、indexアトリビュートはintegerとして記録されています。indexアトリビュートの定義では、アトリビュート値も定義します。

mat 1 index 3 marble gold crystal_glass3    

indexアトリビュートすべてのデフォルト値は、-1で、これはアトリビュートが割り当てられていないことを意味します。

ポイント定義

Pointアトリビュートがあれば、アトリビュート辞書はポイント定義の前に保存します。

Dictionary Name: PointAttrib
Dictionary Data: -- Attribute Definition --     

アトリビュート辞書の後には、ポイントのポイントデータを定義します。各ポイントは4つのコンポーネント(x,y,z,w)で記録します。ポジションは実際の同次座標ではありません。同次座標を得るには、単純に各x,y,zwを乗算するだけです。

アトリビュートデータはポイントポジションの後に定義します。アトリビュートデータは括弧"()"で閉じます。

プリミティブ/頂点の定義

Vertexアトリビュートがあれば、頂点の辞書がここで見つかります。

Vertexアトリビュートの辞書の後に、Primitiveアトリビュートの辞書(プリミティブのアトリビュートがあれば)を定義します。

すべてのプリミティブにはローカル情報があり、それを保存する必要があるため、すべてのプリミティブのフォーマットが異なります。一般的には書式は次の通り:

PrimKey <local_information> [attributes]    

ここではlocal_informationが特定のプリミティブです。

ローカル情報の一部として、頂点を複数指定します。各頂点は同じ書式で保存します。書式は次の通り:

point_number attribute_data    

ポイント番号は0から number of points - 1まであります。Vertexアトリビュートデータがあれば、データは括弧()で閉じます。Primitiveアトリビュートデータがあれば、大括弧[]で閉じます。

各プリミティブには固有のIDがあります。現在のプリミティブとIDは次の通り:

Polygon: "Poly"
NURBS Curve: "NURBCurve"
Rational Bezier Curve: "BezierCurve"
Linear Patch: "Mesh"
NURBS Surface: "NURBMesh"
Rational Bezier Patch: "BezierMesh"
Ellipse/Circle: "Circle"
Ellipsoid/Sphere: "Sphere"
Tube/Cone: "Tube" Metaball "MetaBall"
Meta Super-Quadric: "MetaSQuad"
Particle System:  "Part"
Paste Hierarchy: "PasteSurf"     

プリミティブキーは大文字小文字の区別があります。例:

VertexAttrib
uv 3 float 0 0 0
PrimitiveAttrib
Cd 3 float 0 0 0
Poly 3 < 0 (1 0.5 0) 1 (0 0 0) 2 (0 1 0) [1 1 0 .5]     

これは閉じたポリゴン(以下参照)を指定しています。これには3つの頂点参照ポイント0,1,2があります。各頂点には3Dテクスチャ座標があり、()で指定します。ポリゴンにはカラーとアルファを[]で指定します。ここではカラーは黄色でアルファを50%にしています。

同じタイプのプリミティブが2つ以上連続した時は、これはプリミティブのrunとして指定します。このケースでは、次のコードをファイルで定義します:

Run # PrimKey    

#はrunのプリミティブの番号です。このケースでは、次のプリミティブがPrimKeyのIDで保存されません。その理由は、runで暗黙になっているからです。

POLYGONローカル情報書式

#Vtx OpenClose Vertex_List    

意味:

#Vtx

ポリゴンの頂点の数

OpenClose

1文字フラグ: "<" = 閉じたフェース ":" = 開いたフェース

NURBS / BEZIER CURVEローカル情報書式

#Vtx OpenClose Basis Vertex_List    

NURBSとBezierプリミティブはどちらも基底定義から始めます:

Keyword Order    

意味:

Keyword

"基底"

Order

基底の階数(次数 + 1)

NURBS基底

NURBS基底には終了条件フラグと昇順に並んだノットのリストが必要です。NURBS基底の完全な定義は次の通り:

Keyword Order EndCondition Knots        

意味:

EndCondition

endは終了CVに設定し、noendはそれ以外

Knots

昇順で浮動小数点

リストのノットの数は基底の階数、終了条件、Vertex_ListのCVの数、OpenCloseフラグで決まります。

#Kには予想されるノットの数で、#VtxはCVの数、それからEndConditionはfalse(noend)とすると

#K = #Vtx + Order - 2        

2つの見つからないendノット(もし閉じるならば、さらに周期性ノット)が内部的に生成されます。EndConditionがtrue(end)なら:

カーブを開くなら、#K = #Vtx - Order + 2カーブを閉じるなら#K = #Vtx - Order + 3

Bezier基底

Bezier基底は、もしノットが0から始まり、単位毎に増える(例えば、0 1 2 3 …)ならばノットのリストは不要です。Bezier基底の完全な定義は次の通り:

Keyword Order Knots        

リストのノットの数は、基底の階数, Vertex_ListのCVの数, OpenCloseフラグで決まります。

#Kには予想されるノットの数で、#VtxはCVの数:

  • カーブを開くなら#K = (#Vtx-1) / (Order-1) + 1 カーブを閉じるなら #K = (#Vtx ) / (Order-1)

  • カーブを閉じるなら、周期性ノットは内部的に生成されます。

MESHローカル情報書式

#Cols #Rows UWrap VWrap connectivity    

意味:

UWrap / VWrap

"open" または "wrap"はそれぞれ列または行です。

connectivity

rows = 行のみ, cols = 列のみ, rowcol = 行と列, quad = 四角形, tri = 三角形, atri = 交互の三角形

ほとんどのケースで接続性は無視されますが、スイープやポリゴンへの変換のようなオペレーションでは致命的です。

Tri(Triangulated)とAtri(Alternate)メッシュは以下の違いがあります:

NURBS / Bezier SURFACEローカル情報書式

#Cols #Rows UWrap VWrap connectivity UBasis VBasis    

#Cols, #Rows, UWrap, VWrap, connectivity, Vertex_Listはメッシュで同じです。

UBasis / VBasisはNURBS / Bezierカーブと同じです。

Profilesはプロファイルカーブ(サーフェス上のカーブ)のオプションのリストです。プロファイルセクションの構造は、メインジオメトリの構造と非常に似ていて、ヘッダセクション、ポイント、プリミティブ、ポイントとプリミティブのグループを含みます。違いは、このセクションがアトリビュートを持たないことと、4つのプリミティブタイプ(ポリゴン, NURBSカーブ, Bezierカーブ, Trimシーケンス)しかもたないということです。

プロファイルのヘッダは、"Profiles:"です。プロファイルがなければ、"none"の後に定義していきます。プロファイルがあれば、プロファイルセクションには次の構造があります:

Point/Prim Counts

NPoints # NPrims #

Group Counts

NPointGroups # NPrimGroups #

TrimLevel #

ネスト化したトリムループのsea-levelを意味する番号 プラスまたはマイナスのどちらかになります。通常は0

Point list

u v w の組

Primitive list

ポリゴン、NURBS/Bezierカーブ、Trimシーケンス

Point groups

ポイントグループ定義

Prim. groups

プリミティブグループ定義

ヘッダセクション

Point/Prim Counts:

NPoints # NPrims # NLoops #

Group Counts:

NPointGroups # NPrimGroups #

これらのケースでは、#は記述したエレメントの番号を意味します。

Nested trim level:

TrimLevel #

このケースでは、#はネストしたトリムループのsea-levelを意味し、プラスかマイナスになります。通常は0です。

プリミティブは2Dプロファイルです。つまりポリゴン、Bezierカーブ, スプラインサーフェスのドメイン内で存在するNURBSカーブ。ポイントは、サーフェスドメイン内の2D位置(つまりW(重み)コンポーネントを持つUVペア)です。

ループはトリムループです。これは"trim regions"として知られていて、上記のプリミティブプロファイルで定義します。サーフェスに複数のプロファイルを持たせることが可能ですが、トリムループはありません。

グループには名前を付けて、ポイントまたはプリミティブを含めて定義します。ポイントやプリミティブは、いくつものグループのメンバーになることができます。したがって、メンバーシップは1グループにのみ属するわけではありません。

ポイントセクション

各ポイントは3つのコンポーネント(x, y, w)で記録されています。ポジションは実際の同次座標ではありません。同次座標を得るには、単純にxywを乗算するだけです。

プロファイルセクション

すべてのプロファイルにはローカル情報があり、それを保存する必要があるため、すべてのプリミティブのフォーマットが異なります。一般的には書式は次の通り:

ProfileKey <local_information>        

ここではlocal_informationが特定のプロファイルです。

ローカル情報の一部として、頂点を複数指定します。各頂点は同じ書式で保存します。書式は次の通り:

point_number        

ポイント番号は0からnumber of points - 1まであります。

各プロファイルには固有のIDがあります。現在のプロファイルとIDは3Dの片方と同一です:

Polygon: "Poly"
NURBS Curve: "NURBCurve"
Rational Bezier Curve: "BezierCurve"         

プロファイルキーは大文字小文字の区別があります。例:

Poly 3 < 0 1 2        

これは閉じたポリゴン(以下参照)を指定しています。これには3つの頂点参照2Dポイント0, 1 ,2があります。

同じタイプのプロファイルが2つ以上連続した時は、これはプロファイルのrunとして指定します。このケースでは、次のコードをファイルで定義します:

Run # ProfileKey        

#はrunのプロファイルの番号です。このケースでは、次のプロファイルがProfileKeyのIDで保存されません。その理由は、runで暗黙になっているからです。

3つのプロファイルタイプ(ポリゴン, NURBSカーブ, Bezierカーブ)の書式は、3Dプリミティブの書式と同じですが、2度とリスト化しません。

トリムセクション

NLoopsがゼロでなければ、サーフェスは1つ以上のトリム領域を含みます。各領域には1つ以上のプロファイルがあります。

典型的には、プロファイルは閉じたループを形成できるように交差する必要があります。しかし、ドメイン境界と交差するループの場合では、ループはドメイン境界で部分的に定義するので、明示的に閉じている必要もありません。

開いていて且つドメイン境界と交差しない1つのプロファイルループに対しては、Houdiniは真っ直ぐに閉じます。

トリムセクションでは以下のような1つ以上のライン、トリム領域毎に1ライン含んでいます:

TrimRegion [natural] #Profiles <profile_number ustart uend>...        

"natural"を指定すると、開いたプロファイルを自然に処理します。つまりパラメトリックな方向をチェックせず、反転することもありません。

profile_number

現在のトリム領域での各プロファイルのインデックス

ustart and uend

プロファイルの始点と終点を定義したパラメトリックの値。トリム用にプロファイルのセクションのみ使うことが可能です。

プロファイルの頂点そのものを反転せずにトリムカーブの方向を反転するには、ustopよりも大きいustartを指定します。プロファイルは2つ以上のトリム領域で使うことができるので、各領域毎に異なる方向と長さを設定することができます。

サーフェスに穴を空けるとき、保持するサーフェスの領域を指定するために外側のプロファイルが必要です。通常は、外側のプロファイルは閉じたポリゴンで、ドメインの境界です。

例:

TrimRegion 2 0 1 0 5 -3.5 8        

トリム領域には2つのプロファイルがあります: 0と5です。プロファイル0は1と0の間を評価して反転します。プロファイル5は-3.5と8の間を使います。

グループセクション

最初にポイントグループを保存し、その後にプロファイルグループを保存します。グループを意味するIDはありません。グループの書式は、 "ordered"または"unordered"かで変わります:

GroupName Type NElements BitMask ElementList        

GroupName

グループの名前

Type

"unordered" または"ordered"

NElements

BitMaskの合計ビット数を指定します。これは、プロファイルヘッダのNPrimsと同等です。

BitMask

0と1の文字列。1はグループに含むことを意味します。

ElementList

グループが"ordered"なら、エレメントリストには選択したポイントまたはプロファイルの各インデックスを選択順で含んでいます。リストの最初のエレメントは、リストの"ordered"エレメントの数です。

PASTE HIERARCHYローカル情報書式

#Features

フィーチャサーフェスと同じ数のラインの後に、サーフェスをペーストする順番で。各フィーチャラインには書式があります:

Feature prim_number height up_or_down <domain_xform>        

prim_number

プリミティブのリストの中のスプラインサーフェスのインデックス。高さは、ベースから貼りつけたサーフェスの標高です。

up_or_down

1は上方向にペースト。0は下方向にペースト。ドメイン変換は線形またはバイリニアです。

線形変換書式

Linear tx ty UT_Matrix2 m00 m01 m10 m11         

ドメイン内の変換は、(tx,ty)で指定します。回転とスケールのコンポーネントは、2 x 2行列にキャプチャーします。

バイリニア変換書式

Bilinear origUL origUR origLR origLL warpUL warpUR warpLR warpLL 

L,U,L,R

それぞれLower, Upper, Left , Rightを意味します。8つの場所は、それぞれサーフェスドメイン内で(u,v)の組みになっています。

3つのサーフェスを持つペースト階層の例:

PasteSurf 3
  Feature 0 0 1 Linear 0 0 UT_Matrix2 1 0 0 1
  Feature 2 0.02 1 Bilinear 0 0.6 0.6 0.6 0.6 0 0 0  100.1 -22 100.4 -22 100.4 -28 100.1 -28
  Feature 3 0.07 0  Bilinear 0 1 1 1 1 0 0 0 100.2 -21 100.45 -21 100.45 -26 100.2 -26         

Circleローカル情報書式

Vertex_Info Matrix33    

常に円に対して頂点は1つのみです。3 x 3行列には、円の中心に関するスケール、回転、移動を含んでいます。傾斜した円も可能です。

Sphereローカル情報書式

Vertex_Info Matrix33    

常に球に対して頂点は1つのみです。3 x 3行列には、球の中心に関するスケール、回転、移動を含んでいます。傾斜した球も可能です。

Tube / Coneローカル情報書式

Vertex_Info Taper Closure Matrix33    

常にチューブ/円錐に対して頂点は1つのみです。頂点はチューブの中心にあります。(上面と底面の円/楕円の中心をつなぐ軸に沿って)。テーパーの値は上面の円の半径に影響を与えます。標準のチューブはテーパーの値が1です。円錐のテーパーなら0です。Closureの"closed"または"open"はチューブの両端に蓋を閉めるか否かを意味します。3 x 3行列には、チューブの中心に関するスケール、回転、移動を含んでいます。傾斜したチューブも可能です。

METABALLローカル情報書式

Vertex_Info Kernel_Function Weight Matrix33    

常にメタボールに対して頂点は1つのみです。カーネルファンクションは次の1つです:wyvill, quartic, blinn, links。3 x 3行列には、メタボールの中心に関するスケール、回転、移動を含んでいます。傾斜したメタボールも可能です。

Meta Super-Quadricローカル情報書式

Vertex_Info XY_Exponent Z_Exponent Kernel_FunctionWeight Matrix33    

常にmeta super-quadricに対して頂点は1つのみです。カーネルファンクションは次の1つです:wyvill, quartic, blinn, links。3 x 3行列には、メタボールの中心に関するスケール、回転、移動を含んでいます。傾斜したメタボールも可能です。

PARTICLE SYSTEMローカル情報書式

Part_Count Vertex_List    

Part_Countはシステム内のパーティクルの数です。

Detailアトリビュート

Detail Attribute Dictionaryが、プリミティブの後とグループ情報の前に保存します。

ポイント / プリミティブのグループの定義

最初にポイントグループを保存して、その後にプリミティブグループを保存します。グループを意味するIDはありません。グループの書式は、 "ordered"または"unordered"かで変わります:

GroupName Type NElements BitMask ElementList    

GroupName

グループの名前

Type

"unordered"または"ordered"

NElements

BitMaskの合計ビット数を指定します。これは、Detailの中のエレメントの数と同等です。

BitMask

アスキー書式では、0と1の文字列。1はグループのメンバーシップであることを意味します。

ElementList

グループが"ordered"なら、エレメントリストには選択したポイントまたはプリミティブの各インデックスを選択順で含んでいます。リストの最初のエレメントは、リストの"ordered"エレメントの数です。プリミティブリストの場合、2番目のプロファイルエレメントが各エレメントにピリオドと副インデックス番号を追加して記述しても構いません。

例えば、5は5番目のプリミティブを指定し、一方、5.12は5番目のプリミティブの12番目のプロファイルを指定します。グループがunorderedなら、そのリストは空っぽでなければなりません。

他の情報

これはメタボールのエクスプレッションとサーフェス階層のような情報の保存向けです。現在では、このセクションは、区切りトークンのみ1行に1つだけ含みます:

beginExtra endExtra     

今のところ、Extraボディは空っぽです。なぜなら、すべてのメタボールは結合され(暗黙的に"add"-ed)、サーフェス階層をサポートしていないからです。

サポートしているファイルフォーマット