【Bifrost】Object型の基本的な扱い方について、part1

Object型の扱い方が何となく分かってきた(?)のでまとめようかなと思います。
このページでは主に「Object型の中身の確認の仕方」と「dataの取得、設定」についてまとめています。

https://help.autodesk.com/view/BIFROST/JPN/?guid=Bifrost_Common_build_a_graph_about_data_types_html
ちなみにオブジェクト型というのは公式ヘルプの↑こちらのページにも説明がある通り、
メッシュやパーティクル、ボリュームなどで使用される汎用的な型です。

図の通り、ポートにマウスカーソルを合わせると、Bifrost Graph Editorの下側にTypeが表示されます。


Object型の中身を確認する

object型の中身を確認する方法は二つあります。

一つは図のように、接続上で右クリック「Add Watchpoint」で、
Watchpointを追加することです。

あくまで個人的にですが、この方法は手軽ではあるのですが詳細な情報は確認できないのと、Object型だそれでも情報が多くてちょっと見にくいです(他の型で値を軽く確認する時には良いのですが)


もう一つは「dump_object」ノードを使用する方法です。

図のように対象のouputノードの直前ぐらいにdump_objectノードを差し込んで、FilenameとFolderを指定します。

FilenameとFolderを指定した段階で
(正しく処理が通っていれば)テキストファイルが出力されます。
図のケースだと↓こんな感じで出力されます。

{
    face_component: 
    {
        count: 6 (uint)
    }

    face_offset: 
    {
        data: [ ... ] 7 elements (array<uint>)
        default: 4294967295 (uint)
        depends_on: [  ] 0 elements (array<string>)
        interp: 0 (int)
        target: face_component (string)
    }

    face_vertex: 
    {
        data: [ ... ] 24 elements (array<uint>)
        default: 4294967295 (uint)
        depends_on: [  ] 0 elements (array<string>)
        interp: 0 (int)
        target: face_vertex_component (string)
    }

    face_vertex_component: 
    {
        count: 24 (uint)
    }

    face_vertex_normal: 
    {
        data: [ ... ] 6 elements (array<Math::float3>)
        default: 0 (float)
        depends_on: [  ] 0 elements (array<string>)
        interp: 0 (int)
        target: face_vertex_normal_index (string)
    }

    face_vertex_normal_index: 
    {
        depends_on: [  ] 0 elements (array<string>)
        indices: [ ... ] 24 elements (array<uint>)
        is_collection: 0 (bool)
        target: face_vertex_component (string)
    }

    point_component: 
    {
        count: 8 (uint)
    }

    point_position: 
    {
        data: [ ... ] 8 elements (array<Math::float3>)
        default: {0f, 0f, 0f} (Math::float3)
        depends_on: [  ] 0 elements (array<string>)
        interp: 0 (int)
        target: point_component (string)
    }

}

ちゃんと改行されているのでWatchpointより見やすいかなと思いますが、
この時点では、まだ全ての情報は表示されていなくて、

    face_offset: 
    {
        data: [ ... ] 7 elements (array<uint>)
        default: 4294967295 (uint)
        depends_on: [  ] 0 elements (array<string>)
        interp: 0 (int)
        target: face_component (string)
    }

例えば「face_offset」の「data」の中身が [ … ] となっており、
省略されているのが分かります。
また後ろに「7 elements」と書いてあるので、dataの中身は本来は7個要素がありそうです。

これは「dump_object」の「Sample Size」に適当な大きめの数値を入れることで
省略された要素を表示することができます。試しに100と入力してみます。
(デフォルトは0です。制限値なので本来の要素数より大きめの値で大丈夫です)

    face_offset: 
    {
        data: [ 0, 4, 8, 12, 16, 20, 24 ] 7 elements (array<uint>)
        default: 4294967295 (uint)
        depends_on: [  ] 0 elements (array<string>)
        interp: 0 (int)
        target: face_component (string)
    }

結果は↑こちらの通り、無事に省略された要素を表示することが出来ました。

今の所、自分が触った感じでは、これでObject型の情報は全て確認できそうです。


ちなみに、このdump_objectノードから出力されるテキストファイルは、
ノードが処理されるたびに自動で再出力されるので、あくまで確認時のみ接続する必要があるのと、
テキストファイルを確認する時は、開いている対象のファイルの更新を監視するタイプ(自動更新するタイプ)のテキストエディタを使った方が便利かなと思います(そこそこ高機能なテキストエディタなら割とついている機能かと思います)



dataの取得と設定

Object型の中身を確認できたので、今度はdataの値の取得→値の変更→設定をやってみたいと思います。

条件は前述の図と同じく「create_mesh_cube」ノードで、「point_position」のdataの値を取得して、適当な値を足し、それを設定してみます(頂点位置のオフセット)

基本的に以下の手順の通りやれば大丈夫かと思いますが
http://tn-log.xyz/dl/bifrost/about-object-type-part1/cube_offset_compound.txt
↑一応、完成品のコンパウンドも置いておきます(コピペして使ってください

まずはdataの値の取得からです。

dataの値の取得はおよそ図のような構成で、以下の手順を参考にしてください。

  1. get_geo_propertyノードを作成。
  2. get_geo_propertyノードの geometryポートに
    対象の Object型のポート(create_meshノードのcube_meshポート)を接続。
  3. get_geo_propertyノードの Propertyにプロパティ名「point_position」を入力。
  4. get_geo_propertyノードの typeに Valueノードを接続。
    この時 Valueノードの Typeは、取得したいdataの型と同じものを指定(今回は「array<Math::float3>」)

これらの設定は、先にWatchpointやdump_objectノードで情報を確認していないと設定できない項目になるかと思います。

これで「get_geo_property」ノードの「data」ポートに目的の値が取得できているはずです。
今度はこの値に変更結果が分かりやすいように、適当に値を足してみます

  1. addノードを作成。
  2. addノードに get_geo_propertyノードの dataポートを接続。
  3. valueノードを作成し、Typeを「Math::float3」、
    Valueに「0, 1, 0」などの適当な値を入力。
  4. valueノードの ouputポートを addノードに接続。

見た目では分かりませんが、これでpoint_positionのdata値に一律Y軸に1が足されました。
この値を元のObject型に戻したいと思います。

  1. set_geo_propertyノードを作成。
  2. set_geo_propertyノードの geometryポートへ、
    create_mesh_cubeノードの cube_meshポートを接続。
  3. set_geo_propertyノードの Propertyに「point_position」、
    Targetに「point_component」を設定。
  4. set_geo_propertyノードの dataポートへ、 addノードの ouputポートを接続。
  5. 最後に set_geo_propertyノードの out_geometryポートを
    出力先のポートへ接続(今回はdump_objectノードへ接続)

以上でpoint_positionのdataの値を取得→修正→設定が出来ました。
dump_objectや、実際にビューポートを確認すると、point_position(頂点位置)がオフセットされているのが確認できるかと思います。

またオフセット用のvalueノードをinputノードに繋いで外部に出してやれば
図のようにリアルタイムにオフセット値を変更できるので試してみてください。


ちなみにpoint_positionに関しては、get_point_positionノードやset_point_positionノードを使えば、より簡潔にすみますが、一応今回は他のプロパティでも応用が利くように、この方法を取りました(中身を開くと上記と同じことをしているのが分かるかと)


他のプロパティ(face_vertexやface_vertex_normal)のdataの値も、同様の方法で取得、設定が可能です。
ただ、この方法だとdata以外の値は編集できないので、そちらはpart2でまとめたいと思います。