NVIDIA Omniverse の提供形態変更に伴う新しい利用方法(Kit App Template使用方法) 解説

## はじめに

デジタルツイン分野において、リアルタイム3Dグラフィックス共同開発プラットフォームとして知名度を上げている **NVIDIA Omniverse** (以降、Omniverse と記載) というものが存在します。(詳細は [弊社コラム: デジタルツインの概要と現状の課題](https://www.intellilink.co.jp/column/dx/2024/021400.aspx) にて解説しています)
Omniverse は、NVIDIA RTX GPU を使用したリアルタイムレンダリングによる高品質な3D表現や、物理シミュレーション、および Nucleus という中央サーバを介した複数アプリケーションとのリアルタイムコラボレーションに強みがあります。また、拡張機能(Extension)を自由に開発・利用できることによって、活用の領域を拡大することができます。(Extensionを利用した例は、[NVIDIA Omniverse(デジタルツインPF) と Cesium(3D地図PF) を連携させて出来ること (基本編)](https://qiita.com/Kosuke_S/items/b18a749fc448760c7aae) で記事にしています)

2025年2月現在、Omniverseは提供形態を大きく変えることを明確にしており、2025年10月には完全に置き換わる予定です。それに伴って利用方法も大きく変わるため、本記事では「Omniverse提供形態変更の内容」「新しい提供形態におけるOmniverseの利用方法」を解説します。

## Omniverse提供形態変更の内容

(注：本記事の主旨に沿うようにOmniverseアーキテクチャから一部コンポーネントやフローを省略しています)

### 旧提供形態

![スクリーンショット 2025-02-08 162105.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2692574/7550e39f-0735-0d7d-4637-07207423bbc0.png)

以前は、Omniverse LauncherというGUIアプリケーションから、NVIDIAが提供するサンプルアプリケーション(USD Composerなど)をインストールして使い始めることが基本でした。Google Chromeを利用するときと同じように、拡張機能(Extension)を追加していくことで機能を拡張したり、SDKを用いて自分でExtension開発して利用していました。SDKを用いて自分で1からアプリケーションを作ることも可能でしたが、NVIDIAの提供するサンプルアプリケーションをインストールしてから、そこに機能を拡張していくといった使い方が主流でした。

![スクリーンショット 2025-02-08 162123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2692574/4ec8a2c5-dc84-a9f2-2fd7-7cb7538c2150.png)

現在Omniverse Launcherを起動すると、上図のように、下部に "2025年10月1日に廃止される予定" という表示が出るようになっています。

### 新提供形態

![スクリーンショット 2025-02-08 162255.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2692574/029681d2-2aae-1c99-d774-714a11ddba4f.png)

新提供形態において、NVIDIAからサンプルアプリケーションは基本的に提供されなくなりました。代わりに同等の機能をもつアプリケーションをビルドするための「テンプレート」(**Kit App Template**)が用意されるようになりました。これを用いてアプリケーションをビルドしてから使い始めることになります。

オンプレ・クラウド分散配置を想定するようになり、NVIDIAのサポート注力領域がアプリケーションからSDKになったといえます。より開発者向けになったことで、開発者は Kit App Template を使って、ベースアプリケーションをビルドし、そこに必要なExtensionを追加・作成したりして独自のアプリケーションをビルド・パッケージングし、ユーザが目的に応じて各アプリケーションを利用していくといった使い方が基本になります。

## 新しい提供形態におけるOmniverseの利用方法(Kit App Template使用方法)

前述のとおり、新提供形態において **[Kit App Template](https://github.com/NVIDIA-Omniverse/kit-app-template)** を使用します。こちらを利用して、以下を順番に実現していくフローを解説していきます。

1. ベースアプリケーションをビルド&起動
2. 独自Extensionの作成・アプリケーションへの組み込み
3. 全ユーザがすぐに使えるようパッケージング

:::note info
本記事では Windows 環境を前提に解説していきます (Linux環境の場合は、コマンド実行時に `repo.bat` を `repo.sh` に置き換えて実行してください)
:::

### 1. ベースアプリケーションをビルド&起動

- 事前に [VSCode](https://code.visualstudio.com/) と [Git](https://git-scm.com/) をインストールしておきます
- 任意のディレクトリにProject用のフォルダを作成します
  - 今回は `testProject` フォルダを作成
  - Projectごとにフォルダを切って下記手順を実行していくことを推奨
- testProjectディレクトリに移動し、kit-app-templateをcloneします: **`git clone https://github.com/NVIDIA-Omniverse/kit-app-template.git`**
  - 本記事では標準のコマンドプロンプトを使用
    ```
    C:\Users\s-kos\Omniverse\NewSDK>cd testProject
    
    C:\Users\s-kos\Omniverse\NewSDK\testProject>git clone https://github.com/NVIDIA-Omniverse/kit-app-template.git
    ```

-  kit-app-templateディレクトリに移動して、**`.\repo.bat template new`** コマンドを実行します。以下項目が問われるので入力していきます
    - Do you accept the EULA (End User License Agreement)?：**Yes** を選択
    - Select with arrow keys what you want to create：**Application** を選択
    - Select with arrow keys your desired template：ベーステンプレートを選択。今回は **USD Composer** を選択 (標準で必要十分な機能を搭載しているテンプレートであるため)
    - Enter name of application .kit file：アプリケーションを管理するファイル名を入力 (自由：今回は `test.test_peoject` と入力)
    - Enter application_display_name：アプリケーション名(ウィンドウタイトルに出す名前)を入力 (自由：今回は `Test Application` と入力)
    - Enter version：アプリケーションのバージョンを入力(自由)
--
    - Enter name of extension：テンプレートに付属するExtensionを続けてセットアップしていきます。Extension名を入力します (自由)
    - Enter extension_display_name：Extensionの表示名を入力(自由)
    - Enter version：Extensionのバージョンを入力(自由)

    ```
    C:\Users\s-kos\Omniverse\NewSDK\testProject>cd kit-app-template
    
    C:\Users\s-kos\Omniverse\NewSDK\testProject\kit-app-template>.\repo.bat template new

    ~~~(略)~~~
    
    ? Do you accept the EULA (End User License Agreement)? Yes
    [ctrl+c to Exit]
    ? Select with arrow keys what you want to create: Application>
    ? Select with arrow keys your desired template: [omni_usd_composer]: USD Composer
    ? Enter name of application .kit file [name-spaced, lowercase, alphanumeric]: test.test_peoject
    ? Enter application_display_name: Test Application
    ? Enter version: 0.1.0
    
    The application template you have selected requires a setup extension.
    Setup Extension -> omni_usd_composer_setup
    Configuring extension template: Omni USD Composer Setup
    ? Enter name of extension [name-spaced, lowercase, alphanumeric]: test_project.my_usd_composer_setup_extension
    ? Enter extension_display_name: My USD Composer Setup Extension for Test Project
    ? Enter version: 0.1.0
    Extension 'test_project.my_usd_composer_setup_extension' created successfully in C:\Users\s-kos\Omniverse\NewSDK\testProject\kit-app-template\source\extensions\test_project.my_usd_composer_setup_extension
    Application 'test.test_peoject' created successfully in C:\Users\s-kos\Omniverse\NewSDK\testProject\kit-app-template\source\apps\test.test_peoject.kit
    ```

- **`.\repo.bat build`** コマンドを実行してビルドします
  ```
  C:\Users\s-kos\Omniverse\NewSDK\testProject\kit-app-template>.\repo.bat build

  ~~~(略)~~~
  BUILD (RELEASE) SUCCEEDED (Took 38.63 seconds)
  ```

- **`.\repo.bat launch`** コマンドを実行してアプリケーションを起動します
  - 従来の Extension Manager や Command Debug 機能などが使えるように `-d` オプションを付加することを推奨
  - `Select with arrow keys which App you would like to launch` と聞かれるので、上記 `Enter name of application .kit file` で入力した名前のものを選択する(基本デフォルトで選択されているもので問題ないです)
  ```
    C:\Users\s-kos\Omniverse\NewSDK\testProject\kit-app-template>.\repo.bat launch -d
    [ctrl+c to Exit]
    ? Select with arrow keys which App you would like to launch: test.test_peoject.kit
    launching test.test_peoject.kit!
  ```

しばらく待って、以下のようにアプリケーションが起動したら完了です。従来のOmniverse Launcherからアプリケーションインストールまでの工程がここまでで完了したことになります。
![スクリーンショット 2025-02-11 161532.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2692574/3786ee5e-5371-bbff-f2bc-cf0c9a2a95ce.png)

### 2. 独自Extensionの作成・アプリケーションへの組み込み

次に、独自Extensionを作成し、1.で起動したアプリケーションに組み込む方法について解説します。

- **`.\repo.bat template new`** コマンドを実行して新規Extensionを作成します。以下項目が問われるので入力していきます
  -  Select with arrow keys what you want to create： **Extension** を選択
  -  Select with arrow keys your desired template：**Basic Python Extension** を選択
  -  Enter name of extension：Extension名を入力(自由)
  -  Enter extension_display_name：Extension表示名を入力(自由)
  -  Enter version：Extensionのバージョンを入力(自由)

    ```
    C:\Users\s-kos\Omniverse\NewSDK\testProject\kit-app-template>.\repo.bat template new
    [ctrl+c to Exit]
    ? Select with arrow keys what you want to create: Extension>
    ? Select with arrow keys your desired template: [basic_python_extension]: Basic Python Extension
    ? Enter name of extension [name-spaced, lowercase, alphanumeric]: test.test_extension
    ? Enter extension_display_name: Test Extension
    ? Enter version: 0.1.0
    Extension 'test.test_extension' created successfully in C:\Users\s-kos\Omniverse\NewSDK\testProject\kit-app-template\source\extensions\test.test_extension
    ```

以下のように、VSCodeなどで確認すると、`kit-app-template/source/extensions` 内に先ほど作成したExtension実行ファイル群が格納されています。

<!--
Extensionの構造についてOmniverse提供形態に伴う変更はないため、既に作成済みのExtensionがあれば、このディレクトリに配置して後述の手順でアプリケーションに組み込み、動作確認すると良いでしょう。
-->
![スクリーンショット 2025-02-11 163255.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2692574/f9f29807-e5ce-eb32-89c6-eabf263888f1.png)

- ここでは、`kit-app-template/source/extensions/<作成したExtension名のフォルダ>/` 内の `extension.py` を編集して、「Hello, Digital Twin!」メッセージが表示されるようにしてみます
  - 本記事ではExtension開発の詳細は割愛します。初めての方は、[Extensions in-depth - Ommiverse Docs ](https://docs.omniverse.nvidia.com/kit/docs/kit-manual/latest/guide/extensions_advanced.html) などを参照ください

    ```
    import omni.ext
    import omni.ui as ui
    
    class MyExtension(omni.ext.IExt):
    
        def on_startup(self, _ext_id):
            """Extensionが起動される度に実行されます"""
            print("[test.test_extension] Extension startup")
    
            # ウィンドウを生成して、「Hello, Digital Twin!」と表示する
            self._window = ui.Window("Test Extension", width=600, height=300)
            with self._window.frame:
                with ui.VStack():
                    ui.Label("Hello, Digital Twin!", style={"font_size": 40.0})
    
        def on_shutdown(self):
            """Extensionが終了される度に実行されます(クリーンアップ処理など実装します)"""
            print("[test.test_extension] Extension shutdown")
    
            # 生成されたウィンドウを削除する
            if self._window:
                self._window.destroy()
                self._window = None
    ```
![スクリーンショット 2025-02-11 164854.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2692574/77b24530-57dd-0108-6b4f-e8b84c857257.png)

- 作成したExtensionをアプリケーションに組み込みます。`kit-app-template/source/apps` 内の、アプリケーション作成時に名前をつけた.kitファイルを開きます。
    > Enter name of application .kit file：アプリケーションを管理するファイル名を入力 (自由：今回は `test.test_peoject` と入力)

- `[dependencies]` を探し、`"<Extension名>" = {}` を追記して保存します
  ```
  [dependencies]
  "test.test_extension" = {}
  ```
![スクリーンショット 2025-02-11 165725.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2692574/5bbfdab1-1302-c050-4e59-7f3e80f55f4f.png)

- **`.\repo.bat build`** コマンドを実行してビルドします
  ```
  C:\Users\s-kos\Omniverse\NewSDK\testProject\kit-app-template>.\repo.bat build

  ~~~(略)~~~
  BUILD (RELEASE) SUCCEEDED (Took 5.98 seconds)
  ```

- **`.\repo.bat launch`** コマンドを実行してアプリケーションを起動します
  ```
  C:\Users\s-kos\Omniverse\NewSDK\testProject\kit-app-template>.\repo.bat launch -d
  [ctrl+c to Exit]
  ? Select with arrow keys which App you would like to launch: test.test_peoject.kit
  launching test.test_peoject.kit!
  ```

アプリケーション起動と同時に、「Hello, Digital Twin!」メッセージが表示されるようになりました。以上で、Extensionの作成・アプリケーションへの組み込みが完了です。
![スクリーンショット 2025-02-11 170436.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2692574/5e555690-4360-71b0-07f0-799cbf33ab76.png)


### 3. パッケージング

最後に、ここまでで作成したExtension+アプリケーションを全ユーザが実行できるようにパッケージングしてみます。

- **`.\repo.bat package`** コマンドを実行する
  - 特に初回は、パッケージングに必要なライブラリのダウンロード処理などが入るため時間がかかります
  ```
  C:\Users\s-kos\Omniverse\NewSDK\testProject\kit-app-template>.\repo.bat package
  Packaging app (fat package)...
  ~~~(略)~~~
  Total of 347.56 seconds
  Output size: 2.466 GiB (Compressed to 48.1% of input size)
  Package Created: C:/Users/s-kos/Omniverse/NewSDK/testProject/kit-app-template/_build/packages\kit-app-template-fat@106.5+main.0.5e2cadc6.local.windows-x86_64.release.zip (Took 547.03 seconds)
  ```

`kit-app-template/_build/packages` 内にzip形式でパッケージングされます。
![スクリーンショット 2025-02-11 172020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2692574/06c2b842-18b4-ff01-502f-c3f4d53c3fc4.png)

zipを展開し、`<アプリケーション作成時に名前をつけた.kitファイル名>.bat` ファイルをダブルクリックすることで、アプリケーションが起動します。ユーザに配布する際はこのようにパッケージングしてから行うとよいでしょう。
![スクリーンショット 2025-02-11 17283911.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2692574/7df088ef-8623-411d-b32f-b9adcb75b09c.png)


## まとめ

本記事では、Omniverse提供形態変更の内容、そして新しい提供形態におけるOmniverseの利用方法を具体的に解説しました。より開発者向けとなったことで、以前と比べて導入のハードルが高く感じてしまうかもしれませんが、GUIからCUIベースになっただけで導入自体はスムーズに進みます。特に、Kit(SDK)のバージョンアップに応じて迅速に独自アプリケーションを対応させることができるというメリットがあります。
一方で、ベーステンプレートをもとにビルドされるアプリケーションは、Omniverse Launcherからインストールできたものより同梱されているExtensionが少ないため、場合によっては必要なExtensionを調査してビルドし直すなどの手間が発生しているのが現状です。
Omniverseは過渡期であり、今回の提供形態の変更は大きめの環境変化と言えます。今後の動向も継続的にチェックしていこうと思います。