On this page

概要

ノードのサブネットワークの代わりに、Pythonスクリプトで定義されたジオメトリノード(SOP)のアセットを作成することができます ( File ▸ New Operator Type , Python Type をクリック, Network Type を“Geometry”に設定する)。 このサンプルは、その入力をコピーするPython SOPを定義し、Cd(ディフューズカラー)Pointアトリビュートを作成して、ある位置までの距離に基づいたカラーを各ポイントに割り当てます。

カラーフォールオフ

  1. $HFS/houdini/help/files/hom_cookbook/color_falloff.hipを開きます。

  2. Handlesツールをクリックします。

  3. ロケーションハンドルを動かして、 Falloff パラメータを変更し、カラーリングにどのように影響するかどうかを確認します。

  4. color_falloff1ノードを右クリックして、 Type Properties を選択し、アセットのType Properties Windowを開きます。

  • 通常のアセットと同様に、 Parameters タブに PositionFalloff のパラメータを作成しました。

  • 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は、その入力をコピーし、いろいろなカラーを入力サーフェスに割り当て、サーフェスにポリライン法線を均等に配分し、サーフェス上に“クイル(羽柄)”の外観を作成します。

  1. $HFS/houdini/help/files/hom_cookbook/surface_wires.hipを開きます。

  2. 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)

HOMクックブック