Inheritance |
|
メソッド ¶
resolution()
→ hou.Vector3
ボリュームのx,y,zの寸法を返します。 例えば、(10, 20, 30)の解像度は、xに10ボクセル、yに20ボクセル、zに30ボクセルのボリュームを意味します。
sample(position)
→ float
3D位置を含んだ3つのfloatのシーケンスを指定すると、その位置でのボリュームの値を返します。 その位置がボクセルの中央でない場合、Houdiniは、周囲のボクセルの値を使用して補間します。
hou.Volume.voxelとhou.Volume.posToIndexも参照してください。
gradient(position)
→ hou.Vector3
3D位置を含んだ3つのfloatのシーケンスを指定すると、ボリュームの値の増分が一番大きいレートの方向を向いたベクトルを返します。
詳細は、 Wikipedia’s gradient page を参照してください。
voxel(index)
→ float
ボクセルインデックスを含んだ3つのintegerのシーケンスを指定すると、それに相当するボクセルの値を返します。
>>> volume_sop = hou.node("/obj").createNode("geo").createNode("volume") >>> volume_sop.parm("initialval1").set(0.3) >>> volume = volume_sop.geometry().prims()[0] >>> volume.resolution() (10, 10, 10) >>> volume.voxel((0, 0, 0)) 0.3
setVoxel(index, value)
ボクセルの値を設定します。通常では、Python定義のSOPのコードからこのメソッドをコールします。
index
ボクセルインデックスを含んだ3つのintegerのシーケンス。 インデックスのどれかの値が範囲外であれば、hou.OperationFailedを引き起こします。
value
ボクセルの新しい値を含んだfloat。
このジオメトリが修正不可であれば、hou.GeometryPermissionErrorを引き起こします。
allVoxels()
→ tuple of float
すべてのボクセルの値を含んだfloatのタプルを返します。 このメソッドをコールして、すべてのボクセルを取得した方が、Pythonでボクセル配列をループするよりも高速です。
例えば、PythonのNumpyライブラリを使用してボクセルデータを処理してから、hou.Volume.setAllVoxelsを使用したPython SOPから その結果をボリュームに保存することができます。 Numpyは、floatの平坦タプルの形を変更して、floatの3Dマトリックスのような挙動をさせることができます。
このメソッドはほぼ以下のように実装されています。(しかし、このPythonの実装は非常に遅いです):
def allVoxels(self): result = [] xres, yres, zres = self.resolution() for z in range(zres): for y in range(yres): for x in range(xres): result.append(self.voxel((x, y, z))) return tuple(result)
hou.Volume.allVoxelsAsString, hou.Geometry.pointFloatAttribValues, hou.Geometry.primFloatAttribValuesも参照してください。
allVoxelsAsString()
→ str
for Python 2, bytes
for Python 3
すべてのボクセルのすべての値を含んだfloatのバイナリ文字列表現を返します。
このメソッドはhou.Volume.allVoxelsよりも高速で、array
モジュールを使用すれば、その文字列をPythonシーケンスに
変換することができます。
返されるバイナリ文字列は、Python3だとbytes
オブジェクト、Python2だとstr
オブジェクトです。
詳細は、HOMバイナリデータを参照してください。
このメソッドは、以下のようにより高速な実装を備えています:
import array def allVoxelsAsString(self): return array.array("f", self.allVoxels()).tostring()
以下のメソッドを使用することで、このメソッドの戻り値を配列に変換することができます:
import array def allVoxelsAsArray(volume): a = array.array("f") a.fromstring(volume.allVoxelsAsString()) return a
詳細は、hou.Volume.allVoxelsを参照してください。
setAllVoxels(values)
このボリューム内のすべてのボクセルの値を設定します。通常では、Python定義のSOPのコードからこのメソッドをコールします。
値のシーケンスがself.resolution()[0] * self.resolution()[1] * self.resolution()[2]
とまったく同じでなかった場合は、
hou.OperationFailedを引き起こします。
このジオメトリが修正不可なら、hou.GeometryPermissionErrorを引き起こします。
hou.Volume.allVoxelsも参照してください。
setAllVoxelsFromString(values)
単精度浮動小数点値のシーケンスの文字列表現から、このボリューム内のすべてのボクセルの値を設定します。 このメソッドは、hou.Volume.setAllVoxelsよりも高速です。
このメソッドは、文字列だけでなくもっと多くのタイプを受け入れることができます。
つまり、バッファインターフェースに対応しているどのPythonオブジェクトも受け取ることができます。
特に、array
とnumpy
のPythonモジュールからの配列に対応しているので、まず最初にそれらの配列から文字列を構築する必要がありません。
文字列の長さがself.resolution()[0] * self.resolution()[1] * self.resolution()[2] * 4
とまったく同じでなかった場合は、hou.OperationFailedを引き起こします。
詳細は、hou.Volume.setAllVoxelsとhou.Volume.allVoxelsAsStringを参照してください。
以下のサンプルの関数は、array.array("f")
を受け入れ、それらのボクセルをそれらの内容に設定します:
def setAllVoxelsFromArray(volume, arr): assert(arr.typecode == "f") volume.setAllVoxelsFromString(arr)
voxelSlice(plane, index)
→ tuple
of float
特定のスライス内のすべてのボクセルの値を含んだfloatのタプルを返します。 このメソッドをコールしてスライスを取得する方が、Pythonでボクセル配列をループさせるよりも高速です。
plane
このスライスに相当する平面。この値は、“xy”, “xz”, “yz”のどれかでなければなりません。
index
配列内のこのスライスのインデックス。例えば、平面が“xy”なら、このインデックスはz値で、その結果には、この特定のz値でのボクセル内のすべての値が含まれます。
このメソッドはほぼ以下のように実装されています。 (しかし、このPythonの実装は非常に遅いです):
def voxelSlice(self, plane, index): result = [] start = [0] * 3 stop = list(self.resolution()) slice_axis = {"xy": 2, "xz": 1, "yz": 0}[plane] start[slice_axis] = index stop[slice_axis] = index + 1 for z in range(start[2], stop[2]): for y in range(start[1], stop[1]): for x in range(start[0], stop[0]): result.append(self.voxel((x, y, z))) return tuple(result)
hou.Volume.voxelSliceAsStringとhou.Volume.allVoxelsも参照してください。
voxelSliceAsString(plane, index)
→ str
特定のスライス内のボクセルのすべての値を含んだfloatのバイナリ文字列表現を返します。
返されるバイナリ文字列は、Python3だとbytes
オブジェクト、Python2だとstr
オブジェクトです。
詳細は、HOMバイナリデータを参照してください。
詳細は、hou.Volume.voxelSliceとhou.Volume.allVoxelsAsStringを参照してください。
setVoxelSlice(values, plane, index)
このボリュームの特定のスライス内のボクセルの値を設定します。通常では、Python定義のSOPのコードからこのメソッドをコールします。
values
スライスでの新しい値を含んだfloatのシーケンス。
plane
このスライスに相当する平面。この値は、“xy”, “xz”, “yz”のどれかでなければなりません。
index
配列内のこのスライスのインデックス。例えば、平面が“xy”なら、このインデックスはz値で、その結果には、この特定のz値でのボクセル内のすべての値が含まれます。
値のシーケンスがスライス内のボクセル数と同じでない場合は、hou.OperationFailedを引き起こします。
このジオメトリが修正不可なら、hou.GeometryPermissionErrorを引き起こします。
hou.Volume.voxelSliceも参照してください。 サンプルは、hou.Volume.setVoxelSliceFromStringを参照してください。
setVoxelSliceFromString(values, plane, index)
このボリュームの特定のスライス内のボクセルの値を設定します。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
values
スライスでの新しい値を含んだfloatのシーケンスのバイナリ文字列表現。
このメソッドは、文字列だけでなくもっと多くのタイプを受け入れることができます。
つまり、バッファインターフェースに対応しているどのPythonオブジェクトも受け取ることができます。
特に、array
とnumpy
のPythonモジュールからの配列に対応しているので、まず最初にそれらの配列から文字列を構築する必要がありません。
plane
このスライスに相当する平面。この値は、“xy”, “xz”, “yz”のどれかでなければなりません。
index
配列内のこのスライスのインデックス。
詳細は、hou.Volume.setVoxelSliceを参照してください。
以下のサンプルは、コンポジットネットワークシーケンスからボリュームを構築します:
def buildVolumeFromCopSequence( cop_node, geo, voxel_depth, plane="C", component="r"): zres = int(cop_node.sequenceFrameLength()) volume_bbox = hou.BoundingBox(( 0, 0, 0, cop_node.xRes(), cop_node.yRes(), zres) * voxel_depth) volume = geo.createVolume( cop_node.xRes(), cop_node.yRes(), zres, volume_bbox) for z in range(zres): pixels = cop_node.allPixelsAsString( plane, component, time=hou.frameToTime(z + cop_node.sequenceStartFrame())) volume.setVoxelSliceFromString(pixels, "xy", z)
posToIndex(position)
→ tuple
of int
3D位置を含んだ3つのfloatのシーケンスを指定すると、それに相当するインデックスを含んだ3つのintのタプルをボクセル配列に返します。
その位置がボリューム外にあれば、返されるインデックスは無効になります。 そのインデックスが有効かどうか判断するには、hou.Volume.isValidIndexを使用します。
indexToPos(index)
→ hou.Vector3
インデックスを含んだ3つのintのシーケンスをボクセル配列に渡すと、それに相当するそのボクセルの中央の3D位置を返します。
isValidIndex(index)
→ bool
インデックスを含んだ3つのintのシーケンスがボクセル配列内で有効かどうか返します。つまり、配列の境界内にあるかどうか返します。
このメソッドは、ほぼ以下のように実装されています:
def isValidIndex(self, index): for i, maximum in zip(index, self.resolution()): if i < 0 or i >= maximum: return False return True
isSDF()
→ bool
ボリュームが符号付き距離フィールドとしてフラグが立っているかどうか返します。 そのようなボリュームは、特別な境界条件を持っていて、境界外の読み込み部分は、境界ボックスまでの距離をストリーク境界条件に追加します。 それらの部分も意味的には符号付き距離フィールドとして扱うのが非常に良いです。
isHeightField()
→ bool
ボリュームがHeight Fieldとしてフラグが立っているかどうか返します。 そのようなボリュームは、2次元であり、そのHeight Fieldが可視化されます。
volumeAverage()
→ float
すべてのボクセルの平均値を返します。
volumeMin()
→ float
すべてのボクセルの最小値を返します。
volumeMax()
→ float
すべてのボクセルの最大値を返します。
transform()
→ hou.Matrix3
このボリュームのスケールと回転のトランスフォームを含んだ3×3マトリックスを返します。
そのボリュームの位置情報は、volume.vertex(0).point().position()
をコールすることで取得することができます。
以下の関数は、移動を含んだボリュームの4×4トランスフォームマトリックスを返します:
def fullTransform(volume): return (hou.Matrix4(volume.transform()) * hou.hmath.buildTranslate(volume.vertex(0).point().position()))
Note
ワールド空間にするには、ノードトランスフォームを取得する必要があります。
setTransform(matrix4)
4×4マトリックスを指定して、このボリュームの位置、回転、スケールを設定します。
ボリュームの移動部分だけをhou.Vector3に設定したいのであれば、単にvolume.vertex(0).point().setPosition(position)
をコールすれば良いです。
vertex(index)
self.vertices()[index]
のショートカット。おそらく、このメソッドをコールする必要はありません。
このメソッドは、最後からインデックスを指定するためのマイナスのインデックスをサポートしています。まさにself.vertices()[index]
のようなものです。
また、Pythonのインデックス操作のように、インデックスが範囲外の時は、IndexErrorを引き起こします。
voxelSize()
→ hou.Vector3
ボリューム内のボクセルのサイズを返します。 テーパーが付いていないボリュームでは、すべてのボクセルがこのサイズになります。
Methods from hou.Prim ¶
attribValue(name_or_attrib)
→ int
, float
, str
, tuple
or dict
特定のアトリビュートに対するこのプリミティブ内に格納された値を返します。 このアトリビュートは、名前またはhou.Attribオブジェクトで指定することができます。
hou.Attribオブジェクトを使用してアトリビュート値を調べる方が、名前を使用して調べるよりも若干高速です。 ループ内でアトリビュート値を調べる時は、そのループ外でhou.Attribオブジェクトを調べて、それをこのメソッドに渡してください。
すべてのプリミティブのアトリビュート値を調べる時は、hou.Geometry.primFloatAttribValuesまたはhou.Geometry.primFloatAttribValuesAsStringをコールする方が、 ジオメトリ内のプリミティブ毎にこのメソッドをコールするよりも高速です。
この名前のアトリビュートが存在しなかった場合は、hou.OperationFailedを引き起こします。
floatAttribValue(attrib)
→ float
特定の浮動小数点アトリビュートのプリミティブアトリビュート値を返します。 このアトリビュートは、名前またはhou.Attribオブジェクトで指定することができます。
この名前のアトリビュートが存在しない、またはアトリビュートのサイズが1のfloatでなかった場合は、hou.OperationFailedを引き起こします。
ほとんどの場合では、アトリビュート値にアクセスするには、単にhou.Prim.attribValueを使用すればいいです。 Houdiniは、内部的にこのメソッドを使用してattribValueを実装しています。
floatListAttribValue(name_or_attrib)
→ tuple
of float
特定の浮動小数点アトリビュートのプリミティブアトリビュート値を返します。 このアトリビュートは、名前またはhou.Attribオブジェクトで指定することができます。 戻り値は、floatのタプルです。
アトリビュートのサイズが1の時にこのメソッドをコールするのは有効です。 この場合では、1つのエレメントを持ったタプルが返されます。
hou.Prim.attribValueも参照してください。
intAttribValue(name_or_attrib)
→ int
サイズが1の特定の整数アトリビュートのプリミティブアトリビュート値を返します。 このアトリビュートは、名前またはhou.Attribオブジェクトで指定することができます。 詳細は、hou.Point.floatAttribValueを参照してください。
intListAttribValue(name_or_attrib)
→ tuple
of int
特定の整数アトリビュートのプリミティブアトリビュート値を返します。 このアトリビュートは、名前またはhou.Attribオブジェクトで指定することができます。 戻り値は、intのタプルです。詳細は、hou.Prim.floatListAttribValueを参照してください。
stringAttribValue(name_or_attrib)
→ str
特定の文字列アトリビュートのプリミティブアトリビュート値を返します。 このアトリビュートは、名前またはhou.Attribオブジェクトで指定することができます。 詳細は、hou.Prim.floatAttribValueを参照してください。
stringListAttribValue(name_or_attrib)
→ tuple
of str
特定の文字列アトリビュートのプリミティブアトリビュート値を返します。 このアトリビュートは、名前またはhou.Attribオブジェクトで指定することができます。 戻り値は、文字列のタプルです。
アトリビュートのサイズが1の時にこのメソッドをコールするのは有効です。 この場合では、1つのエレメントを持ったタプルが返されます。
hou.Prim.attribValueも参照してください。
dictAttribValue(name_or_attrib)
→ dict
特定の辞書アトリビュートのプリミティブアトリビュート値を返します。 このアトリビュートは、名前またはhou.Attribオブジェクトで指定することができます。 詳細は、hou.Prim.floatAttribValueを参照してください。
dictListAttribValue(name_or_attrib)
→ tuple
of str
特定の辞書アトリビュートのプリミティブアトリビュート値を返します。 このアトリビュートは、名前またはhou.Attribオブジェクトで指定することができます。 戻り値は、辞書のタプルです。
アトリビュートのサイズが1の時でも、このメソッドをコールすることができます。 この場合、1つのエレメントが含まれたタプルが返されます。 詳細は、hou.Prim.floatAttribValueを参照してください。
setAttribValue(name_or_attrib, attrib_value)
このプリミティブにアトリビュート値を保存します。 このアトリビュートは、名前またはhou.Attribオブジェクトで指定することができ、ジオメトリ内の既存プリミティブアトリビュートでなければなりません。 通常では、Python定義のSOPのコードからこのメソッドをコールします。
この名前のアトリビュートが存在しなかったり、そのアトリビュートのデータタイプが渡された値と一致しなかった場合は、hou.OperationFailedを引き起こします。 アトリビュートのサイズが2以上であれば、そのアトリビュート値は、int/floatのシーケンスでなければならず、そのシーケンスのサイズはアトリビュートのサイズと同じでなければなりません。
このジオメトリが修正不可なら、hou.GeometryPermissionErrorを引き起こします。
# "Cd"という名前のサイズが3のfloatプリミティブアトリビュートを作成し、プリミティブ毎に固有のカラーを割り当てます。 # このコードは、Python SOP内から動作しますが、Pythonシェルからは動作しません。 geo = hou.pwd().geometry() color_attrib = geo.addAttrib(hou.attribType.Prim, "Cd", (1.0, 1.0, 1.0)) num_prims = len(geo.prims()) color = hou.Color() for prim in geo.prims(): fraction = float(prim.number()) / num_prims # プリミティブ毎に、彩度と明度が同じで色相を別にします。 # アトリビュートにRGB値を保存します。 color.setHSV((fraction * 255, 1, 1)) prim.setAttribValue(color_attrib, color.rgb())
attribType()
→ hou.attribType列挙値
hou.attribType.Prim列挙値を返します。 ポイント、プリミティブ、頂点、ジオメトリは、アトリビュートを照会するのに同じメソッドをサポートしていて、このメソッドはその内の1つです。
以下も参照してください:
intrinsicValueDict()
→ dict
of str
to value
Intrinsic名とその値をマッピングした辞書を返します。
intrinsicValue(intrinsic_name)
→ int
, float
, str
, or tuple
よく計算されるプリミティブの“Intrinsic(組み込み)”の値(例えば、bounds
, measuredarea
, vertexcount
など)を取得します。
measuredarea
といったほとんどのIntrinsic値は計算任せですが、一部の値はhou.Prim.setIntrinsicValueを使って書き込み可能です。
例えば、球プリミティブは、その定義の一部であるトランスフォームマトリックスを持っています。
Geometry Spreadsheetを使うことで、ユーザインターフェースからそれらの値を閲覧することもできます。
指定したIntrinsic名が存在しなかった場合はhou.OperationFailedを引き起こします。 hou.Prim.intrinsicNamesを使うことで、利用可能なIntrinsic名のリストを取得することができます。 プリミティブのタイプが異なれば、利用可能なIntrinsic値も異なります。
bounds
やpackedbounds
などの境界ボックス系Intrinsic値は、(xmin, xmax, ymin, ymax, zmin, zmax)の順番で返されます。
intrinsicNames()
→ tuple
of str
このプリミティブで利用可能なIntrinsic名を表現した文字列のタプルを返します。 プリミティブのタイプが異なれば、利用可能なIntrinsic名も異なります。 hou.Prim.intrinsicValue/hou.Prim.setIntrinsicValueを使用することで、その値を取得したり設定することができます。
setIntrinsicValue(intrinsic_name, value)
一部の“Intrinsic”値は変更可能です。 例えば、トランスフォームを表現した9個のfloatタプルをhou.Prim.setIntrinsicValueに渡すことで、球プリミティブの内部サイズと回転(トランスフォーム)を変更することができます。 Intrinsicが書き込み不可、渡した値が正しくない、指定したIntrinsic名が存在しない場合は、hou.OperationFailedを引き起こします。
intrinsicReadOnly(intrinsic_name)
→ bool
Intrinsic(組み込み)アトリビュートが読み取り専用かどうか返し、そうでないなら、hou.Prim.setIntrinsicValueで修正することができます。
intrinsicSize(intrinsic_name)
→ int
Intrinsic値のタプルサイズを返します。
positionAtInterior(u, v, w=0.0)
→ hou.Vector3
正規化した(つまり0から1)u,v,w値を指定すると、パラメトリック位置でのプリミティブの内部位置を返します。
外周沿いの位置を照会するには、hou.Face.positionAtを使用してください。
attribValueAtInterior(attrib_or_name, u, v, w=0.0)
→ int
, float
, str
or tuple
プリミティブの内部での正規化したu,v,wのパラメトリック位置でのアトリビュート値を返します。
そのアトリビュートがポイントや頂点のアトリビュートでなかった場合は、hou.OperationFailedを引き起こします。 プリミティブアトリビュート値が必要であれば、これはサーフェスに渡って変化しないので、hou.Prim.attribValueを使用してください。
外周沿いのアトリビュートを照会するには、hou.Face.attribValueAtを使用してください。
number()
→ int
このプリミティブの番号を返します。 プリミティブ番号は0から始まって順々に番号が振られていて、hou.Geometry.primsで返されるプリミティブは、その番号で並んでいます。
type()
→ hou.primType列挙値
このプリミティブのタイプ(例えば、ポリゴン、NURBSカーブ、メタボールなど)を含んだhou.primType値を返します。
vertices()
→ generator of hou.Vertex
このプリミティブ内に含まれている頂点のシーケンスを返します。
そのプリミティブがフェース(例えば、ポリゴンやNURBSカーブ)なら、その結果は、そのフェース内の頂点の順番に相当します。 そのプリミティブがサーフェス(例えば、NURBSメッシュ)なら、そのプリミティブは頂点の2D配列を持ち、このメソッドは、その2D配列内のすべての頂点を列で並べて返します。
2D頂点配列とシーケンシャル頂点インデックス間の関係性、サーフェス内の頂点にアクセスする方法に関する詳細は、hou.Surface.vertexを参照してください。
numVertices()
→ int
len(self.vertices())
のショートカット。おそらく、このメソッドをコールする必要はありません。
points()
→ list of hou.Point
各頂点をループさせずにプリミティブのすべてのポイントを取得するショートカット。
boundingBox()
→ hou.BoundingBox
このプリミティブを囲むのに十分な大きさのサイズと位置の軸平行の3D境界ボックスを返します。
nearestToPosition(pos3)
位置を含んだ3つのfloatのシーケンスを指定すると、その位置に一番近いこのプリミティブ上の位置を検索します。 このプリミティブ上のu値、このプリミティブ上のv値、このプリミティブまでの距離を含んだタプルを返します。
Note
返されるUVは実際の座標なので、VEXのxyzdistに合うように単位座標に切り替えるには、primuvConvertを使用してください。
primuvConvert(uv, mode, tol)
2DのUV座標を指定すると、別の座標系でその位置が計算されます。
tol
引数はオプションです。
指定可能な有効なモードはprimuvconvert VEX関数を参照してください。
primuConvert(u, mode, tol)
1DのU座標を指定すると、別の座標系でその位置が計算されます。
tol
引数はオプションです。
指定可能な有効なモードはprimuvconvert VEX関数を参照してください。