On this page |
概要 ¶
ノードのサブネットワークの代わりに、Pythonスクリプトで定義されたジオメトリノード(SOP)のアセットを作成することができます ( File ▸ New Operator Type , Python Type をクリック, Network Type を“Geometry”に設定する)。 このサンプルは、その入力をコピーするPython SOPを定義し、Cd(ディフューズカラー)Pointアトリビュートを作成して、ある位置までの距離に基づいたカラーを各ポイントに割り当てます。
カラーフォールオフ ¶
-
$HFS/houdini/help/files/hom_cookbook/color_falloff.hip
を開きます。 -
Handlesツールをクリックします。
-
ロケーションハンドルを動かして、 Falloff パラメータを変更し、カラーリングにどのように影響するかどうかを確認します。
-
color_falloff1
ノードを右クリックして、 Type Properties を選択し、アセットのType Properties Windowを開きます。
-
通常のアセットと同様に、 Parameters タブに Position と Falloff のパラメータを作成しました。
-
Handles タブで、
pos
パラメータに移動ハンドルをバインドしました。 -
Code タブには、ノードの論理を実装したPythonコードが含まれています。
# このPython SOPのインスタンスのクック時に、Houdiniは、hou.pwd()を # Python SOPインスタンスに設定します。このSOPのhou.Geometryオブジェクトにアクセスします。 # Python SOPの実装のhou.SopNode.geometryからコールしているため、 # ジオメトリに対する書き込みアクセス権を持つことになります。 geo = hou.pwd().geometry() # "Cd"Pointアトリビュート値を作成して、ホワイト(1, 1, 1)のデフォルト値を与え、 # 返されたhou.Attribオブジェクトを保存します。 cd = geo.addAttrib(hou.attribType.Point, "Cd", (1.0, 1.0, 1.0)) # pos parm tupleを評価して、それからhou.Vector3を作成するため、 # 後からベクトルの減算を行なうことができます。フォールオフ値も評価します。 pos = hou.Vector3(hou.parmTuple("pos").eval()) falloff = max(hou.ch("falloff"), 0.0001) for point in geo.points(): # このポイントから位置パラメータまでの距離を計算して、 # フォールオフ値で距離を割り、0から1までの間に制限します。 distance = (point.position() - pos).length() value = min(distance / falloff, 1.0) # カラーオブジェクトを作成して、正規化された距離に基づいて # 色相とカラー値を設定します。 color = hou.Color() color.setHSV((value * 256, 1.0, value)) # カラーオブジェクトからRGB値を抽出して、 # このポイントのCdアトリビュート値に保存します。 point.setAttribValue(cd, color.rgb())
カラークイル ¶
このPython SOPは、その入力をコピーし、いろいろなカラーを入力サーフェスに割り当て、サーフェスにポリライン法線を均等に配分し、サーフェス上に“クイル(羽柄)”の外観を作成します。
-
$HFS/houdini/help/files/hom_cookbook/surface_wires.hip
を開きます。 -
grid_object1
内のsurface_wires1
ノードを右クリックして、 Type Properties を選択し、アセットのType Properties Windowを開きます。
-
通常のアセットと同様に、 Parameters タブに分割数と長さのパラメータを作成しました。
-
Code タブには、ノードの論理を実装したPythonコードが含まれています。
# このPython SOPのインスタンスのクック時に、Houdiniは、hou.pwd()を # Python SOPインスタンスに設定します。このSOPのhou.Geometryオブジェクトにアクセスします。 # Python SOPの実装のhou.SopNode.geometryからコールしているため、 # ジオメトリに対する書き込みアクセス権を持つことになります。 geo = hou.pwd().geometry() # Cd (color)Pointアトリビュートを作成します。 color_attrib = geo.addAttrib(hou.attribType.Point, "Cd", (1.0, 1.0, 1.0)) # 一定の彩度と値を使用して、各ポイントに一意の色相値を割り当てます。 num_points = len(geo.iterPoints()) color = hou.Color() for point in geo.points(): fraction = float(point.number()) / num_points color.setHSV(((fraction * 255), 1, 1)) # アトリビュートは、RGB値を保存するため、RGBフォーマットのカラーを求めます。 point.setAttribValue(color_attrib, color.rgb()) # このSOPでは、1番目のプリミティブがサーフェスである必要があります。 surf = None if len(geo.iterPrims()) != 0: surf = geo.iterPrims()[0] if not isinstance(surf, hou.Surface): raise hou.Error("The first primitive must be a surface") # 均等に分配された位置でサーフェスを評価します。評価するポイント毎に、 # サーフェスから外側へ向いたラインを作成し、 # そのラインにサーフェスでカラーを与えます。 u_divisions = hou.evalParm("u_divisions") v_divisions = hou.evalParm("v_divisions") wire_length = hou.evalParm("wire_length") for u_index in range(u_divisions + 1): u = float(u_index) / u_divisions for v_index in range(v_divisions + 1): v = float(v_index) / v_divisions # サーフェスの位置を計算し、 # (2でスケールした)法線ベクトルを追加して、ラインの2つのポイントを定義します。 pos0 = surf.positionAt(u, v) pos1 = pos0 + surf.normalAt(u, v) * wire_length # ポリゴンのカラーを計算して作成します。これは # ラインのため開いています。 color = surf.attribValueAt(color_attrib, u, v) poly = geo.createPolygon() poly.setIsClosed(False) # ポイントを作成して、それらの位置とカラーを設定し、 # ポリゴンに追加します。 for pos in pos0, pos1: point = geo.createPoint() point.setPosition(pos) point.setAttribValue(color_attrib, color) poly.addVertex(point)