[Omniverse] Omniverseを使った開発のとっかかり

  • by

GTC21秋が開催され、Omniverseにさらにたくさんの機能が追加される/追加される予定というのが発表されました。
自分自身まだまだGTC21に関する情報を追い切れてないですが、現状把握してる主に開発向けの情報についてまとめていこうと思います。

 Omniverseの立ち位置

Keynoteでも明言されていましたが、Omniverseはゲームエンジンではありません。
かといってDCCツールでもありません。
コラボレーションを前面に出している通り、他のツール類と連携して使用するプラットフォーム、となるでしょうか。
ここでいうコラボレーションは、ツール間同士の連携、使い手(人)同士の連携、の両方を指すことになりそうです。
「何ができるか」を見ると、現状は以下が確認しやすいです。

  • RTXを使ったリアルタイムレイトレーシングでのレンダリング (フォトリアルなレンダリング、建築向けのレンダリングなど)
  • 物理シミュレーションを行う仮想空間
  • AIの学習
  • Isaac Sim (ロボットのシミュレーション)

AIとIsaac Simは自分はまだ追いかけれてないため、どこまでできるかは把握できていません。
GTC21では、シミュレーションとAIを絡めて車の自動運転で使われてましたね。

リアルタイムレイトレーシングはフォトリアルなレンダリングを行うもので、確認したかぎりはオフラインレンダリングが不要になるほどの品質を保ってると思います。
個人的には、オフラインレンダリングの待ち時間をゼロにできる、はもう実現できていると見ています。
ただ、パストレーシングで大域照明を考える"RTX Ray-traced"のときはまだ30fpsも出ないです。
また、品質が気になるのなら少し時間をかけた(といってもGPUなので爆速ですが)GPUレイトレーシングである「Iray」も使用できます。
ですが、自分の場合は
リアルタイムレイトレーシングの"RTX Ray-traced"で満足できる仕上がりになるため、Irayを使うことはほぼありません。

で、これらの機能を持ったアプリケーション群がOmniverseである、とするのはまだ認識の違いがあります。

開発として見た場合のOmniverse

参考 : https://docs.omniverse.nvidia.com/prod_kit/prod_kit/overview.html

ここではOmniverseアプリの1つである「Omniverse Create」を例に、開発として見たときの構成を説明していきます。

「Omniverse Create」は、Omniverseを使った検証を行えるアプリです。
開発を度外視して見た場合は、外部から読み込んだ3Dモデルを並べてリアルタイムにレンダリングしたり、アニメーションの動画を作ったりすることができるアプリケーションです。

Omniverseアプリは「Omniverse Kit」というコア機能を使ったアプリケーションです。
Omniverseアプリは、用途に合わせて姿を変えることになります。
「Omniverse View」の場合は建築向けビジュアライザ、「Omniverse Machinima」はアニメーションの動画作成のツール、
「Omniverse Audio2Face」の場合はAIを使った音声認識と口をアニメーションさせる(リップシンク)機能が提供されています。
いずれもOmniverse Kitが使用されています。

Omniverseアプリはさらに、「Extension」という仕組みで機能を追加していくことができます。
実装はPythonのモジュールになります。
「Material Graph」というノードベースのマテリアルカスタマイズ(Shader相当)機能やパーティクルはExtensionで実装されています。
また、物理のPhysics機能もExtensionで実装されています。
Physicsはコア機能であるため「Core Extension」としての実装です。
このExtensionはデベロッパが自由に新しく作成して追加できます。
DCCツールで言うところの「AddOn」や「Plugin」と考えていただけるとよいかと思います。

ちょっと脱線ですが、Extensionはモジュール化の際にC/C++の動的ライブラリと連携を取る仕組みが非常によくできていると個人的に感じています。
Python自身が結構なんでもできるのでいろんな機能をPythonのみでそのまま実装できますが、
もし速度が必要な場合、C/C++の別ライブラリと連携を取りたい場合は動的ライブラリを呼び出す必要があります。
この場合でも、Extensionのモジュールとしての開発や配布がしやすくなっています。
Pythonの、というよりもOmniverseのモジュールとしての整合性が取れるような仕組みが用意されています。
ExtensionとしてAPIを追加で用意して、他のExtensionで呼び出すなどの連携も可能です。

また、Script Editorを使用してPythonスクリプトでプログラムを書いて実行することもできます。

これをモジュールとしてまとめて、再利用できるようにしたものがExtensionになります。

外部ツールとの連携手段

外部ツール(DCCツールやゲームエンジン)と連携するためには、USD(ファイルフォーマット)を経由することになります。

USD : https://graphics.pixar.com/usd/release/index.html

Omniverseとして同期をとって連携し合う機能として「Connector」があります。
Connectorを使った場合、Omniverseの環境にダイレクトに3Dモデルを送ったり同期させてOmniverse側とDCCツール側と同じように更新させることができるようになります。
Connectorがない場合でも、USDのルールに乗っ取ってさえいれば3DモデルをUSDファイルを出力し、それをOmniverse側にインポートすることができます。
現状、Max/MayaはConnectorが用意されていますが、BlenderのConnectorは用意されていません。
ただ、BlenderのUSDエクスポート/インポート機能を使ってOmniverse用のUSDファイルを扱うことができるようになっています。

なお、Omniverseで扱うファイルフォーマットはUSDで統一されています。
USDさえ扱うことができればOmniverseがない環境でもOmniverse向けのUSDファイルを出力可能です。

改めて、Omniverseは何を行う存在なのか ?

「Omniverse Create」のようなOmniverseアプリとして見た場合はアプリケーションですが、
Omniverse単体で見た場合はKitのコア部分を継承し、Extensionで拡張できるプラットフォームになります。
まだ概念的で分かりにくい表現ですね。
もう少し噛み砕いていきます。

Omniverseを展開しているNVIDIA社は、GPUをメインとしたハードウェアから始まり、
AIへの注力、そして2020年あたりからのOmniverse(Omniverseの前身は、実際はもっと前のHolodeckくらいまでさかのぼれそうです)と範囲を広げていってます。
それよりも前から、NVIDIA Developer( https://developer.nvidia.com/ )で開発者向けのSDKが多数公開されていました。
Irayもここで公開されていました(ただし、別途のライセンスを交わさないと使えない)。

このようなNVIDIA社のソフトウェア知識の集合体といえるSDKを、
Omniverseからアクセスできるようにぎゅっと集めてきているのが近年の動きのように感じます。
GTC21秋で、"CloudXR"もOmniverseに統合する発表がありました。
CloudXRはまだベータでアーリーアクセスですが、企業アカウントでないと試せない状態でした。
ですが、GTC21秋以降で公開されたOmniverse Create 2021.3.7でCloudXRによるARはすでに個人として使用できるのを確認済みです。

開発視点から見ると、Omniverseを通じてNVIDIA社がいままでSDKとして培っていた技術を触ることができる(無償で!)。
Extensionでいくらでも拡張していけるため、難しいところはOmniverseにお任せして、
自分の得意分野でアプリケーションを組み上げることができるようになるというのは、いろいろ可能性を広げることができそうではあります。

たとえば、BIM/CIM専用のツールでRTXのリアルタイムレイトレのレンダリングを使いたいとしましょう。
現在Omniverseアプリである「Omniverse View」は建築向けのビジュアライザではありますが、BIM/CIMの情報を与える機能があるわけではありません。

Omniverse Kitをベースにして、独自のBIM/CIMツールを構築するということができます。
これは「Omniverseアプリ」のくくりになります。

もし、BIM/CIM用の機能を「Omniverse View」や「Omniverse Create」で追加したら実装できそう、という規模でしたら
Extensionの開発をするとよいかもしれません。

BIM/CIMツールから出力したIFCファイルをOmniverseにインポートすることを考えてみます。
この場合は、OmniverseのConnectorとして同期をとって連携するか、
IFCからUSDに変換するエクスポータ/コンバータを書くという手段がとれそうです。
Extensionとしてファイルダイアログボックスを出して、IFCファイルをインポートする機能を用意してもいいかもしれません。

後々、緯度経度を指定した地図への建造物のマッピング機能をExtensionで用意する、というのもできると思います。
Extensionで用意した機能は、ベースとしているKitのバージョンさえそろえれば他のOmniverseアプリでも使用することが可能です。

ライセンス形態の確認がいりますが、
OmniverseのKitを使ったアプリやExtensionを作成して配布/販売することも可能です。
このあたりについては「Omniverseのライセンスについて」にまとめました。

このように、用途に合わせてOmniverseの機能をカスタマイズして使うということが最終的な醍醐味になるかと思っています。
将来的にメタバースをうたう場合はそれも今のOmniverseをカスタマイズした形態で実装できるというか、
サードパーティーがそれに取り掛かれるのかもしれませんね。

Omniverse Kitを継承したアプリの場合は、Extensionやスクリプト機能、USD、RTXレンダラなどなど、共有して利用/使いまわして使用できるため、
生産性の向上も期待できそうです。

内部的なデータ構造はすべてUSDで管理する形になるため、
USDさえ理解していればOmniverseに限らず構造の把握は容易になります。
このあたりもメリットになりそうです。

個人的な見解としては、Omniverseとは多数のライブラリ(SDK)にアクセスできる環境、と考えています。
そして、規模がものすごく広いです。
また、サポート分野もCG(アニメーションや建築含む)/シミュレーション/AI/ロボット、などなど最先端なうえに広いです。
そして、開発速度も早いため、現状で全体像を追いかけるのはかなり難しいと思っています。
集団で理解して情報共有しないと個人では無理だなぁと。
その意味もあり、とりあえず自分が知っている情報はまずは吐き出していこうかと。

Omniverseの開発はどこから情報を得ることができる ?

Omniverse関連の情報は、「Omniverse Launcher」からたどることができます。

"LEARN"を選択すると、チュートリアル動画やドキュメントを見ることができます(全部英語)。
「NVIDIA On-Demand」がチュートリアル動画です。
ただ、チュートリアル動画は開発情報は少なく、いずれも導入までの情報量に感じます。
また、ドキュメントは仕様書的な固い文章が多く、HowToの視点で書かれていないものも多いため、少し追いかけにくいかもしれません。

最近「Omniverse Developer Resource Center」というのができました。
https://developer.nvidia.com/nvidia-omniverse-developer-resource-center

開発情報はここで展開されると思われますが、まだ情報量が少ないです。

個人的に理解しておいてほしいこと

OmniverseはUSDがベースにあります。
Omniverseの開発においては、USDの理解(データ構造に読み書きできること)は必須です。
「Omniverse Developer Resource Center」のチュートリアルの先頭に
「Getting Started with USD for Collaborative 3D Workflows」というのがあります。
これは、DLI(NVIDIA Deep Learning Institute)という場で提供されている無料講座の1つですが、
これは基礎を押さえてますので
これはクリアしておいたほうがよさそうです。

この講座内容はOmniverseに関係ないUSDだけの知識ですが、この理解があると
Omniverse上のScript Editorでどんなスクリプトを書いていけばいいのか、
というが把握しやすくなるかと思います。

後、USDご本家のチュートリアルも参考になります。
https://graphics.pixar.com/usd/release/tut_usd_tutorials.html

GTCでもUSDや開発に特化したセッションもありましたので、そのあたりは見ておいたほうがいいかもしれません。
まだ全部見切れてませんが、GTC21秋ではConnector開発で分かりやすいセッションもありました。

Extensionやスクリプトの開発はどう勉強するのがよさそうか

OmniverseのExtensionやスクリプトはPythonで記載することになります。
大きく、以下の2つに分かれます。

  • USDを制御する部分
  • Omniverseと連携する部分

USDの制御については、PixarのUSDのドキュメントを見ながら確認していくのがよさそうです。

Omniverseと連携する部分の導入はドキュメントで確認できますが、実践的な部分はドキュメント化されていません。
自分の行った確実な勉強方法は既存Extensionの「解析」です。
Omniverse Createを起動し、メインメニューの「Window」-「Extensions」を選択します。
すると、Extensionsウィンドウが表示されます。
Searchで入力をクリアし、その右で「Example」を選択するとサンプルExtensionが見つかります。

これらのソースは、
"Omniverseインストールフォルダ\pkg\create-バージョン番号\kit\exts"内に「omni.example.hello」などがありますので
ここから見ることができます。

Extensionを構築するためのファイル構成については、Omniverse Createのメインメニューの「Help」-「Developers Manual」で開くページから探します。

でも、この部分は難易度が高いのと情報量も多いため、後々こちらでドキュメント展開していこうかと思ってます。

幸い、Extension自身はすべてソースを見ることができる状態ですので作法などは解析していくことが可能です。
ただ、一部はC/C++の動的ライブラリに渡しているためその部分は読むことができません。
ですが、既存のExtensionの挙動はだいたいどのように組めばいいかは追えます。

スクリプトの確認

スクリプトは、メインメニューの「Window」-「Script Editor」を選択してScript Editorを開き、
Snippetsでいくつかサンプルを確認できます。

球を配置するだけならこんな感じです。

from pxr import Usd, UsdGeom, UsdPhysics, UsdShade, Sdf, Gf, Tf

# Get stage.
stage = omni.usd.get_context().get_stage()

# Create sphere.
pathName = '/World/sphere'
sphereGeom = UsdGeom.Sphere.Define(stage, pathName)

# Set radius.
sphereGeom.CreateRadiusAttr(5.0)

# Set color.
sphereGeom.CreateDisplayColorAttr([(1.0, 0.0, 0.0)])

# Set position.
UsdGeom.XformCommonAPI(sphereGeom).SetTranslate((0.0, 5.0, 0.0))

勉強のしやすさの順番

Script Editorで試しながら動作確認 → Extensionとして少し規模のある機能を実装してみる → C/C++のConnectorにチャレンジ

が順当かと思われます。
USDのPythonのAPIはC/C++の実装と1対1に対応しているのを確認済みです。
そのため、Pythonでまずは試して手ごたえをつかむ、というのは
Connectorだけを作りたい場合でも無駄な知識にはならないと思います。

まだKitでのアプリ開発は試せてませんが、最終の本丸はKitを使ったアプリ開発になりそうです。

分からないことがあればどこに質問すればいい ?

どうしてもどうしても分からない、という場合には
公式のフォーラム( https://forums.developer.nvidia.com/c/omniverse/300 )か、Discordの「NVIDIA Omniverse」で質問するのがいいかと思います。
Discordの「NVIDIA Omniverse」についてはフォーラムの以下のスレッドにて。

https://forums.developer.nvidia.com/t/omniverse-discord-server-is-live/178422

両方英語ですが、DeepLやGoogle翻訳を駆使すれば問題なかったです。
ただ、可能な限り自身で調査して、にっちもさっちもいかない場合のみ質問、とした方がいいかと思います。

今回はここまでです。
開発関連についてどう説明するのがいいかなぁというのを試行錯誤しながらですが、
こちらで開発情報はまとめていこうと思います。
まとめやすさからブログというよりも、GitHubに出していく予定です。
とにかく量が多いですので、大きなヤマを切り崩していくくらいの勢いがいりそうではあります。