Houdini 20.5 キャラクタ KineFX

数値演算用のグラフ

On this page
この機能はまだ開発中です。現在の機能は未完成で変更される予定であり、 ドキュメントが手薄だったり、なかったりします。 これを使用するときは、そのことに我慢してください。

このページでは、2つの値を加算したり、複数の結果を取得したり、ジオメトリからの情報を取得するといった数値演算のためにAPEXグラフを作成して実行する方法について、段階を追って説明します。このページの例では、以下の基本的な構造を見ていきます:

2つの値を加算する

この例では、2つの値を加算するグラフの作成方法を紹介しています。データをグラフに入力し、そのグラフの出力を表示する基本的なワークフローについて説明します。

グラフロジックを作成する

2つの値(ab)を加算するロジックを作成します。

グラフを手動で作成する

  1. ジオメトリレベルで、ネットワークエディタにAPEX Edit Graph SOPを配置します。

  2. APEX Edit Graph SOPを選択したまま、APEXネットワークビューを開きます。APEXネットワークビューでは、APEX Edit Graph SOPにグラフを直接書き込むことができます。

  3. APEXネットワークビュー内で、簡単な数値演算を実行するグラフを作成します:

    • グラフ入力ノードと出力ノードを追加します:

      • 入力パラメータを受け取るノードを追加します。TABを押してタブメニューを開き、 Input 選択します。すると __parms__ グラフ入力ノードがグラフに追加されます。

      • タブメニューで Output を選択し、グラフ出力ノードを追加します。

    • 単純な加算演算を実行するAdd<Float>ノードを追加します。

    • それらのノードを以下のように接続します。addノードの b可変長ポートなので、複数の接続が可能であり、 b<x> という名前のサブポートが作成されます:

      APEXネットワークビューでノードを接続

この時点では、グラフは、ジオメトリとして表現されたロジックの一部(ピース)でしかありません。グラフの入力は定義されておらず、グラフは評価も計算もされていないため、何の出力も結果もありません。

APEX Scriptを使用してグラフを作成する

  1. ジオメトリレベルで、ネットワークエディタにAPEX Script SOPを配置します。

  2. 以下のスニペットを、APEX Script SOPの Snippet パラメータに追加します:

    a = BindInput(Float())
    b = BindInput(Float())
    
    result = a + b
    
    BindOutput(result)
    
  3. グラフとして表現されたAPEX Scriptスニペットを確認するには、APEXネットワークビューを開きます。ペインの上部で、 New Tabアイコンをクリックして、 New Pane Tab Type ▸ Animation ▸ APEX Network View を選択します。

  4. APEX Script SOPの Visualizer セクションで、 ShowComponent Script に設定します。

    APEX Scriptはグラフ入力の後にNullノードを挿入して、入力タイプが明確に定義されるようにします。値は、未変更のままNullノードを通過します:

    グラフとして兵家されたAPEX Scriptコード

入力を定義する

加算演算の入力のabを定義します。数値入力は辞書形式で格納する必要があるため、基本的に辞書が入力データのコンテナとなります。辞書にはキーと値のペアを格納し、この場合だとabがキーです。Attribute Adjust Dictionary SOPを使用して、入力パラメータの辞書を作成します:

  1. Attribute Adjust Dictionary SOPの Set Values セクションで、 Number of Entries の横にあるをクリックし、2個のエントリを作成します。

  2. 1つ目のエントリを以下のように設定します:

    • Key : a

    • Type : Float (float値を加算します)

    • Value : 値をaに割り当てます。

  3. 2つ目のエントリを以下のように設定します:

    • Key : b

    • Type : Float

    • Value : 値をbに割り当てます。

デフォルトでは、 Attribute NameparmsAttribute ClassDetail に設定されているため、parmsという名前のDetailアトリビュートが作成されます。この新しいparmsアトリビュートは、Geometry Spreadsheetで確認することができます:

  1. ペインの上部で、 New Tabアイコンをクリックして、 New Pane Tab Type ▸ Inspectors ▸ Geometry Spreadsheet を選択します。

  2. 上部のツールバーから Detailを選択します。

グラフロジックを評価する

これでグラフロジックとグラフ入力が定義されました。グラフを呼び出す(評価する)には、APEX Invoke Graph SOPを使用します。

  1. 追加したノードを接続します:

    • APEX Invoke Graph SOPの1番目の入力はAPEXグラフを受け取ります。ネットワークエディタで、(APEXグラフを含んでいる)APEX Script SOPの2番目の出力をAPEX Invoke Graph SOPの1番目の入力に接続します。グラフロジックを手動で作成している場合、APEX Script SOPをAPEX Edit Graph SOPに置き換えます。

    • APEX Invoke Graph SOPの2番目の入力は、入力として使用したいデータを受け取ります。辞書形式の数値でも、通常のジオメトリでも構いません。Attribute Adjust Dictionary SOPをAPEX Invoke Graph SOPの2番目の入力に接続します。

    グラフを使用して2つの数値を加算するネットワーク
  2. APEX Invoke Graph SOPで、入力を指定します:

    • Input Bindings の横にあるをクリックして、入力を追加します。

    • デフォルトで、 Dictionary To Bind はオンで、parmsに設定されています。Attribute Adjust Dictionary SOPを使用してparmsという名前の入力を辞書として定義しているので、これは既に望ましい設定になっています。

  3. APEX Invoke Graph SOPで、取得する出力を指定します:

    ここでは(ジオメトリではなく)数値を取得したいので、 Output Dictionary Bindings の横にあるをクリックして、取得したい出力を指定します。出力は辞書形式で格納されます。

    • Apex Outputs Group は、グラフ内の出力ノードの名前です。ここでは、outputです。

    • Output Attrib には、出力される辞書の名前(output_parms)を設定します。

    この新しいoutput_parms辞書に計算結果が格納されます。Geometry Spreadsheetの上部のツールバーから Detailを選択することで、これを確認することができます。output_parms辞書では、result(グラフのoutputノードのポート名)キーの値にa + bが設定されています。

    APEX Invoke Graph SOPはAPEXグラフのロジックを評価し、その結果を返します。Attribute Adjust Dictionary SOPでabの値を変更すると、そのAPEX Invoke Graph SOPで計算された出力の辞書が新しい合計値に更新されます。

2つの結果を取得する

これから、前の例のグラフロジックを使用し、元の結果に対して別の演算を実行して2つの結果を取得したいと思います。

グラフロジックを作成する

グラフを手動で作成する

  1. APEXネットワークビューで、以下のグラフを作成します。divideノードとoutputノードのサブポート名は変更しています。divideノードの b ポートは可変長入力です:

    2つの結果を出力するグラフロジック
  2. divideノードで値を設定します:

    • divideノードを選択し、Pを押してノードパラメータウィンドウを表示します。

    • divideab で除算します。ノードパラメータウィンドウで、 a の値を1.0などに設定します。denominatorは前の加算演算からの値です。

APEX Scriptを使用してグラフを作成する

  1. 以下のスニペットを、APEX Script SOPの Snippet パラメータに追加します:

    a = BindInput(Float())
    b = BindInput(Float())
    
    add_result = a + b
    
    add_divide_result = 1.0/add_result
    
    # 複数の結果を出力します
    BindOutput(add_result, add_divide_result)
    
  2. APEXネットワークビューで、グラフとしてAPEX Scriptスニペットを表示します(赤のノードが新たに追加したノードです)。これで、outputノードの2つのポートが接続されました:

    2つの結果を出力するグラフロジック

グラフロジックを評価する

グラフ入力は変わっていないため、Attribute Adjust Dictionary SOPでは何も変更する必要はありません。

グラフ出力に関しては、APEX Invoke Graph SOPは前と同じようにグラフのoutputノードから取得します。違いは、1つの結果( add_result の2つの入力の合計値)だけでなく、2つ目の結果( add_divide_result の除算結果)も取得することです。SOPで、両方の結果が1つの辞書に格納されます。

Geometry Spreadsheetで、グラフのoutputノードから取得された値を確認します:

  1. ネットワークエディタでAPEX Invoke Graph SOPを選択します。

  2. Geometry Spreadsheetで、上部のツールバーから Detailを選択します。

  3. outputノードから、 add_resultadd_divide_result の2つの値が取得されています。

Note

出力される辞書には、APEX Invoke Graph SOPの Apex Outputs Group パラメータで指定したグラフ出力ノードの すべて の結果が含まれます。

部分評価

この例では、 部分評価 という考え方を紹介します。要求された出力のみを取得します。そしてその出力のみを計算して、残りのグラフロジックは無視します。

グラフロジックを作成する

前の例の加算と除算のグラフから開始し、もう1つ出力ノードを追加し、元の出力ノードと違う名前を付けます:

  1. 以下のスニペットを、APEX Script SOPの Snippet パラメータに追加します:

    a = BindInput(Float())
    b = BindInput(Float())
    
    add_result = a + b
    
    add_divide_result = 1.0/add_result
    
    multiply_result = 2.0 * add_divide_result
    
    BindOutput(add_result, add_divide_result, __name='output')
    
    BindOutput(multiply_result, __name='output2')
    

    __nameは、ノードに名前を付けるのに使用する特殊関数の引数です。

  2. APEXネットワークビューで、グラフとしてAPEX Scriptスニペットを表示します(赤のノードが新たに追加したノードです):

    グラフロジックの部分評価

グラフロジックを評価する

取得された結果を確認します:

  1. ネットワークエディタでAPEX Invoke Graph SOPを選択します。

  2. Geometry Spreadsheetで、上部のツールバーから Detailを選択します。

グラフ内に別の出力ノードがあっても、outputノードからの値のみが取得されます。ここでは部分評価が起きています。グラフロジックを介してoutputノードへのパスのみが実行されます。output2の値を計算するロジックは無視されます。

新しい出力ノードのoutput2からも値を取得するには:

  1. APEX Invoke Graph SOPで、 Output Dictionary Bindings の横にあるをクリックし、取得する出力ノードをもう1つ追加します。

  2. 新しい Output Dictionary Bindings エントリで:

    • Apex Outputs Groupoutput2に設定します。ドロップダウンボックスからoutput2を選択することができます。

    • Output Attrib には、出力される辞書の名前(output2_parms)を設定します。

  3. 取得された値を確認します:

    1. ネットワークエディタでAPEX Invoke Graph SOPを選択します。

    2. Geometry Spreadsheetで、上部のツールバーから Detailを選択します。

    2個の出力ノードのoutputoutput2からの値が計算され、取得され、それらの結果がoutput_parmsoutput2_parmsという2つの辞書に格納されています。

数値演算に基づいてジオメトリを変更する

この例では、加算演算の結果に基づいてボックスジオメトリのサイズを変更する方法を説明します。

グラフロジックを作成する

  1. 以下のスニペットを、APEX Script SOPの Snippet パラメータに追加します:

    a = BindInput(Float())
    b = BindInput(Float())
    
    result = a + b
    
    # add_resultはボックスのサイズに影響を与えます
    geo = apex.sop.box(scale=result)
    
    BindOutput(result, geo)
    
  2. APEXネットワークビューで、グラフとしてAPEX Scriptスニペットを表示します。加算演算の合計値はボックスのサイズに影響します:

    ボックスジオメトリのサイズに影響する数値演算

グラフロジックを評価する

今回は、数値ではなくジオメトリを取得します。ボックスを表示するには、outputノードでボックスジオメトリを取得する必要があります:

  1. APEX Invoke Graph SOPで、 Bind Output Geometry をオンにし、その値をoutput:geo (<name_of_output_node>:<geometry_on_output_node>)に設定します。

  2. APEX Invoke Graph SOPのDisplayフラグをオンにし、ビューポートにボックスを表示します。

  3. Attribute Adjust Dictionary SOPを選択し、パラメータエディタにグラフ入力パラメータのabを表示します。ただし、APEX Invoke Graph SOPのDisplayフラグはオンのままにします。Attribute Adjust Dictionary SOPでabの値を調整すると、ビューポートでボックスのサイズが変わります。

    入力パラメータを調整し、ジオメトリを表示するネットワーク

ジオメトリから情報を取得して使用する

ジオメトリから情報を取得し、その情報を使用して追加で演算を実行することができます。この例では、ボックスのコーナーに球を配置します。入力パラメータを変更すると、ボックスと球体の両方のサイズが変化します。

グラフロジックを作成する

前の例からボックスジオメトリのグラフを追加します。

  1. 以下のスニペットを、APEX Script SOPの Snippet パラメータに追加します:

    a = BindInput(Float())
    b = BindInput(Float())
    
    # add_resultはボックスのサイズに影響を与えます
    add_result = a + b
    box_geo = apex.sop.box(scale=add_result)
    
    # box_pointをボックス上のポイント0(コーナーの1つ)の
    # 位置(アトリビュート'P')に設定します
    box_point = box_geo.pointAttribValue(0, 'P', valuetype=Vector3)
    
    # multiply_resultは球のサイズに影響を与えます
    multiply_result = 0.5 * add_result
    
    # 球のトランスフォーム(t)はbox_pointに設定されているため
    # 球の中心はbox_pointになります
    sphere_geo = apex.sop.sphere(t=box_point, scale=multiply_result)
    
    # ボックスと球のジオメトリを結合します
    box_sphere_geo = apex.geo.mergePacked(box_geo, sphere_geo)
    
    BindOutput(add_result, box_geo, box_point, box_sphere_geo)
    
  2. APEXネットワークビューで、グラフとしてAPEX Scriptスニペットを表示します(赤のノードが新たに追加したノードです)。球はボックスジオメトリ内の特定のコーナーに配置され、球とボックスは1ジオメトリとして結合さ、出力されます:

    ボックスジオメトリから情報を取得し、追加の演算を実行

グラフロジックを評価する

ボックスと球を一緒に表示するには、outputノードからボックスと球が結合されたジオメトリを取得する必要があります:

  1. APEX Invoke Graph SOPで、 Bind Output Geometry をオンにし、その値をoutput:box_sphere_geo(<name_of_output_node>:<merged_geometry_on_output_node>)に設定します。

  2. APEX Invoke Graph SOPのDisplayフラグをオンにし、ビューポートにボックスと球を表示します。

  3. Attribute Adjust Dictionary SOPを選択し、パラメータエディタにグラフ入力パラメータのabを表示します。ただし、APEX Invoke Graph SOPのDisplayフラグはオンのままにします。Attribute Adjust Dictionary SOPでabの値を調整すると、ビューポートでボックスと球のサイズが変わります。

    ボックスのポイント上に留まる球

How-to

To...Do this

グラフから数値を取得する

APEX Invoke Graph SOPで、取得する値を指定します:

  • Output Dictionary Bindings の横にあるをクリックします。

  • Apex Outputs Group をグラフ出力ノードの名前に設定します。

  • Output Attrib には、出力される辞書の名前(output_parms)を設定します。

上部のツールバーから Detailを選択すると、出力される辞書をGeometry Spreadsheetで確認することができます。

2つの値を加算する例を参照してください。

グラフからジオメトリを表示する

  1. APEX Invoke Graph SOPで、 Bind Output Geometry をオンにし、その値を(<name_of_graph_output_node>:<geometry_on_output_node>)に設定します(例えばoutput:geo)。

  2. APEX Invoke Graph SOPのDisplayフラグをオンにします。ビューポートにジオメトリが表示されます。

ジオメトリを変更する例を参照してください。

KineFX

概要

キャラクタ要素の準備

APEXグラフを使用したリギング

APEXスクリプトを使用したリググラフの構築

リグコンポーネントを使用したリギング

ビューポート内でアニメーションを付ける

SOPベースのアニメーション

変形

アニメーションのリターゲット

H20以前

ペイン

別表