hou.SopNode.geometry()を通じてSOPにジオメトリを求めた場合、それの読み取り専用の参照が取得されます。 SOPが再クックされると、それに相当するGeometryオブジェクトは、そのSOPの新しいジオメトリに更新されます。 SOPを削除した後にGeometryオブジェクトにアクセスすると、hou.ObjectWasDeletedの例外が発生します。 ジオメトリの修正を試みるメソッドをコールすると、それらのメソッドは、hou.GeometryPermissionErrorの例外を引き起こします。
SOPが再クックされた時にジオメトリを更新させたくないのであれば、hou.Geometry.freeze()をコールします。 フリーズは、SOPが再クックされても変わらない他のGeometryオブジェクトを返します。 フリーズしたGeometryにアクセスした方が若干高速です。 その理由は、Houdiniがアクセスする度にSOPノードを探す必要がないからです。 そのため、速度が重要な処理に対してはフリーズしたジオメトリを使用した方が良いです。
Pythonを使用してSOPを記述している場合、そのジオメトリは読み-書きのアクセスを持ち、フリーズされます。 Python定義のSOPを作成するには、 File ▸ New Operator Type… を選択して、 Code タブにPythonコードを配置します。
最後にhou.Geometryのインスタンスを作成することで、読み-書きのアクセス権を持った新しいフリーズジオメトリを割り当てることができます。
メソッド
__init__(src_geo=None)
src_geoがNoneの場合は空っぽ、それ以外の場合はsrc_geoのディープコピーで新しいGeometryを返します。
アトリビュート
findPointAttrib(name)
→ hou.Attrib or None
nameによってPointアトリビュートを探します。 それに該当するhou.Attribオブジェクトを返します。そのnameのアトリビュートが存在しなかった場合は、Noneが返されます。
ポイントポジションアトリビュートの名前はP
で、そのサイズが3つのfloatであることを覚えておいてください。
また、ポイントウェイトアトリビュートの名前はPw
で、そのサイズが1つのfloatです。
これらのアトリビュートは、HoudiniのUIにリストされていなくても、常にHOM内に存在します。
サンプルは、hou.Point.attribValue()を参照してください。
findPrimAttrib(name)
→ hou.Attrib or None
nameによってPrimitiveアトリビュートを探します。 それに該当するhou.Attribオブジェクトを返します。そのnameのアトリビュートが存在しなかった場合は、Noneが返されます。
findVertexAttrib(name)
→ hou.Attrib or None
nameによってVertexアトリビュートを探します。 それに該当するhou.Attribオブジェクトを返します。そのnameのアトリビュートが存在しなかった場合は、Noneが返されます。
findGlobalAttrib(name)
→ hou.Attrib or None
nameによってGlobal(通称Detail)アトリビュートを探します。 それに該当するhou.Attribオブジェクトを返します。そのnameのアトリビュートが存在しなかった場合は、Noneが返されます。
pointAttribs()
→ tuple
of hou.Attrib
Pointアトリビュートすべてのタプルを返します。
ポイントポジションアトリビュートの名前はP
で、そのサイズが3つのfloatであることを覚えておいてください。
また、ポイントウェイトアトリビュートの名前はPw
で、そのサイズが1つのfloatです。
これらのアトリビュートは、HoudiniのUIにリストされていなくても、常にHOM内に存在します。
globalAttribs()
→ tuple
of hou.Attrib
Global(通称Detail)アトリビュートすべてのタプルを返します。
addAttrib(type, name, default_value, transform_as_normal=False, create_local_variable=True)
→ hou.Attrib
新しくPoint,Primitive,Vertex,Global(通称Detail)アトリビュートを作成します。 新しく作成されたアトリビュートを記述したhou.Attribオブジェクトを返します。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
type
新しいアトリビュートをPoint,Primitive,Vertex,Globalのアトリビュートのどれにするのか指定するためのhou.attribType値。
name
新しいアトリビュートの名前。ジオメトリ内の各アトリビュートは、必ず固有の名前でなければなりません。
default_value
このアトリビュートのデフォルト値。アトリビュートが作成されると、すべての既存要素(例えば、プリミティブやポイント)にこの値が格納されます。 さらに、後で追加した要素も、この値を使用します。
この値は、アトリビュートのデータタイプも決定し、以下のどれかを指定することができます:
-
整数
-
浮動小数点
-
文字列
-
整数シーケンス
-
浮動小数点シーケンス
デフォルト値は、整数または浮動小数点のシーケンスで、そのシーケンスサイズがアトリビュートのサイズを決めます。 シーケンスでない場合は、アトリビュートのサイズは1です。
文字列アトリビュートはデフォルト値をサポートしておらず、この値はタイプの決定のためだけに使用されます。
transform_as_normal
このパラメータは、デフォルト値が3つのfloatのシーケンスの時のみTrue
に設定することができます。
そのようなアトリビュートに対してHoudiniがジオメトリのトランスフォーム(移動、回転など)を行なっても、そのアトリビュート値は修正されません。
Houdiniがジオメトリをトランスフォームさせた時にアトリビュートをベクトル(例えば法線ベクトル)としてトランスフォームさせたい場合は、このパラメータをTrue
に設定します。
create_local_variable
True
の場合、Houdiniは、このアトリビュートに対して、パラメータエクスプレッションで使用できるローカル変数を作成します。
ローカル変数の名前は、アトリビュートの名前をすべて大文字にした名前です。
アトリビュート名からローカル変数へのマッピングは、"varmap"
という特殊なGlobalアトリビュートに格納されます。
このジオメトリが修正不可の場合は、hou.GeometryPermissionErrorを引き起こします。
この名前のアトリビュートが既に存在した場合は、hou.OperationFailedを引き起こします あなたがC++ Houdini Development Kit (HDK)に詳しいのであれば、Houdiniは同じ名前でタイプが異なるアトリビュートをサポートすることができることを知っていることでしょう。 しかし、ほとんどのSOPは、同じ名前のアトリビュートを区別することができず、同じ名前の複数のアトリビュートは使用するべきではありません。 このため、このメソッドを使用して、そのようなアトリビュートを作成することができません。
transform_as_normalがTrue
でデフォルト値が3つのfloatのシーケンスでない場合は、hou.OperationFailedを引き起こします。
# "population"という名前のサイズが1の整数Pointアトリビュートを作成し、 # アトリビュート値が0, 5, 10, 15, 20の5つのポイントを作成します。 # このコードは、Python SOP内から動作しますが、Pythonシェルからは動作しません。 geo = hou.pwd().geometry() population_attrib = geo.addAttrib(hou.attribType.Point, "population", 0) for i in range(5): point = geo.createPoint() point.setPosition((i, 0, 0)) point.setAttribValue(population_attrib, i * 5)
以下のサンプルでは、既存アトリビュートをコピーする方法を説明しています:
def copyAttrib(attrib, new_name): return attrib.geometry().addAttrib( attrib.type(), new_name, attrib.defaultValue(), attrib.isTransformedAsNormal())
create_local_variable
がTrue
の場合、この関数は、以下のコードと同じことを実行します:
def addLocalVariable(geo, attrib_name): '''ジオメトリアトリビュートを作成し、それのローカル変数を追加します。''' # 変数マッピングは、varmapアトリビュートの文字列テーブルに保存されます。 # このテーブルは、varmapの現行値と異なります。 # varmapの現行値は、そのテーブル内のエントリーを参照するだけです。そのため、テーブル内にエントリーが存在するためには # 単にvarmapの値を設定すればいいだけです。 map_value = "%s -> %s" % (attrib_name, attrib_name.upper()) if geo.findGlobalAttrib("varmap") is None: geo.addAttrib(hou.attribType.Global, "varmap", "") geo.setGlobalAttribValue("varmap", map_value)
関連項目:
addArrayAttrib(type, name, data_type, tuple_size=1)
→ hou.Attrib
新しいPoint,Primitive,Vertex,Global(別名Detail)配列アトリビュートを作成します。 これは、新しく作成されたアトリビュートを表現したhou.Attribオブジェクトを返します。 通常では、Python定義のSOPのコードから、このメソッドをコールします。
type
新しいアトリビュートをPoint,Primitive,Vertex,Globalのどのアトリビュートにするのかを指定したhou.attribType値。
name
新しいアトリビュートの名前。ジオメトリ内の各アトリビュートは固有名でなければなりません。
data_type
新しいアトリビュートをint,float,stringのどのアトリビュートにするのかを指定したhou.attribData値。
tuple_size
新しいアトリビュートのタプルサイズ。
このジオメトリが修正不可の場合は、hou.GeometryPermissionErrorを引き起こします。
この名前のアトリビュートが既に存在していれば、hou.OperationFailedを引き起こします。 あなたがC++ Houdini Development Kit (HDK)に詳しいのであれば、Houdiniがタイプの違う同じ名前のアトリビュートに対応していることを知っていることでしょう。 しかし、ほとんどのSOPは、同じ名前のアトリビュートを区別することができないので、同じ名前の複数アトリビュートは混乱します。 そのため、このメソッドでは、同じ名前のアトリビュートを作成できないようにしています。
attribValue(name_or_attrib)
→ int
, float
, str
, or tuple
特定のアトリビュートのGlobal(通称Detail)アトリビュート値を返します。 アトリビュートは、nameまたはhou.Attribオブジェクトで指定することができます。
この名前のアトリビュートが存在しなかった場合は、hou.OperationFailedを引き起こします。
floatAttribValue(name_or_attrib)
→ float
特定の浮動小数点アトリビュートのGlobal(通称Detail)アトリビュート値を返します。 アトリビュートは、nameまたはhou.Attribオブジェクトで指定することができます。
この名前のアトリビュートが存在しなかった場合や、サイズが1のfloatでなかった場合は、hou.OperationFailedを引き起こします。
たいていの場合、アトリビュート値にアクセスするには、hou.Geometry.attribValue()を使用します。 Houdiniは、このメソッドを内部的に使用してattribValueを実装しています。
floatListAttribValue(name_or_attrib)
→ tuple
of float
特定の浮動小数点アトリビュートのGlobal(通称Detail)アトリビュート値を返します。 アトリビュートは、nameまたはhou.Attribオブジェクトで指定することができます。 戻り値は、floatのリストです。
アトリビュートのサイズが1の時でも、このメソッドをコールするのは有効です。 この場合、1個の要素を持つリストが返されます。
関連項目:
intAttribValue(name_or_attrib)
→ int
特定の整数アトリビュートのGlobal(通称Detail)アトリビュート値を返します。 アトリビュートは、nameまたはhou.Attribオブジェクトで指定することができます。 詳細は、hou.Geometry.floatAttribValue()を参照してください。
intListAttribValue(name_or_attrib)
→ tuple
of int
特定の整数アトリビュートのGlobal(通称Detail)アトリビュート値を返します。 アトリビュートは、nameまたはhou.Attribオブジェクトで指定することができます。 戻り値は、intのリストです。 詳細は、hou.Geometry.floatListAttribValue()を参照してください。
stringAttribValue(name_or_attrib)
→ str
特定の文字列アトリビュートのGlobal(通称Detail)アトリビュート値を返します。 アトリビュートは、nameまたはhou.Attribオブジェクトで指定することができます。 詳細は、hou.Geometry.floatAttribValue()を参照してください。
stringListAttribValue(name_or_attrib)
→ tuple
of str
特定の文字列アトリビュートのGlobal(通称Detail)アトリビュート値を返します。 アトリビュートは、nameまたはhou.Attribオブジェクトで指定することができます。 戻り値は、stringのリストです。 詳細は、hou.Geometry.floatListAttribValue()を参照してください。
setGlobalAttribValue(name_or_attrib, attrib_value)
Global(通称Detail)アトリビュート値を設定します。 アトリビュートは、nameまたはhou.Attribオブジェクトで指定することができます。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
この名前のアトリビュートが存在しなかった場合や、アトリビュートのデータタイプが与えられた値に合致しなかった場合は、hou.OperationFailedを引き起こします。 アトリビュートのサイズが2以上の場合、アトリビュート値は必ず整数/浮動小数点のシーケンスでなければならず、シーケンスのサイズはアトリビュートのサイズと同じでなければなりません。
このジオメトリが修正不可の場合は、hou.GeometryPermissionErrorを引き起こします。
# このコードは、Python SOP内から動作しますが、Pythonシェルからは動作しません。 geo = hou.pwd().geometry() geo.addAttrib(hou.attribType.Global, "author", "") geo.addAttrib(hou.attribType.Global, "version", (0, 0, 0)) geo.setGlobalAttribValue("author", "Joe") geo.setGlobalAttribValue("version", (1, 0, 7))
関連項目:
attributeCaptureRegions()
→ tuple
of str
このジオメトリのキャプチャー領域のパスを表現した文字列のタプルを返します。 このキャプチャー領域は、ジオメトリのキャプチャーアトリビュートから識別されます。
関連項目:
attributeCaptureObjectPaths()
→ tuple
of str
このジオメトリのキャプチャーオブジェクトのパスを表現した文字列のタプルを返します。 このキャプチャーオブジェクトは、このジオメトリを取り込むために使用されるオブジェクトであり、そのジオメトリのキャプチャーアトリビュートから識別されます。 スケルトンのルートパスは、このキャプチャーオブジェクトのパスの先頭に追加され、それらのオブジェクトノードは以下のコードによって取得します:
# このコードは、Python SOP内から動作しますが、Pythonシェルからは動作しません。 geo = hou.pwd().geometry() nodes = [hou.node(x) for x in geo.attributeCaptureObjectPaths()]
関連項目:
attribType()
→ hou.attribType列挙値
列挙値hou.attribType.Globalを返します。 ポイント、プリミティブ、頂点、ジオメトリは、それらのアトリビュートを照会するための同じメソッドのセットをサポートしており、このメソッドは、その1つです。
関連項目:
renamePointAttrib(old_name, new_name)
指定した古い名前のPointアトリビュートを新しい名前に変更します。 このメソッドは、通常ではPython定義のSOPのジオメトリが書き込み可能な時に、そのSOP内からコールします。
読み込み専用のジオメトリに対してコールするとGeometryPermissionError
を引き起こします。
old_name
またはnew_name
がNoneの場合はTypeError
を引き起こします。
古い名前のPointアトリビュートが存在しなければOperationFailed
を引き起こします。
新しい名前のPointアトリビュートが既に存在すればOperationFailed
を引き起こします。
renamePrimAttrib(old_name, new_name)
指定した古い名前のPrimitiveアトリビュートを新しい名前に変更します。 このメソッドは、通常ではPython定義のSOPのジオメトリが書き込み可能な時に、そのSOP内からコールします。
読み込み専用のジオメトリに対してコールするとGeometryPermissionError
を引き起こします。
old_name
またはnew_name
がNoneの場合はTypeError
を引き起こします。
古い名前のPrimitiveアトリビュートが存在しなければOperationFailed
を引き起こします。
新しい名前のPrimitiveアトリビュートが既に存在すればOperationFailed
を引き起こします。
renameVertexAttrib(old_name, new_name)
指定した古い名前のVertexアトリビュートを新しい名前に変更します。 このメソッドは、通常ではPython定義のSOPのジオメトリが書き込み可能な時に、そのSOP内からコールします。
読み込み専用のジオメトリに対してコールするとGeometryPermissionError
を引き起こします。
old_name
またはnew_name
がNoneの場合はTypeError
を引き起こします。
古い名前のVertexアトリビュートが存在しなければOperationFailed
を引き起こします。
新しい名前のVertexアトリビュートが既に存在すればOperationFailed
を引き起こします。
renameGlobalAttrib(old_name, new_name)
指定した古い名前のDetailアトリビュートを新しい名前に変更します。 このメソッドは、通常ではPython定義のSOPのジオメトリが書き込み可能な時に、そのSOP内からコールします。
読み込み専用のジオメトリに対してコールするとGeometryPermissionError
を引き起こします。
old_name
またはnew_name
がNoneの場合はTypeError
を引き起こします。
古い名前のDetailアトリビュートが存在しなければOperationFailed
を引き起こします。
新しい名前のDetailアトリビュートが既に存在すればOperationFailed
を引き起こします。
Intrinsics(組み込み)
intrinsicValue(intrinsic_name)
→ int
, float
, str
, or tuple
"intrinsic"の値を取得します。これは、頻繁に計算がされており、memoryusage
, pointcount
, pointattributes
などのジオメトリの値です。
指定したIntrinsic名が存在しなかった場合は、OperationFailed
を引き起こします。
Geometry Spreadsheetを使えば、ユーザーインターフェースでそれらの値を確認することもできます。
Houdiniでは、プリミティブに"intrinsic"値があり、この値は直接アトリビュートインターフェースからアクセスすることができません。
ほとんどのIntrinsic値は、measuredarea
のように計算されていますが、いくつかのIntrinsic値はsetIntrinsicValue methodで書き込むことができます。
例えば、球のプリミティブは、その定義の一部としてトランスフォームマトリックスを持ちます。
intrinsicNames methodを使えば、利用可能なIntrinsic値の名前のリストを取得することができます。 異なるジオメトリタイプには、異なるIntrinsic値が利用可能です。
intrinsicNames()
→ tuple
of str
このジオメトリで利用可能なIntrincis値を意味した文字列のタプルを返します。 異なるジオメトリタイプには、異なるIntrinsic値が利用可能です。 intrinsicValueやsetIntrinsicValueを使用することで、その値を取得または設定することができます。
詳細は、intrinsicValueメソッドを参照してください。
intrinsicValueDict()
→ dict
of str
to value
Intrinsicの名前とその値をマッピングした辞書を返します。
setIntrinsicValue(intrinsic_name, value)
いくつかの"intrinsic"値は修正可能です。
例えば、トランスフォームを意味する16個のfloatのタプルをsetIntrinsicValue
に渡すことで、球プリミティブの内部サイズと回転(トランスフォーム)を変更することができます。
Intrinsicが書き込み不可だったり、渡した値を受け入れなかった場合、または指定したIntrinsic名が存在しなかった場合は、Error
を引き起こします。
Note
ジオメトリを直接修正すると、ジオメトリの親ノードがロックされます。
詳細は、intrinsicValue methodを参照してください。
intrinsicReadOnly(intrinsic_name)
→ bool
intrinsicSize(intrinsic_name)
→ int
平均
averagePointAttribValue(attrib_name, index)
averagePointAttribValueByType(attrib_type, index)
averagePrimAttribValue(attrib_name, index)
averagePrimAttribValueByType(attrib_type, index)
averageVertexAttribValue(attrib_name, index)
averageVertexAttribValueByType(attrib_type, index)
pointBoundingBox(pointpattern)
→ hou.BoundingBox
ポイントパターンで指定されたポイントを含むようにサイズと位置が決められた軸平行の3D境界ボックスを返します。 このパターンが空っぽであれば、すべてのポイントが含まれます。
球などのいくつかのプリミティブは、そのポイントからはみ出します。そのはみ出し分は考慮されません。
primBoundingBox(primpattern)
→ hou.BoundingBox
プリミティブパターンで指定されたプリミティブを含むようにサイズと位置が決められた軸平行の3D境界ボックスを返します。 このパターンが空っぽであれば、すべてのプリミティブが含まれます。
球などのいくつかのプリミティブは、そのポイントからはみ出します。そのはみ出し分は考慮されます。
boundingBox()
→ hou.BoundingBox
このジオメトリを覆うのに十分な大きさのサイズと位置の軸平行の3D境界ボックスを返します。
averageMinDistance(local_transform, geometry, geometry_transform)
→ float
selfのポイントセットまでの最短距離のgeometry内のすべてのポイントの平均を返します。
local_transform
このジオメトリ内のすべてのポイントに適用されるトランスフォーム。
geometry
距離の検索元のジオメトリ。
geometry_transform
geometry内のすべてのポイントに適用されるトランスフォーム。
geometryに頂点がなければ、hou.OperationFailedを引き起こします。
query_geometry = query_node.geometry() queried_geometry = queried_node.geometry() # <query_geometry>のポイントセットまでの最短距離にある # <queried_geometry>内のポイントすべての平均を返します。 query_geometry.averageMinDistance( query_node.worldTransform(), queried_geometry, queried_node.worldTransform())
averageEdgeLength()
→ float
メッシュの平均エッジ長を返します。
メッシュに何もエッジがなければ、hou.OperationFailedを引き起こします。
# 平均のエッジ長を返します。 geo.averageEdgeLength()
作成
createPoint()
→ hou.Point
(0, 0, 0)の場所に新しくポイントを作成し、それらに該当するhou.Pointオブジェクトを返します。 通常ではPython定義のSOPのコードからこのメソッドをコールします。
ジオメトリにPointアトリビュートが含まれていれば、その新しいポイントは、それらのアトリビュートのデフォルト値を受け取ります。
このジオメトリが修正不可の場合は、hou.GeometryPermissionErrorを引き起こします。
サンプルとしてhou.Geometry.addAttrib(), hou.Geometry.createPolygon(), hou.Face.addVertex()を参照してください。
createPoints(point_positions)
→ tuple
of hou.Point
指定した複数位置にそれぞれポイントを作成し、新しいhou.Pointオブジェクトのタプルを返します。 このメソッドは、通常ではPython定義のSOPのコードからコールします。
point_positions
には、hou.Vector3オブジェクトのタプルまたは3-タプルの浮動小数点のタプルを指定することができます。
例えば、point_positions
が((0, 1, 2), (1, 2, 3))
であれば、このメソッドは(0, 1, 2)と(1, 2, 3)の位置に1個ずつポイントを作成します。
ジオメトリにPointアトリビュートが含まれていれば、新しく作成されたポイントのアトリビュートにはそのデフォルト値が入ります。
このジオメトリが修正不可の場合は、hou.GeometryPermissionErrorを引き起こします。 指定したポイントポジションのどれかが3つの値(x,y,z)でない場合は、hou.InvalidSizeを引き起こします。
サンプルは、hou.Geometry.addAttrib(), hou.Geometry.createPolygons(), hou.Face.addVertex()を参照してください。
createPolygon()
→ hou.Polygon
新しいポリゴンを作成し、それに該当するhou.Polygonオブジェクトを返します。 通常ではPython定義のSOPのコードからこのメソッドをコールします。
新しく作成されたポリゴンには頂点がありません。頂点を追加するにはhou.Face.addVertex()を使用します。 また、ポリゴンは閉じます(詳細は、hou.Face.isClosed()を参照してください)。
ジオメトリにPrimitiveアトリビュートが含まれていれば、その新しいポリゴンは、それらのアトリビュートのデフォルト値を受け取ります。
このジオメトリが修正不可の場合は、hou.GeometryPermissionErrorを引き起こします。
geo = hou.pwd().geometry() poly = geo.createPolygon() for position in (0,0,0), (1,0,0), (0,1,0): point = geo.createPoint() point.setPosition(position) poly.addVertex(point)
若干複雑なサンプルはhou.Face.addVertex()を参照してください。
createPolygons(points)
→ tuple
of hou.Polygon
指定したポイントを頂点とする一連のポリゴンを作成し、その新しいhou.Polygonオブジェクトのタプルを返します。 通常ではPython定義のSOPのコードからこのメソッドをコールします。
points
には、hou.Pointオブジェクトのタプルまたはポイント番号を意味した整数のタプルのタプルを指定することができます。
例えば、points
が((0, 1, 2), (3, 4, 5, 6))
であれば、このメソッドは、ポイント番号0,1,2を頂点とするポリゴンとポイント番号3,4,5,6を頂点とするポリゴンを作成します。
作成されたポリゴンは閉じます(詳細は、hou.Face.isClosed()を参照してください)。
ジオメトリにPrimitiveアトリビュートが含まれていれば、新しく作成されたポリゴンのアトリビュートにはそのデフォルト値が入ります。
このジオメトリが修正不可の場合は、hou.GeometryPermissionErrorを引き起こします。 指定したポイントタプルが最低でも3つの要素でない場合は、hou.InvalidSizeを引き起こします。 ポイント番号のどれかまたはhou.Pointオブジェクトがジオメトリ内になければ、hou.InvalidInputを引き起こします。
例:
# ジオメトリ内に6つのポイントを作成します。 geo = hou.pwd().geometry() point_positions = ( (1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 1, 0), (1, 0, 1), (0, 1, 1), ) points = geo.createPoints(point_positions) # 2つのポリゴンを作成します。 # 最初のポリゴンは、ジオメトリ内の最初の3つのポイントを頂点として使用します。 # 2番目のポリゴンは、ジオメトリ内の最後の3つのポイントを頂点として使用します。 polygons = geo.createPolygons( ((points[0], points[1], points[2]), (points[3], points[4], points[5])))
createTetrahedron()
→ hou.Prim
新しい四面体を作成し、それに該当するhou.Primオブジェクトを返します。 通常ではPython定義のSOPのコードからこのメソッドをコールします。
新しく作成された四面体には4つの頂点があり、その頂点に新しいポイントが割り当てられています。 既存ポイントから四面体を構築するには、hou.Geometry.createTetrahedronInPlace()を使用します。
このジオメトリが修正不可の場合は、hou.GeometryPermissionErrorを引き起こします。
createTetrahedronInPlace(p0, p1, p2, p3)
→ hou.Prim
新しい四面体を作成し、それに該当するhou.Primオブジェクトを返します。 通常ではPython定義のSOPのコードからこのメソッドをコールします。
新しく作成された四面体には4つの頂点があり、四面体に渡されたポイントを使用します。
このジオメトリが修正不可の場合は、hou.GeometryPermissionErrorを引き起こします。
createNURBSCurve(num_vertices=4, is_closed=False, order=4)
→ hou.Face
指定した頂点数で新しいNURBSを作成し、それを返します。 通常ではPython定義のSOPのコードからこのメソッドをコールします。
num_vertices
カーブ内の頂点数。新しいポイントは頂点毎にジオメトリに追加され、このポイントは位置を変更しない限りは原点に配置されます。 hou.Face.addVertex()を使ってもっと頂点を追加することもできます。
NURBSカーブの最小頂点数は、そのカーブの階数(次数+1)と同じです。 デフォルトの階数の4では、カーブは最低でも4つの頂点を持たなければなりません。 指定する頂点数が少なかった場合は、このメソッドはhou.OperationFailedを引き起こします。
is_closed
カーブを開くか閉じるか制御します。詳細は、hou.Face.isClosed()を参照してください。 指定しなかった場合、そのカーブは開きます。 この挙動は、hou.Geometry.createPolygon()と異なり、新しいポリゴンは閉じます。 hou.Face.setIsClosed()を使ってポリゴンを開いたり閉じたりすることもできます。
order
カーブの階数(次数+1)を指定します。デフォルトの階数は4で、3次NURBSカーブに相当します。 最小階数の2は、カーブを直線にします。
ジオメトリにPrimitiveアトリビュートが含まれていれば、新しいカーブは、それらのアトリビュートのデフォルト値を受け取ります。
# このコードは、Python SOP内から動作しますが、Pythonシェルからは動作しません。 geo = hou.pwd().geometry() curve = geo.createNURBSCurve(10) i = 0 for vertex in curve.vertices(): vertex.point().setPosition((i, i % 3, 0)) i = i + 1
このジオメトリが修正不可の場合は、hou.GeometryPermissionErrorを引き起こします。
関連項目:
createBezierCurve(num_vertices=4, is_closed=False, order=4)
→ hou.Face
指定した頂点数で新しいBezierカーブを作成し、それを返します。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
num_vertices
カーブ内の頂点数。新しいポイントは頂点毎にジオメトリに追加され、このポイントは位置を変更しない限りは原点に配置されます。 hou.Face.addVertex()を使ってもっと頂点を追加することもできます。
is_closed
カーブを開くか閉じるか制御します。詳細は、hou.Face.isClosed()を参照してください。 指定しなかった場合、そのカーブは開きます。 この挙動は、hou.Geometry.createPolygon()と異なり、新しいポリゴンは閉じます。
order
カーブの階数(次数+1)を指定します。デフォルトの階数は4で、3次NURBSカーブに相当します。 最小階数の2は、カーブを直線にします。
開いたBezierカーブは、(order - 1) * n + 1
個の頂点がなければなりません。
このnはn>=1
です。(そのため、階数が4のカーブに有効な値は、4, 7, 10などです)。
閉じたBezierカーブは、(order - 1) * n
個の頂点がなければなりません(例えば、階数が4のカーブには3, 6, 9などの頂点数が必要です)。
この制限は、階数2のカーブには当てはまりません。
結論として、頂点数を変更する必要があるので、非線形なBezierカーブにはhou.Face.setIsClosed()を使用することができません。
詳細は、hou.Geometry.createNURBSCurve()を参照してください。
createNURBSSurface(rows, cols, is_closed_in_u=False, is_closed_in_v=False)
→ hou.Surface
(1, 1)のサイズで原点を中心としてXY平面にNURBSサーフェスを作成します。通常では、Python定義のSOPのコードからこのメソッドをコールします。
rows, cols
2D配列の頂点のサイズを決めて、サーフェスのコントロールポイントを定義します。 各方向の縦と横の数は、それぞれUとVの階数以上でなければなりません。
is_closed_in_u, is_closed_in_v
各UV方向でサーフェスを開くか閉じるか制御します。詳細は、hou.Surface.isClosedInU()を参照してください。 指定しなかった場合のデフォルトの挙動は、開いたサーフェスを構築します。
order_u, order_v
各UV方向のサーフェスの階数を指定します。 デフォルトの階数はUVとも4で、これは3次NURBSサーフェスに相当します。 最小階数の2は、線形セグメントのサーフェス、本質的にはメッシュになります。
ジオメトリにPrimitiveアトリビュートが含まれていれば、新しいサーフェスは、それらのアトリビュートのデフォルト値を受け取ります。
hou.Geometry.transformPrims()を使えば、サーフェスを動かしたりサイズを変更することができます。
このジオメトリが修正不可の場合は、hou.GeometryPermissionErrorを引き起こします。
縦と横の数が無効な場合は、hou.OperationFailedを引き起こします。
# このコードは、Python SOP内から動作しますが、Pythonシェルからは動作しません。 geo = hou.pwd().geometry() # 頂点が10x10のグリッドのサーフェスを作成します。 surf = geo.createNURBSSurface(10, 10) # 初期状態では、その中心は(0, 0, 0)で、サイズが(1, 1, 1)で、XY平面上にあります。 # これを(20, 10)にスケールして、XZ平面へ回転します。 geo.transformPrims((surf,), hou.hmath.buildScale((20, 10, 1)) * hou.hmath.buildRotateAboutAxis((1, 0, 0), 90))
関連項目:
createBezierSurface(rows, cols, is_closed_in_u=False, is_closed_in_v=False)
→ hou.Surface
(1, 1)のサイズで原点を中心としてXY平面にBezierサーフェスを作成します。通常では、Python定義のSOPのコードからこのメソッドをコールします。
rows, cols
2D配列の頂点のサイズを決めて、サーフェスのコントロールポイントを定義します。
rows
の数はv
に、columns
の数はu
に相当します。これは若干混同することがあります。
例えば、geo.createBezierSurface(9, 7, is_closed_in_u=False, is_closed_in_v=True)
は有効ですが、
geo.createBezierSurface(9, 7,is_closed_in_u=True, is_closed_in_v=False)
はhou.OperationFailedを引き起こします。
is_closed_in_u, is_closed_in_v
u
とv
の各方向でサーフェスを開くか閉じるか制御します。詳細は、hou.Surface.isClosedInU()を参照してください。
order_u, order_v
各UV方向のサーフェスの階数を指定します。 デフォルトの階数はUVとも4で、これは3次NURBSサーフェスに相当します。 最小階数の2は、線形セグメントのサーフェス、本質的にはメッシュになります。
Bezierカーブと同様、Bezierサーフェスには各UV方向でポイント数の制限があります。
指定した方向に対して開く場合、その方向のポイント数は、(order - 1) * n + 1
でなければなりません。
このnはn >= 1
です。(例えば、 4, 7, 10, …)。
閉じる場合、その方向のポイント数は(order - 1) * n
でなければなりません。このnはn >= 1
です。
(例えば、階数3なら2, 4, 6, ..です)。
hou.Geometry.transformPrims()を使えば、サーフェスを動かしたりサイズを変更することができます。
ジオメトリにPrimitiveアトリビュートが含まれていれば、新しいサーフェスは、それらのアトリビュートのデフォルト値を受け取ります。
このジオメトリが修正不可の場合は、hou.GeometryPermissionErrorを引き起こします。
import math # このコードは、Python SOP内から動作しますが、Pythonシェルからは動作しません。 geo = hou.pwd().geometry() # Y軸を基準にチューブ状のオブジェクトを構築します。 num_rows, num_cols = (10, 9) surf = geo.createBezierSurface(num_rows, num_cols, is_closed_in_u=True) for v_index in range(num_rows): for u_index in range(num_cols): angle = u_index * (2.0 * math.pi) / num_cols surf.vertex(u_index, v_index).point().setPosition( (math.cos(angle), v_index / float(num_cols-1), math.sin(angle)))
createMeshSurface(rows, cols, is_closed_in_u=False, is_closed_in_v=False)
→ hou.Surface
(1, 1)のサイズで原点を中心としてXY平面に四角形メッシュを作成し、それを返します。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
メッシュオブジェクトは、同じ形状を定義したポリゴンセットと同じではないことに注意してください。 メッシュオブジェクトは単一プリミティブです。
詳細は、hou.Geometry.createNURBSSurface()を参照してください。
createVolume(xres, yres, zres, bounding_box=None)
→ hou.Volume
x,y,zの解像度(またはサイズ)のボクセル配列を指定すると、ジオメトリに新しいボリュームプリミティブが追加され、それを返します。 新しいボリュームのボクセル値はすべて0です。
xres, yres, zres
1方向でのボクセル配列のサイズを指定する0より大きい整数。 この値がプラスでなかった場合は、hou.OperationFailedを引き起こします。
bounding_box
ボリュームの3Dサイズを指定するhou.BoundingBox。 このサイズはボリュームのボクセル解像度とは無関係であることを覚えておいてください。 このパラメータがNoneの場合は、Houdiniは(-1,-1,-1)から(1,1,1)までの境界ボックスを使用します。
createPacked(typename)
→ hou.PackedPrim
typename
パックプリミティブのタイプの名前を含んだ文字列。
典型的な例は、"PackedDisk"
(ディスク上のジオメトリファイル)または"AlembicRef"
(Alembicファイル)です。
利用可能なtypename
の値の完全リストを調べるには、Houdiniツールのコマンドラインでginfo -P
を実行してください。
詳細は、hou.PackedPrimを参照してください。
削除
deletePrims(prims, keep_points=False)
一連のプリミティブを削除します。通常では、Python定義のSOPのコードからこのメソッドをコールします。
keep_points
True
の場合、そのプリミティブが削除されても、そのポイントは残ります。
1つのプリミティブを削除するには、1つのプリミティブのシーケンスを渡してください。
このジオメトリが修正不可の場合は、hou.GeometryPermissionErrorを引き起こします。
# 1つおきにプリミティブを削除します: prims = [p for p in geo.prims() if p.number() % 2 == 0] geo.deletePrims(prims) # 1番目のプリミティブを削除します: geo.deletePrims([geo.iterPrims()[0]])
deletePoints(points)
一連のポイントを削除します。通常では、Python定義のSOPのコードからこのメソッドをコールします。
Houdiniは、そのポイントを参照している頂点を削除することに注意してください。 例えば、6つのポリゴンで構成されたボックスがあり、その各ポリゴンが4つの頂点を持っていると仮定します。 また、ボックス上の各ポイントが3つのポリゴン上の3つの頂点で共有されていると仮定します。 これらのポイントのどれかを削除すると、Houdiniは、それに相当するポリゴンからその頂点を削除し、 その結果、4つの頂点を持つ3つのポリゴンと3つの頂点を持つ3つのポリゴンが残ります。
1つのポイントを削除するには、1つのポイントのシーケンスを渡してください。
このジオメトリが修正不可の場合は、hou.GeometryPermissionErrorを引き起こします。
グループ
findPointGroup(name)
→ hou.PointGroup or None
指定した名前のPointグループを返します。そのようなグループが存在しなければNone
を返します。
pointGroups()
→ tuple
of hou.PointGroup
ジオメトリ内のすべてのPointグループのタプルを返します。
以下の関数は、ジオメトリ内のすべてのグループの名前を返します:
def pointGroupNames(geometry): return [group.name() for group in geometry.pointGroups()]
createPointGroup(name, is_ordered=False)
→ hou.PointGroup
このジオメトリ内に新しいPointグループを作成します。
name
新しいグループの名前。この名前のグループが既に存在していれば、hou.OperationFailedを引き起こします。
is_ordered
新しいグループの順番を変更するかどうか。グループの並べ替えに関する詳細は、hou.PointGroupを参照してください。
ジオメトリからPointグループを削除するには、hou.PointGroup.destroy()を使用します。
findPrimGroup(name)
→ hou.PrimGroup or None
指定した名前のPrimitiveグループを返します。そのようなグループが存在しなければNone
を返します。
primGroups()
→ tuple
of hou.PrimGroup
ジオメトリ内のすべてのPrimitiveグループのタプルを返します。
createPrimGroup(name, is_ordered=False)
→ hou.PrimGroup
このジオメトリ内に新しいPrimitiveグループを作成します。
name
新しいグループの名前。この名前のグループが既に存在していれば、hou.OperationFailedを引き起こします。
is_ordered
新しいグループの順番を変更するかどうか。グループの並べ替えに関する詳細は、hou.PrimGroupを参照してください。
ジオメトリからPrimitiveグループを削除するには、hou.PrimGroup.destroy()を使用します。
findEdgeGroup(name)
→ hou.EdgeGroup or None
name
エッジグループの名前。
指定した名前のエッジグループを返します。そのようなグループが存在しなければNone
を返します。
createEdgeGroup(name)
→ hou.EdgeGroup
このジオメトリ内に新しいエッジグループを作成します。
name
新しいグループの名前。この名前のグループが既に存在していれば、hou.OperationFailedを引き起こします。
ジオメトリからエッジグループを削除するには、hou.EdgeGroup.destroy()を使用します。
フリーズ
freeze(read_only=False)
→ hou.Geometry
特定のSOPにリンクされていない他のGeometryオブジェクトを返します。
通常では、hou.SopNode.geometry()をコールすると、その結果のGeometryオブジェクトがそのSOPの参照を維持します。 それをUnfrozenと言います。 UnfrozenのGeometryオブジェクト内のポイント、プリミティブ、アトリビュートにアクセスする度に、Houdiniは、そのSOPが最後にクックしたジオメトリを使用します。 そのため、パラメータを変更したり、アニメーションするSOPに関しては時間を変更すると、そのGeometryオブジェクトは、そのSOPの新しいジオメトリに更新されます。
Python SOPを呼び出さない限り、フリーズしたGeometryオブジェクトは、特定のSOPと同様のライブの連動性を持ちません。 SOPにそのジオメトリを要求し、そのジオメトリのフリーズしたコピーを保存した場合、SOPを再クックした時、そのフリーズしたGeometryオブジェクトは更新されません。 その代わりに、フリーズしたジオメトリは、自身のポイントやプリミティブのデータのコピーを保存し、そのSOPへのその後の変更から影響を受けません。 フリーズしたGeometryオブジェクトを破壊した時、それが作成したジオメトリコピーも破壊されます。
Geometryオブジェクトのポイント、プリミティブ、アトリビュートなどへのアクセスは、フリーズしたオブジェクトを扱う時に高速になることを覚えておいてください。 速度が重要な処理では、フリーズしたGeometryで作業したいことがあるでしょう。
UnfrozenのGeometryオブジェクトに対してこのメソッドをコールすると、フリーズしたGeometryオブジェクトが返されます。 フリーズしたオブジェクトに対してこのメソッドをコールしても何の効果もなく、フリーズしたオブジェクトが返されます。
Python定義のSOPをクックして、そのSOPのジオメトリを要求するPythonコードを実行する時は、その返されたGeometryオブジェクトは書き込み可能です。 このGeometryオブジェクトを修正すると、このSOPの出力に影響を与えます。 効率を上げるために、このGeometryオブジェクトは既にフリーズされているので、そのオブジェクトにフリーズをコールしても何の効果もありません。
read_only
Trueの場合、その結果のフリーズしたジオメトリは読み込み専用になります。 読み込み専用のフリーズしたジオメトリを使用することで、複数のパックプリミティブ間で埋め込みジオメトリを共有することができます。
ノード
sopNode()
→ hou.SopNode
Geometryがフリーズされていない場合は、このジオメトリに相当するhou.SopNodeオブジェクトを返します。 フリーズされている場合は、Noneを返します。
フリーズしたジオメトリに関する詳細は、hou.Geometry.freeze()を参照してください。
sopNodeOutputIndex()
→ int
Geometryがフリーズされていない場合は、このジオメトリが相当するSOPノードの出力のインデックスを返します。 フリーズされている場合は、-1を返します。
たいていの場合、このメソッドは、1番目の出力に相当するジオメトリを意味する0を返します。 このメソッドは、複数の出力を持つSOPノードに対しては0以外の値を返すだけです。
フリーズしたジオメトリに関する詳細は、hou.Geometry.freeze()を参照してください。
ポイント
points()
→ tuple
of hou.Point
ジオメトリ内のすべてのポイントのタプルを返します。
hou.Geometry.iterPoints()メソッドも参照してください。
iterPoints()
→ generator of hou.Point
ジオメトリ内のすべてのポイントを通じて反復するジェネレータを返します。
hou.Geometry.points()はジオメトリ内のすべてのポイントのタプルを割り当てて返すのに対し、 このメソッドは、要求に応じてhou.Pointオブジェクトを割り当てるジェネレータオブジェクトを返します。 このオブジェクトは、シーケンスのランダムアクセスで非常に高速です。
インデックスによって特定のポイントにアクセスして、そのジオメトリにポイントがたくさんある場合、 points()よりもiterPoints()を使用する方が高速です。 しかし、ジオメトリ内のすべてのポイントに対して反復する場合には、一般的にはiterPoints()よりもpoints()の方が高速です。
# これが望ましいです: geo.iterPoints()[23] # これよりも: geo.points()[23] # しかし、これが望ましいです: for point in geo.points(): ...ポイントを処理... # これよりも: for point in geo.iterPoints(): ...ポイントを処理...
globPoints(pattern)
→ tuple
of hou.Point
ポイント番号のパターンに相当するポイントのタプルを返します。
パターンフォーマットは、ポイント選択を受け取るSOPノード上のグループフィールドで使われているものと同じフォーマットです。 そのパターン内のエレメントは、スペースで区切り、それらのエレメントにはポイント番号、ポイント番号の範囲、グループ名を指定することができます。
このメソッドは、選択したポイントセットだけに動作するPython SOPを記述する時に役に立ちます。
パターンが有効でない、または存在しないグループを参照した場合は、hou.OperationFailedを引き起こします。 空っぽのパターンは無効とみなされることに注意してください。 有効なポイントを参照していない番号は、エラーになるのではなく、単にポイントに合致しないだけです。
# 5と7のポイントを含むタプルを返します。 geo.globPoints("5 7") # 5から10までのポイントを含むタプルを返します。 geo.globPoints("5-10") # group1ポイントグループ内のポイントすべてを含むタプルを返します。 geo.globPoints("group1") # 0から98以外のポイントすべてを返します。 geo.globPoints("!0-98") # 5, 10から20までのポイントとgroup1内のポイントを返します。 geo.globPoints("5 group1 10-20")
以下のPython SOPのサンプルは、Point SOPと同じ挙動をします。
# このコードは、Python SOP内から動作しますが、Pythonシェルからは動作しません。 # Python SOPに以下のparmタプルがあると想定します: # group: 影響を与えるポイントを含んだ文字列 # t: Point SOPのpositionパラメータのような挙動をする3つのfloatのセット。 # これらのパラメータをエクスプレッション($TX, $TY, $TZ)に設定します。 geo = hou.pwd().geometry() # グループフィールドを使用して、影響を与えるポイントを決めます。グループフィールドが空っぽの場合、 # すべてのポイントに対して作用します。 pattern = hou.ch("group") if pattern == "": points = geo.points() else: points = geo.globPoints(pattern) # ポイントをループして、SOPの現行ポイントを設定します。 # そして、t parmタプルを評価するので、現行ポイントを(例えば、hscriptの$TXやPythonのpwd().curPoint()と一緒に)使用することができます。 for point in points: hou.pwd().setCurPoint(point) new_position = hou.pwd().evalParmTuple("t") point.setPosition(new_position)
point(index)
→ hou.Point
指定したインデックスのポイントを返します。
これは、hou.Geometry.points()を使って無駄にすべてのポイントを取得することなく、特定のポイントにアクセスするための便利メソッドです。
指定したインデックスのポイントが存在しなかった場合は、Noneを返します。
pointFloatAttribValues(name)
→ tuple
of float
すべてのポイントの指定したアトリビュートの値を含んだfloatのタプルを返します。
このメソッドは、intまたはfloatのアトリビュートでのみ動作します。 指定したアトリビュートに2つ以上の要素が含まれている場合、各ポイントは、その結果の複数値に呼応します。 例えば、"Cd"がサイズ3のfloatアトリビュートで、(0.1, 0.2, 0.3), (0.5, 0.5, 0.5), (0.8, 0.7, 0.6)の3つのポイントがあれば、 その結果は、(0.1, 0.2, 0.3, 0.5, 0.5, 0.5, 0.8, 0.7, 0.6)になります。
このメソッドのコールは、hou.Point.attribValue()コールですべてのポイントをループさせるよりも高速です。
アトリビュート名が無効な場合や、アトリビュートがintでもfloatでもない(例えば、文字列アトリビュートになっている)場合、このメソッドはhou.OperationFailedを引き起こします。
多くのメソッドではアトリビュートを扱うことができますが、このメソッドにはhou.Attribオブジェクトを渡すことができません。 とはいえ、hou.Attrib.name()を使用することで、Attribオブジェクトから簡単にアトリビュート名を取得することができます。
pointFloatAttribValuesAsString(name, float_type=hou.numericData.Float32)
→ str
すべてのポイントに対してfloatのアトリビュート値を意味した文字列を返します。
このメソッドは、hou.Geometry.pointFloatAttribValues()よりも高速で、array
モジュールを使用すれば、文字列をPythonシーケンスに変換することができます。
float_type
floatデータタイプ(Float16, Float32, Float64)を指定するためのhou.numericData値。
このメソッドは、以下の実装によって高速化しています:
import array def pointFloatAttribValuesAsString(self, name): return array.array("f", self.pointFloatAttribValues(name)).tostring()
このメソッドからの戻り値を以下のメソッドを使用して配列に変換することができます:
import array def pointFloatAttribValuesAsArray(geometry, name): a = array.array("f") a.fromstring(geometry.pointFloatAttribValuesAsString(name)) return a
詳細は、hou.Geometry.pointFloatAttribValues()を参照してください。
setPointFloatAttribValues(name, values)
特定のアトリビュートに対して、すべてのポイントのアトリビュート値を設定します。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
name
Pointアトリビュートの名前。
values
hou.Geometry.pointFloatAttribValues()で返されるフォーマットと同じフォーマットのintまたはfloatの値のシーケンス。 詳細は、そのメソッドを参照してください。
アトリビュート名が無効な場合や、アトリビュートがintまたはfloatでない場合(例えば、文字列アトリビュート)や、値の配列が正しいサイズでない場合は、 このメソッドは、hou.OperationFailedを引き起こします。
このジオメトリが修正不可であれば、hou.GeometryPermissionErrorを引き起こします。
hou.Geometry.pointFloatAttribValues()も参照してください。
setPointFloatAttribValuesFromString(name, values, float_type=hou.numericData.Float32)
特定のアトリビュートに対して、指定したfloat_type値のシーケンスの文字列表現からすべてのポイントにアトリビュート値を設定します。 このメソッドは、hou.Geometry.setPointFloatAttribValues()よりも高速です。
このメソッドは、文字列だけでなく他のタイプも受け入れることができます。つまりバッファインターフェースに対応したPythonオブジェクトを受け取ることができます。
特に、array
とnumpy
のPythonモジュールからの配列がサポートされているので、それらの配列から文字列を構築する必要がありません。
float_type
floatデータタイプ(Float16, Float32, Float64)を指定するためのhou.numericData値。
文字列の長さがlen(self.iterPoints() * byte_size_of_float_type)
でない場合は、hou.OperationFailedを引き起こします。
詳細は、hou.Geometry.setPointFloatAttribValues()とhou.Geometry.pointFloatAttribValuesAsString()を参照してください。
以下のサンプルの関数は、array.array("f")
を受け取り、そのアトリビュート値をその内容に設定します:
def setPointFloatAttribValuesFromArray(geometry, arr): assert(arr.typecode == "f") geometry.setPointFloatAttribValuesFromString(arr))
pointIntAttribValues(name)
→ tuple
of int
すべてのポイントのアトリビュート値を含んだintのタプルを返します。
このメソッドは、intまたはfloatのアトリビュートに対してのみ動作します。 アトリビュートに2つ以上のエレメントが含まれている場合、各ポイントはその結果の複数値に相当します。 例えば、"idmap"がサイズ2のintアトリビュートで、(1, 2), (2, 3), (3, 4)の値の3つのポイントが存在すると、 その結果は、(1, 2, 2, 3, 3, 4)になります。
このメソッドのコールは、すべてのポイントをループしたり、hou.Point.attribValue()をコールするよりも高速です。
アトリビュート名が無効な場合や、アトリビュートがintまたはfloatでない場合(例えば、文字列アトリビュート)は、このメソッドは、hou.OperationFailedを引き起こします。
アトリビュートを扱う他の多くのメソッドのように、hou.Attribオブジェクトをこのメソッドに渡すことが出来ないことに注意してください。 とはいえ、hou.Attrib.name()を使用すれば、簡単にAttribオブジェクトから名前を取得することができます。
pointIntAttribValuesAsString(name, int_type=hou.numericData.Int32)
→ str
すべてのポイントに対してintのアトリビュート値を意味した文字列を返します。
このメソッドは、hou.Geometry.pointIntAttribValues()よりも高速で、array
モジュールを使用すれば、文字列をPythonシーケンスに変換することができます。
int_type
intデータタイプ(Int8, Int16, Int32, Int64)を指定するためのhou.numericData値。
このメソッドは、以下の実装によって高速化しています:
import array def pointIntAttribValuesAsString(self, name): return array.array("i", self.pointIntAttribValues(name)).tostring()
このメソッドからの戻り値を以下のメソッドを使用して配列に変換することができます:
import array def pointIntAttribValuesAsArray(geometry, name): a = array.array("i") a.fromstring(geometry.pointIntAttribValuesAsString(name)) return a
詳細は、hou.Geometry.pointIntAttribValues()を参照してください。
setPointIntAttribValues(name, values)
特定のアトリビュートに対して、すべてのポイントのアトリビュート値を設定します。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
name
Pointアトリビュートの名前。
values
hou.Geometry.pointIntAttribValues()で返されるフォーマットと同じフォーマットのintまたはfloatの値のシーケンス。 詳細は、そのメソッドを参照してください。
アトリビュート名が無効な場合や、アトリビュートがintまたはfloatでない場合(例えば、文字列アトリビュート)や、値の配列が正しいサイズでない場合は、 このメソッドは、hou.OperationFailedを引き起こします。
このジオメトリが修正不可であれば、hou.GeometryPermissionErrorを引き起こします。
hou.Geometry.pointIntAttribValues()も参照してください。
setPointIntAttribValuesFromString(name, values, int_type=hou.numericData.Int32)
特定のアトリビュートに対して、指定したint_type値のシーケンスの文字列表現からすべてのポイントにアトリビュート値を設定します。 このメソッドは、hou.Geometry.setPointIntAttribValues()よりも高速です。
このメソッドは、文字列だけでなく他のタイプも受け入れることができます。つまりバッファインターフェースに対応したPythonオブジェクトを受け取ることができます。
特に、array
とnumpy
のPythonモジュールからの配列がサポートされているので、それらの配列から文字列を構築する必要がありません。
int_type
intデータタイプ(Int8, Int16, Int32, Int64)を指定するためのhou.numericData値。
文字列の長さがlen(self.iterPoints() * byte_size_of_int_type)
でない場合は、hou.OperationFailedを引き起こします。
詳細は、hou.Geometry.setPointIntAttribValues()とhou.Geometry.pointIntAttribValuesAsString()を参照してください。
以下のサンプルの関数は、sizeof(signed int) == 4と仮定してarray.array("i")
を受け取り、そのアトリビュート値をその内容に設定します:
def setPointIntAttribValuesFromArray(geometry, arr): assert(arr.typecode == "i") geometry.setPointIntAttribValuesFromString(arr))
pointStringAttribValues(name)
→ tuple
of str
すべてのポイントの指定したアトリビュートの値を含んだ文字列のタプルを返します。
このメソッドは、文字列アトリビュートでのみ動作します。 指定したアトリビュートに2つ以上の要素が含まれている場合、各ポイントは、その結果の複数値に呼応します。 例えば、"strmap"がサイズ2の文字列アトリビュートで、("apple", "orange"), ("red", "blue"), ("one", "two")の3つのポイントがあれば、 その結果は、("apple", "orange", "red", "blue", "one", "two")になります。
このメソッドのコールは、hou.Point.attribValue()コールですべてのポイントをループさせるよりも高速です。
アトリビュート名が無効な場合や、アトリビュートが文字列アトリビュートでない場合、このメソッドはhou.OperationFailedを引き起こします。
多くのメソッドではアトリビュートを扱うことができますが、このメソッドにはhou.Attribオブジェクトを渡すことができません。 とはいえ、hou.Attrib.name()を使用することで、Attribオブジェクトから簡単にアトリビュート名を取得することができます。
setPointStringAttribValues(name, values)
特定のアトリビュートに対して、すべてのポイントにそのアトリビュート値を設定します。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
name
Pointアトリビュートの名前。
values
hou.Geometry.pointStringAttribValues()が返す形式と同じ形式の文字列値シーケンス。 詳細は、そのメソッドを参照してください。
アトリビュート名が無効だったり、アトリビュートが文字列でない、または値の配列が正しいサイズでない場合は、hou.OperationFailedを引き起こします。
このジオメトリが修正不可であれば、hou.GeometryPermissionErrorを引き起こします。
hou.Geometry.pointStringAttribValues()も参照してください。
エッジ
globEdges(pattern)
→ tuple
of hou.Edge
エッジパターンに相当するエッジのタプルを返します。
パターンフォーマットは、エッジ選択を受け取るSOPノード上のグループフィールドで使われているものと同じフォーマットです。 詳細は、hou.Geometry.globPoints()を参照してください。
プリミティブ
nearestPrim(position)
→ (hou.Prim or None
, float
, float
, float
)
位置に関する3つのfloatのシーケンスを指定すると、その位置に最も近いプリミティブの位置を検索し、 そのプリミティブ、そのプリミティブ上のu値、そのプリミティブ上のv値、そのプリミティブまでの距離含んだタプルを返します。
ジオメトリにプリミティブがなかった場合は、戻りのタプルの1番目の値がNoneになることに注意してください。
prims()
→ tuple
of hou.Prim
ジオメトリ内のすべてのプリミティブのタプルを返します。返されるプリミティブは、hou.Primのサブクラス(例えば、ポリゴン、ボリュームなど)です。
関連項目:
iterPrims()
→ generator of hou.Prim
ジオメトリ内のすべてのプリミティブを通じて反復するジェネレータを返します。
hou.Geometry.prims()はジオメトリ内のすべてのプリミティブのタプルを割り当てて返すのに対し、 このメソッドは、要求に応じてhou.Primを生成するジェネレータオブジェクトを返します。 このオブジェクトは、シーケンスのランダムアクセスで非常に高速です。
インデックスによって特定のプリミティブにアクセスして、そのジオメトリにプリミティブがたくさんある場合、
prims()
よりもiterPrims()
を使用する方が高速です。
しかし、ジオメトリ内のすべてのプリミティブに対して反復する場合には、一般的にはiterPrims()
よりもprims()
の方が高速です。
# これが望ましいです: geo.iterPrims()[23] # これよりも: geo.prims()[23] # しかし、これが望ましいです: for prim in geo.prims(): ...プリミティブを処理... # これよりも: for prim in geo.iterPrims(): ...プリミティブを処理...
hou.Geometry.prims()メソッドも参照してください。
globPrims(pattern)
→ tuple
of hou.Prim
プリミティブ番号のパターンに相当するプリミティブのタプルを返します。
パターンフォーマットは、プリミティブ選択を受け取るSOPノード上のグループフィールドで使われているものと同じフォーマットです。 詳細は、hou.Geometry.globPoints()を参照してください。
prim(index)
→ hou.Prim
指定したインデックスのプリミティブを返します。
これは、hou.Geometry.prims()を使って無駄にすべてのプリミティブを取得することなく、特定のプリミティブにアクセスするための便利メソッドです。
指定したインデックスのプリミティブが存在しなかった場合は、Noneを返します。
containsPrimType(type_or_name)
→ bool
ジオメトリに、最低でも1個の指定したタイプのプリミティブが含まれているかどうか返します。
type_or_name
hou.primTypeまたはプリミティブタイプの名前を含んだ文字列。
文字列値の典型的な例は、"Poly"
(ポリゴン)または"PackedAgent"
(エージェントパックプリミティブ)です。
利用可能なtypename
値の完全なリストを調べるには、Houdiniツールのコマンドラインからginfo -P
を実行してください。
countPrimType(type_or_name)
→ long
ジオメトリ内の指定したタイプのプリミティブの数を返します。
type_or_name
hou.primTypeまたはプリミティブタイプの名前を含んだ文字列。
文字列値の典型的な例は、"Poly"
(ポリゴン)または"PackedAgent"
(エージェントパックプリミティブ)です。
利用可能なtypename
値の完全なリストを調べるには、Houdiniツールのコマンドラインからginfo -P
を実行してください。
primFloatAttribValues(name)
→ tuple
of float
すべてのプリミティブのアトリビュートの値を含んだfloatのタプルを返します。
このメソッドは、intまたはfloatのアトリビュートに対してのみ動作します。
アトリビュートに2つ以上のエレメントが含まれている場合、各プリミティブはその結果の複数値に相当します。
例えば、Cd
がサイズ3のfloatアトリビュートで、(0.1, 0.2, 0.3), (0.5, 0.5, 0.5), (0.8, 0.7, 0.6)の値の3つのプリミティブが存在すると、
その結果は、(0.1, 0.2, 0.3, 0.5, 0.5, 0.5, 0.8, 0.7, 0.6)になります。
このメソッドのコールは、すべてのプリミティブをループしたり、hou.Prim.attribValue()をコールするよりも高速です。
アトリビュート名が無効な場合や、アトリビュートがintまたはfloatでない場合(例えば、文字列アトリビュート)は、このメソッドは、hou.OperationFailedを引き起こします。
アトリビュートを扱う他の多くのメソッドのように、hou.Attribオブジェクトをこのメソッドに渡すことが出来ないことに注意してください。 とはいえ、hou.Attrib.name()を使用すれば、簡単にAttribオブジェクトから名前を取得することができます。
primFloatAttribValuesAsString(name)
→ str
すべてのプリミティブに対してfloatのアトリビュート値を意味した文字列を返します。
このメソッドは、hou.Geometry.primFloatAttribValues()よりも高速で、array
モジュールを使用すれば、文字列をPythonシーケンスに変換することができます。
このメソッドは、以下の実装によって高速化しています:
import array def primFloatAttribValuesAsString(self, name): return array.array("f", self.primFloatAttribValues(name)).tostring()
このメソッドからの戻り値を以下のメソッドを使用して配列に変換することができます:
import array def primFloatAttribValuesAsArray(geometry, name): a = array.array("f") a.fromstring(geometry.primFloatAttribValuesAsString(name)) return a
詳細は、hou.Geometry.primFloatAttribValues()を参照してください。
setPrimFloatAttribValues(name, values)
特定のアトリビュートに対して、すべてのプリミティブのアトリビュート値を設定します。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
name
Primitiveアトリビュートの名前。
values
hou.Geometry.primFloatAttribValues()で返されるフォーマットと同じフォーマットのintまたはfloatの値のシーケンス。 詳細は、そのメソッドを参照してください。
アトリビュート名が無効な場合や、アトリビュートがintまたはfloatでない場合(例えば、文字列アトリビュート)や、値の配列が正しいサイズでない場合は、 このメソッドは、hou.OperationFailedを引き起こします。
このジオメトリが修正不可であれば、hou.GeometryPermissionErrorを引き起こします。
hou.Geometry.primFloatAttribValues()も参照してください。
setPrimFloatAttribValuesFromString(name, values, float_type=hou.numericData.Float32)
特定のアトリビュートに対して、指定したfloat_type値のシーケンスの文字列表現からすべてのプリミティブのアトリビュート値を設定します。 このメソッドは、hou.Geometry.setPrimFloatAttribValues()よりも高速です。
このメソッドは、文字列だけでなく他のタイプも受け入れることができます。つまりバッファインターフェースに対応したPythonオブジェクトを受け取ることができます。
特に、array
とnumpy
のPythonモジュールからの配列がサポートされているので、それらの配列から文字列を構築する必要がありません。
float_type
floatデータタイプ(Float16, Float32, Float64)を指定するためのhou.numericData値。
文字列の長さがlen(self.iterPrims() * byte_size_of_float_type)
でない場合は、hou.OperationFailedを引き起こします。
詳細は、hou.Geometry.setPrimFloatAttribValues()とhou.Geometry.primFloatAttribValuesAsString()を参照してください。
以下のサンプルの関数は、array.array("f")
を受け取り、そのアトリビュート値をその内容に設定します:
def setPrimFloatAttribValuesFromArray(geometry, arr): assert(arr.typecode == "f") geometry.setPrimFloatAttribValuesFromString(arr)
primIntAttribValues(name)
→ tuple
of int
すべてのプリミティブのアトリビュート値を含んだintのタプルを返します。
このメソッドは、intまたはfloatのアトリビュートに対してのみ動作します。 アトリビュートに2つ以上のエレメントが含まれている場合、各ポイントはその結果の複数値に相当します。 例えば、"idmap"がサイズ2のintアトリビュートで、(1, 2), (2, 3), (3, 4)の値の3つのプリミティブが存在すると、 その結果は、(1, 2, 2, 3, 3, 4)になります。
このメソッドのコールは、すべてのプリミティブをループしたり、hou.Prim.attribValue()をコールするよりも高速です。
アトリビュート名が無効な場合や、アトリビュートがintまたはfloatでない場合(例えば、文字列アトリビュート)は、このメソッドは、hou.OperationFailedを引き起こします。
アトリビュートを扱う他の多くのメソッドのように、hou.Attribオブジェクトをこのメソッドに渡すことが出来ないことに注意してください。 とはいえ、hou.Attrib.name()を使用すれば、簡単にAttribオブジェクトから名前を取得することができます。
primIntAttribValuesAsString(name, int_type=hou.numericData.Int32)
→ str
すべてのプリミティブに対してintのアトリビュート値を意味した文字列を返します。
このメソッドは、hou.Geometry.primFloatAttribValues()よりも高速で、array
モジュールを使用すれば、文字列をPythonシーケンスに変換することができます。
int_type
intデータタイプ(Int8, Int16, Int32, Int64)を指定するためのhou.numericData値。
このメソッドは、以下の実装によって高速化しています:
import array def primIntAttribValuesAsString(self, name): return array.array("i", self.primIntAttribValues(name)).tostring()
このメソッドからの戻り値を以下のメソッドを使用して配列に変換することができます:
import array def primIntAttribValuesAsArray(geometry, name): a = array.array("i") a.fromstring(geometry.primIntAttribValuesAsString(name)) return a
詳細は、hou.Geometry.primIntAttribValues()を参照してください。
setPrimIntAttribValues(name, values)
特定のアトリビュートに対して、すべてのプリミティブのアトリビュート値を設定します。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
name
Primitiveアトリビュートの名前。
values
hou.Geometry.primFloatAttribValues()で返されるフォーマットと同じフォーマットのintまたはfloatの値のシーケンス。 詳細は、そのメソッドを参照してください。
アトリビュート名が無効な場合や、アトリビュートがintまたはfloatでない場合(例えば、文字列アトリビュート)や、値の配列が正しいサイズでない場合は、 このメソッドは、hou.OperationFailedを引き起こします。
このジオメトリが修正不可であれば、hou.GeometryPermissionErrorを引き起こします。
hou.Geometry.primIntAttribValues()も参照してください。
setPrimIntAttribValuesFromString(name, values, int_type=hou.numericData.Int32)
特定のアトリビュートに対して、指定したint_type値のシーケンスの文字列表現からすべてのプリミティブにアトリビュート値を設定します。 このメソッドは、hou.Geometry.setPrimIntAttribValues()よりも高速です。
このメソッドは、文字列だけでなく他のタイプも受け入れることができます。つまりバッファインターフェースに対応したPythonオブジェクトを受け取ることができます。
特に、array
とnumpy
のPythonモジュールからの配列がサポートされているので、それらの配列から文字列を構築する必要がありません。
int_type
intデータタイプ(Int8, Int16, Int32, Int64)を指定するためのhou.numericData値。
文字列の長さがlen(self.iterPrims() * byte_size_of_int_type)
でない場合は、hou.OperationFailedを引き起こします。
詳細は、hou.Geometry.setPrimIntAttribValues()とhou.Geometry.primIntAttribValuesAsString()を参照してください。
以下のサンプルの関数は、sizeof(signed int) == 4と仮定してarray.array("i")
を受け取り、そのアトリビュート値をその内容に設定します:
def setPrimIntAttribValuesFromArray(geometry, arr): assert(arr.typecode == "i") geometry.setPrimIntAttribValuesFromString(arr)
primStringAttribValues(name)
→ tuple
of str
すべてのプリミティブの指定したアトリビュートの値を含んだ文字列のタプルを返します。
このメソッドは、文字列アトリビュートでのみ動作します。 指定したアトリビュートに2つ以上の要素が含まれている場合、各プリミティブは、その結果の複数値に呼応します。 例えば、"strmap"がサイズ2の文字列アトリビュートで、("apple", "orange"), ("red", "blue"), ("one", "two")の3つのプリミティブがあれば、 その結果は、("apple", "orange", "red", "blue", "one", "two")になります。
このメソッドのコールは、hou.Prim.attribValue()コールですべてのプリミティブをループさせるよりも高速です。
アトリビュート名が無効な場合や、アトリビュートが文字列アトリビュートでない場合、このメソッドはhou.OperationFailedを引き起こします。
アトリビュートを扱う他の多くのメソッドのように、hou.Attribオブジェクトをこのメソッドに渡すことが出来ないことに注意してください。 とはいえ、hou.Attrib.name()を使用すれば、簡単にAttribオブジェクトから名前を取得することができます。
setPrimStringAttribValues(name, values)
特定のアトリビュートに対して、すべてのプリミティブにそのアトリビュート値を設定します。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
name
Primitiveアトリビュートの名前。
values
hou.Geometry.primStringAttribValues()が返す形式と同じ形式の文字列値シーケンス。 詳細は、そのメソッドを参照してください。
アトリビュート名が無効だったり、アトリビュートが文字列でない、または値の配列が正しいサイズでない場合は、hou.OperationFailedを引き起こします。
このジオメトリが修正不可であれば、hou.GeometryPermissionErrorを引き起こします。
hou.Geometry.primStringAttribValues()も参照してください。
metaballWeight(pos3)
intersect(ray_origin, ray_direction, position_out, normal_out, uvw_out, pattern=None, min_hit=0.01, max_hit=1E18, tolerance=0.01)
→ int
このオブジェクト内のジオメトリと光線の交点を求めます。
Note
このメソッドは、交差に関する複数の情報を返すのではなくて、引数に渡したオブジェクトに対してその場で交差に関する情報が修正されるという点で独特なメソッドです。
# SOPノードからジオメトリを取得します。 geometry = hou.node("/obj/geo1/sphere1").geometry() # "天井"から原点にまっすぐ下に向いて光線を放射します。 origin = hou.Vector3(0, 100, 0) direction = hou.Vector3(0, -1, 0) # intersect()メソッドに渡すオブジェクトを作成します。 position = hou.Vector3() normal = hou.Vector3() uvw = hou.Vector3() # 最初の交点(存在すれば)を求めます。 did_intersect = geometry.intersect(origin, direction, position, normal, uvw)
光線がジオメトリと交差した場合は当たったプリミティブのID番号が返され、光線が当たらなかった場合は-1
を返します。
ray_origin
光線のワールド空間における開始点を表現したhou.Vector3オブジェクト。
ray_direction
光線の方向ベクトルを表現したhou.Vector3オブジェクト。
position_out
この引数にはhou.Vector3オブジェクトを渡します。このメソッドは、ワールド空間における交点を示すようにそのオブジェクトの値を変更します。
normal_out
この引数にはhou.Vector3オブジェクトを渡します。このメソッドは、サーフェスから光線に向かった法線方向を示すようにそのオブジェクトの値を変更します。
uvw_out
この引数にはhou.Vector3オブジェクトを渡します。このメソッドは、光線が当たったプリミティブのUVW位置を示すようにそのオブジェクトの値を変更します。
pattern
プリミティブグループ構文を含んだ文字列を渡すと、光線はそのパターンに合致したプリミティブにのみ交差させることができます。
min_hit
この距離よりも近い交差を無視します。
このmin_hit
引数を使って、前のヒットより若干長くmin_hit
を設定することで、光線に沿って交差する可能性のあるすべてのヒットをループさせることができます。
hit_positions = [] prev_dist = 0.01 while geometry.intersect(origin, direction, position, normal, uvw, min_hit=prev_dist): # ループを反復させる度にmin_hitを変更できるように、交点の *コピー* を格納する必要があります。 hit_positions.append(hou.Vector3(position)) prev_dist = origin.distanceTo(position) + 0.01
max_hit
この距離よりも遠い交差を無視します。
tolerance
このパラメータを使用することで、交差の精度を調整することができます。 光線がこの許容値内でジオメトリに到達すると、交差したと想定されます。 0.01の許容値(デフォルト)は厳格な交差になり、値が大きいほど交差の精度が悪くなります。
頂点
globVertices(pattern)
→ tuple
of hou.Vertex
頂点番号のパターンに相当する頂点のタプルを返します。
パターンフォーマットは、頂点選択を受け取るSOPノード上のグループフィールドで使われているものと同じフォーマットです。 詳細は、hou.Geometry.globPoints()を参照してください。
vertexFloatAttribValues(name)
→ tuple
of float
すべての頂点の指定したアトリビュートの値を含んだfloatのタプルを返します。
このメソッドは、intまたはfloatのアトリビュートでのみ動作します。 指定したアトリビュートに2つ以上の要素が含まれている場合、各頂点は、その結果の複数値に呼応します。 例えば、"attrib"がサイズ3のfloatアトリビュートで、(0.1, 0.2, 0.3), (0.5, 0.5, 0.5), (0.8, 0.7, 0.6)の3つの頂点があれば、 その結果は、(0.1, 0.2, 0.3, 0.5, 0.5, 0.5, 0.8,0.7, 0.6)になります。
このメソッドのコールは、hou.Vertex.attribValue()コールですべての頂点をループさせるよりも高速です。
アトリビュート名が無効な場合や、アトリビュートがintまたはfloatでない場合(例えば、文字列アトリビュート)は、このメソッドは、hou.OperationFailedを引き起こします。
アトリビュートを扱う他の多くのメソッドのように、hou.Attribオブジェクトをこのメソッドに渡すことが出来ないことに注意してください。 とはいえ、hou.Attrib.name()を使用すれば、簡単にAttribオブジェクトから名前を取得することができます。
vertexFloatAttribValuesAsString(name, float_type=hou.numericData.Float32)
→ str
すべての頂点のfloatアトリビュート値を表現した文字列を返します。
このメソッドはhou.Geometry.vertexFloatAttribValues()よりも高速で、array
モジュールを使用することで、その文字列をPythonシーケンスに変換することができます。
float_type
floatデータタイプ(Float16, Float32, Float64)を指定するためのhou.numericData値。
このメソッドは、以下の実装によって高速化しています:
import array def vertexFloatAttribValuesAsString(self, name): return array.array("f", self.vertexFloatAttribValues(name)).tostring()
このメソッドからの戻り値を以下のメソッドを使用して配列に変換することができます:
import array def vertexFloatAttribValuesAsArray(geometry, name): a = array.array("f") a.fromstring(geometry.vertexFloatAttribValuesAsString(name)) return a
詳細は、hou.Geometry.vertexFloatAttribValues()を参照してください。
setVertexFloatAttribValues(name, values)
特定のアトリビュートに対して、すべての頂点のアトリビュート値を設定します。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
name
Vertexアトリビュートの名前。
values
hou.Geometry.vertexFloatAttribValues()で返されるフォーマットと同じフォーマットのintまたはfloatの値のシーケンス。 詳細は、そのメソッドを参照してください。
アトリビュート名が無効な場合や、アトリビュートがintまたはfloatでない場合(例えば、文字列アトリビュート)や、値の配列が正しいサイズでない場合は、 このメソッドは、hou.OperationFailedを引き起こします。
このジオメトリが修正不可であれば、hou.GeometryPermissionErrorを引き起こします。
hou.Geometry.vertexFloatAttribValues()も参照してください。
setVertexFloatAttribValuesFromString(name, values, float_type=hou.numericData.Float32)
特定のアトリビュートに対して、指定したfloat_type値のシーケンスの文字列表現からすべての頂点にアトリビュート値を設定します。 このメソッドは、hou.Geometry.setVertexFloatAttribValues()よりも高速です。
このメソッドは、文字列だけでなく他のタイプも受け入れることができます。つまりバッファインターフェースに対応したPythonオブジェクトを受け取ることができます。
特に、array
とnumpy
のPythonモジュールからの配列がサポートされているので、それらの配列から文字列を構築する必要がありません。
float_type
floatデータタイプ(Float16, Float32, Float64)を指定するためのhou.numericData値。
文字列の長さがlen(self.iterVertexs() * byte_size_of_float_type)
でない場合は、hou.OperationFailedを引き起こします。
詳細は、hou.Geometry.setVertexFloatAttribValues()とhou.Geometry.vertexFloatAttribValuesAsString()を参照してください。
以下のサンプルの関数は、array.array("f")
を受け取り、そのアトリビュート値をその内容に設定します:
def setVertexFloatAttribValuesFromArray(geometry, arr): assert(arr.typecode == "f") geometry.setVertexFloatAttribValuesFromString(arr))
vertexIntAttribValues(name)
→ tuple
of int
すべての頂点の指定したアトリビュートの値を含んだ整数のタプルを返します。
このメソッドは、intまたはfloatのアトリビュートでのみ動作します。 指定したアトリビュートに2つ以上の要素が含まれている場合、各頂点は、その結果の複数値に呼応します。 例えば、"idmap"がサイズ2の整数アトリビュートで、(1, 2), (2, 3), (3, 4)の3つの頂点があれば、 その結果は、(1, 2, 2, 3, 3, 4)になります。
このメソッドのコールは、hou.Vertex.attribValue()コールですべての頂点をループさせるよりも高速です。
アトリビュート名が無効な場合や、アトリビュートがintまたはfloatでない場合(例えば、文字列アトリビュート)は、このメソッドは、hou.OperationFailedを引き起こします。
アトリビュートを扱う他の多くのメソッドのように、hou.Attribオブジェクトをこのメソッドに渡すことが出来ないことに注意してください。 とはいえ、hou.Attrib.name()を使用すれば、簡単にAttribオブジェクトから名前を取得することができます。
vertexIntAttribValuesAsString(name, int_type=hou.numericData.Int32)
→ str
すべての頂点の整数アトリビュート値を表現した文字列を返します。
このメソッドはhou.Geometry.vertexIntAttribValues()よりも高速で、array
モジュールを使用することで、その文字列をPythonシーケンスに変換することができます。
int_type
整数データタイプ(Int8, Int16, Int32, Int64)を指定するためのhou.numericData値。
このメソッドは、以下の実装によって高速化しています:
import array def vertexIntAttribValuesAsString(self, name): return array.array("i", self.vertexIntAttribValues(name)).tostring()
このメソッドからの戻り値を以下のメソッドを使用して配列に変換することができます:
import array def vertexIntAttribValuesAsArray(geometry, name): a = array.array("i") a.fromstring(geometry.vertexIntAttribValuesAsString(name)) return a
詳細は、hou.Geometry.vertexIntAttribValues()を参照してください。
setVertexIntAttribValues(name, values)
特定のアトリビュートに対して、すべての頂点のアトリビュート値を設定します。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
name
Vertexアトリビュートの名前。
values
hou.Geometry.vertexIntAttribValues()で返されるフォーマットと同じフォーマットのintまたはfloatの値のシーケンス。 詳細は、そのメソッドを参照してください。
アトリビュート名が無効な場合や、アトリビュートがintまたはfloatでない場合(例えば、文字列アトリビュート)や、値の配列が正しいサイズでない場合は、 このメソッドは、hou.OperationFailedを引き起こします。
このジオメトリが修正不可であれば、hou.GeometryPermissionErrorを引き起こします。
hou.Geometry.vertexIntAttribValues()も参照してください。
setVertexIntAttribValuesFromString(name, values, int_type=hou.numericData.Int32)
特定のアトリビュートに対して、指定したint_type値のシーケンスの文字列表現からすべての頂点にアトリビュート値を設定します。 このメソッドは、hou.Geometry.setVertexIntAttribValues()よりも高速です。
このメソッドは、文字列だけでなく他のタイプも受け入れることができます。つまりバッファインターフェースに対応したPythonオブジェクトを受け取ることができます。
特に、array
とnumpy
のPythonモジュールからの配列がサポートされているので、それらの配列から文字列を構築する必要がありません。
int_type
整数データタイプ(Int8, Int16, Int32, Int64)を指定するためのhou.numericData値。
文字列の長さがlen(self.iterVertexs() * byte_size_of_int_type)
でない場合は、hou.OperationFailedを引き起こします。
詳細は、hou.Geometry.setVertexIntAttribValues()とhou.Geometry.vertexIntAttribValuesAsString()を参照してください。
以下のサンプルの関数は、sizeof(signed int) == 4と仮定してarray.array("i")
を受け取り、そのアトリビュート値をその内容に設定します:
def setVertexIntAttribValuesFromArray(geometry, arr): assert(arr.typecode == "i") geometry.setVertexIntAttribValuesFromString(arr))
vertexStringAttribValues(name)
→ tuple
of str
すべての頂点の指定したアトリビュートの値を含んだ文字列のタプルを返します。
このメソッドは、文字列アトリビュートでのみ動作します。 指定したアトリビュートに2つ以上の要素が含まれている場合、各頂点は、その結果の複数値に呼応します。 例えば、"strmap"がサイズ2の文字列アトリビュートで、("apple", "orange"), ("red", "blue"), ("one", "two")の3つの頂点があれば、 その結果は、("apple", "orange", "red", "blue", "one", "two")になります。
このメソッドのコールは、hou.Vertex.attribValue()コールですべての頂点をループさせるよりも高速です。
アトリビュート名が無効な場合や、アトリビュートが文字列アトリビュートでない場合、このメソッドはhou.OperationFailedを引き起こします。
アトリビュートを扱う他の多くのメソッドのように、hou.Attribオブジェクトをこのメソッドに渡すことが出来ないことに注意してください。 とはいえ、hou.Attrib.name()を使用すれば、簡単にAttribオブジェクトから名前を取得することができます。
setVertexStringAttribValues(name, values)
特定のアトリビュートに対して、すべての頂点にそのアトリビュート値を設定します。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
name
Vertexアトリビュートの名前。
values
hou.Geometry.vertexStringAttribValues()が返す形式と同じ形式の文字列値シーケンス。 詳細は、そのメソッドを参照してください。
アトリビュート名が無効だったり、アトリビュートが文字列でない、または値の配列が正しいサイズでない場合は、hou.OperationFailedを引き起こします。
このジオメトリが修正不可であれば、hou.GeometryPermissionErrorを引き起こします。
hou.Geometry.vertexStringAttribValues()も参照してください。
データ
data()
→ str
bgeoフォーマットのジオメトリデータを返します。
例:
geometry = hou.node("/obj/geo1/torus1").geometry() bgeo_data = geometry.data() open("/tmp/torus.bgeo", "wb").write(bgeo_data)
saveToFile(file_name)
ジオメトリオブジェクトの内容をファイルに保存します。ファイルの拡張子は、使用するファイルフォーマットで決まります。
GEOio
でリストされている拡張子を含むHoudiniでサポートされているファイルフォーマット(例えば、geo, bgeo, objなど)がサポートされています。
ファイルの拡張子が認識できなかった場合、bgeoフォーマットが使用されます。
ファイルのパスが無効または権限エラーや他のI/Oエラーがあった場合は、hou.OperationFailedを引き起こします。
loadFromFile(file_name)
このジオメトリオブジェクトの内容をファイルに保存されたデータに置換します。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
HoudiniのFile SOPでサポートされているファイルのタイプを指定することができます。 詳細は、hou.Geometry.saveToFile()を参照してください。
ファイルが存在しない、またはファイルを読み込むことができなかった場合は、hou.OperationFailedを引き起こします。
このジオメトリが修正不可であれば、hou.GeometryPermissionErrorを引き起こします。
hou.Geometry.merge()も参照してください。
clear()
このジオメトリオブジェクトからすべてを削除します。 このメソッドをコールした後は、ジオメトリにはポイントやプリミティブがなくなります。
このジオメトリが修正不可であれば、hou.GeometryPermissionErrorを引き起こします。
merge(geometry)
他のhou.Geometryオブジェクトのポイントとプリミティブをこのオブジェクトにマージします。 新しいポイントとプリミティブが、このジオメトリのポイントとプリミティブに追加されます。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
このジオメトリが修正不可であれば、hou.GeometryPermissionErrorを引き起こします。
hou.Geometry.loadFromFile()も参照してください。
execute(verb, inputs=[])
→ HOM_Geometry
myselfを1番目の入力としてverb.execute()を呼び出し、その結果のジオメトリを返します。 これによって、一連のVerbの呼び出しをチェーン化することができます: geo.execute(subdivide).execute(subdivide)。
オプションの入力は、ジオメトリ自体を前に追加します。
トランスフォーム
transform(matrix)
トランスフォームマトリックスでジオメトリをトランスフォーム(例えば、回転、スケール、移動など)します。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
トランスフォームマトリックスを構築する関数に関しては、hou.hmathを参照してください。
このジオメトリが修正不可であれば、hou.GeometryPermissionErrorを引き起こします。
transformPrims(prims, matrix)
トランスフォームマトリックスでプリミティブのセットをトランスフォーム(例えば、回転、スケール、移動など)します。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
import math # このコードは、Python SOP内から動作しますが、Pythonシェルからは動作しません。 def createCircle(geo, num_vertices=10): # 指定した頂点数で閉じたカーブを作成します。 curve = geo.createNURBSCurve(num_vertices) curve.setIsClosed(True) # ポイントをXZ平面上の原点を中心としたユニット円に配置します。 for i, vertex in enumerate(curve.vertices()): angle = i * (2.0 * math.pi) / num_vertices position = (math.cos(angle), 0, math.sin(angle)) vertex.point().setPosition(position) return curve # XY平面上にたくさんの円を作成し、それらの円をX軸で若干傾け、原点から移動させ、Y軸でそれぞれの円を1度ずつ回転させます。 geo = hou.pwd().geometry() num_copies = 20 for i in range(num_copies): curve = createCircle(geo) geo.transformPrims([curve], hou.hmath.buildRotateAboutAxis((1, 0, 0), 30) * hou.hmath.buildTranslate((2, 0, 0)) * hou.hmath.buildRotateAboutAxis((0, 1, 0), i * 360.0 / num_copies))
トランスフォームマトリックスを構築する関数に関しては、hou.hmathを参照してください。
このジオメトリが修正不可であれば、hou.GeometryPermissionErrorを引き起こします。
ループ
primLoop(prims, loop_type)
→ tuple
of hou.Prim
primsパラメータで指定したプリミティブに繋がったパスを作成するhou.Primオブジェクトのタプルを返します。 複数のパスが返される場合は、それらがNoneの値によって単一の戻りタプルに分けられます。 ビューポート内でループ選択を実行する時に使用される同じアルゴリズムを使用してパスが生成されます。
prims
この関数が返すパスまたは繋がったプリミティブのパスを定義するhou.Primオブジェクトのリスト。 リストには、最低でも2個のプリミティブを含めなければなりません。
loop_type
返されるパスのタイプを制御します。ここにはhou.componentLoopType値のどれかを指定することができます。 hou.componentLoopType.Extendedまたはhou.componentLoopType.Closedのループタイプのどちらかを使用すれば、 入力のprimsにはNoneエントリーを含めることができません。 さらに、プリミティブの各ペアは、別のフルループを定義するために使用されるので、プリミティブの数は偶数でなければなりません。 それらの条件が満たされなかった場合は、hou.OperationFailed例外が発生します。
指定したコンポーネントからループを構築することができなかった場合は、hou.OperationFailedを引き起こします。
pointLoop(points, full_loop)
→ tuple
of hou.Point
pointsパラメータで指定したポイントに繋がったパスを作成するhou.Pointオブジェクトのタプルを返します。 複数のパスが返される場合は、それらがNoneの値によって単一の戻りタプルに分けられます。 ビューポート内でループ選択を実行する時に使用される同じアルゴリズムを使用してパスが生成されます。
points
この関数が返すパスまたは繋がったポイントのパスを定義するhou.Pointオブジェクトのリスト。 リストには、最低でも2個のポイントを含めなければなりません。
loop_type
返されるパスのタイプを制御します。ここにはhou.componentLoopType値のどれかを指定することができます。 hou.componentLoopType.Extendedまたはhou.componentLoopType.Closedのループタイプのどちらかを使用すれば、 入力のpointsにはNoneエントリーを含めることができません。 さらに、ポイントの各ペアは、別のフルループを定義するために使用されるので、ポイントの数は偶数でなければなりません。 それらの条件が満たされなかった場合は、hou.OperationFailed例外が発生します。
指定したコンポーネントからループを構築することができなかった場合は、hou.OperationFailedを引き起こします。
edgeLoop(edges, loop_type, full_loop_per_edge, force_ring, allow_ring)
→ tuple
of hou.Edge
edgesパラメータで指定したポイントに繋がったパスを作成するhou.Edgeオブジェクトのタプルを返します。 複数のパスが返される場合は、それらがNoneの値によって単一の戻りタプルに分けられます。 ビューポート内でループ選択を実行する時に使用される同じアルゴリズムを使用してパスが生成されます。
edges
この関数が返すパスまたは繋がったエッジのパスを定義するhou.Edgeオブジェクトのリスト。 リストには、ループオプションに応じて最低でも1個または2個のエッジを含めなければなりません。
loop_type
返されるパスのタイプを制御します。ここにはhou.componentLoopType値のどれかを指定することができます。 hou.componentLoopType.Extendedまたはhou.componentLoopType.Closedのループタイプのどちらかを使用すれば、 入力のedgesにはNoneエントリーを含めることができません。 それらの条件が満たされなかった場合は、hou.OperationFailed例外が発生します。
full_loop_per_edge
Trueに設定し、loop_typeをhou.componentLoopType.Extendedまたはhou.componentLoopType.Closedのループタイプに設定すれば、 各入力のエッジは、フルループまたはリングを作成するのに使用されます。 Falseに設定すると、エッジをペアで受け取るので、エッジの数は偶数でなければなりません。
force_ring
Trueに設定すると、この関数は、エッジループではなくエッジリングを返します。
allow_ring
Trueに設定すると、この関数は、指定したエッジがループよりもリングを生成する方が自然であれば(例えば、2つの垂直なエッジをポリゴングリッド上の同じ行から指定した場合)、エッジリングが返されます。 Falseに設定すると、エッジループのみが返されます。
指定したコンポーネントからループを構築することができなかった場合は、hou.OperationFailedを引き起こします。
pointNormals(points)
→ tuple
of hou.Vector3
指定したポイントのポイント法線を表現したhou.Vector3オブジェクトのタプルを返します。
points
ポイント法線を計算するhou.Pointオブジェクトのリスト。
選択
selection()
→ hou.Selection
このジオメトリに関係する現在のクックコンポーネント選択を返します。 これは、そのジオメトリを作成したSOPで設定されたデフォルトの選択です。