[Omniverse] Action Graphを使う – その1

Omniverseは「ActionGraph」というものがあります。
今回はこれについて書いていくことにしました。

ドキュメントは以下が参考になります。

https://docs.omniverse.nvidia.com/app_create/prod_extensions/ext_omnigraph.html

チュートリアルは単純なConstraintの例です。
導入としてはうってつけかもしれません。

https://docs.omniverse.nvidia.com/app_create/prod_extensions/ext_omnigraph/tutorials/gentle_intro.html

今回は、まず「Action Graph」の導入について解説します。
Omniverse Create 2022.3.1を使用しました。

Action Graphとは ?

シーン上の形状(Prim)をグラフィカルなノードを使って制御する仕組みが「Action Graph」になります。
プログラムは必要ありません。

Pythonを使ったExtensionを使って制御するようなことも、ある程度はAction Graphで実装してしまうことができます。
また、Action GraphはUSDファイルに保持されます。
他環境にAction Graphごとシーンを持って行くのもUSDを渡すだけになります。

Extensionの考え方は以下のようになるでしょうか。

Extensionで機能を拡張できます。
これはUSD自身とは結び付いておらずOmniverse Create(Omniverse Kit)に対して汎用的に拡張を行う存在になります。

対して、Action GraphはUSDに埋め込まれます。
よりシーンに即した制御を行うことができます。

Action Graphで何ができる ?

  • 複数の形状を結び付ける動作(Constraint)
  • マウス/GamePad/キーボードイベントによるアクション
  • アニメーションの制御

他にもノードの組み合わせでさまざまな制御を行うことができます。
Physicsとも組み合わせて使用することもできます。

今回はまずConstraintを確認します。
これについてはチュートリアル( https://docs.omniverse.nvidia.com/app_create/prod_extensions/ext_omnigraph/tutorials/gentle_intro.html )と同じ流れになるため、
すでにこのチュートリアルを読まれている場合は既知の内容となります。

Omniverse Create 2022.3.1の場合はすでにAction Graphはデフォルトで起動しているため、
チュートリアルよりも作業工程は少なくなります。

Action Graphのサンプル

Samplesウィンドウの「VISUAL SCRIPTING」を選択すると、いくつかサンプルを確認できます。

これらは高度なサンプルになります。
どのようなことができるかはこれを見ると確認できます。

Action Graphの使い方

このサンプルは、Cubeが移動するとConeの形状がCubeの中心から(0, 0, 120)離れた位置でついてくる例です。

Action Graphの新規作成

メインメニューの「Window」-「Visual Scripting」-「Action Graph」を選択します。
「Action Graph」ウィンドウが表示されます。
「New Action Graph」アイコンをクリックすると新規にAction Graphが生成されます。

以下のようになりました。
Stageウィンドウの「OmniGraph」のPrimがAction Graphのルートになります。

既存のGraphを開く

既存のGraphを開く場合は、StageウィンドウでOmniGraphのPrimを選択して右クリックのメニューより「Open Graph」を選択します。

MeshのCubeとConeを作成

MeshのConeとCubeを作成します。
ここではCubeの動きにConeをついてこさせる(Constraint)ものとします。
このときの配置は適当でいいです。

CubeをGraphにドラッグ : Read Attributeの割り当て

Graph部にCubeのPrimをドラッグします。

次に「Read Attribute」を選択します。
これはCubeの情報を読み込むための操作になります。

この段階では、以下のようにノードが追加されています。

Propertyウィンドウの「Attribute Name」で「xformOp:translate」を選択します。

これは移動情報を読み込むための属性を割り当てました。

「xformOp」は各PrimのTransform(移動/回転/ズーム)の属性です。
「xformOp:translate」が移動、
「xformOp:rotateXYZ」が回転、
「xformOp:scale」がズーム、になります。

ConeをGraphにドラッグ : Write Attributeの割り当て

次に、ConeをGraphにドラッグします。
このとき「Write Attribute」にします。

同様に、Propertyウィンドウの「Attribute Name」で「xformOp:translate」を選択します。

Graph上の操作

ここで、Graph上での操作について解説しておきます。

参考 : https://docs.omniverse.nvidia.com/app_create/prod_extensions/ext_omnigraph/navigation.html

マウス中ボタンをドラッグすることで、パン操作を行います。

マウスホイールもしくは、[Alt]キーを押しながら左右に右ドラッグでズーム操作を行います。

Addノードを追加

NodesのSearchの入力フィールドで「Add」と入力し、Math-Addを探します。
これをGraphにドラッグしました。

CubeのRead Attributeを割り当てたノードのValueを、Addノードの「First Addend」につなげます。

Constant Point3dノードを追加

Nodesから「Constant Point3d」ノードを探し、Graphにドラッグしました。
これは、座標のXYZ要素を持つ定数のノードです。
3dなのでdouble型になります。

PropertyウィンドウでInputsのvalueを(0, 0, 120)としました。

Constant Point3dノードの値をAddノードにつなぐ

Constant Point3dノードの値をAddノードの「Second Addend」につなぎます。

これで、Addノードの出力(Sum)はCubeのxformOp:translate(位置)に(0, 0, 120)を加えた値が入ることになります。

ConeのノードにAddノードの出力をつなげる

Addノードの出力(Sum)をConeのWrite Attributeを与えたノードのValueにつなげます。

トリガー「On Tick」の指定

NodesからEvent-On Tickノードを探してGraphにドラッグします。
これは「更新イベントごとにアクションを起こすトリガー」みたいに思ってもらえればよさそうです。

このノードの出力(Tick)を、Coneのノードの「Exec In」につなげます。

以上で、Action Graphの編集が完了しました。

実行

Playボタンを押し、Cubeをマニピュレータで移動することでConeも離れた位置でついてくるのが確認できます。

このような感じで、まずはConstraintの動作をAction Graphで与えてみました。
次回以降で、Action Graphのこれ以外のアクションを確認していく予定です。