Amazon Web Services ブログ

glTF を 3D タイルに変換して AWS IoT TwinMaker で大規模モデルのストリーミングを実現する

 

はじめに

AWS IoT TwinMaker で 3D シーンをロードするときに、長い待ち時間が発生したことがありますか? 複雑な 3D モデルを表示するときに、レンダリングパフォーマンスの低下に悩まされているのではないでしょうか。シーン内で効率的にストリーミングできるように、モデルを 3D タイル形式に変換する方法があります。

このブログでは、Cesium ion を使用して 3D モデルまたは点群ファイルを 3D タイルセットに圧縮する方法と、変換された 3D タイルセットを使用して TwinMaker シーンを作成する方法を学びます。3D タイルセットを使用すると、元のモデルサイズを 50% から 90% 縮小し、AWS IoT TwinMaker 搭載ダッシュボードのレンダリングパフォーマンスを向上させることができます。

概要

このブログ記事では、いくつかのファイル拡張子とモデルプロセス標準を参照しています。まず、このブログで使用している用語について簡単に復習しておきましょう。

  • glTF – Graphics Language Transmission Format (glTF) は、3 次元のシーンやモデル用の標準ファイル形式です。glTF ファイルには、.gltf または .glb の 2 つのファイル拡張子のいずれかを使用します。
  • Cesium ionCesium ion は、Cesium が提供する 3D 地理空間データ用の堅牢でスケーラブルで安全なプラットフォームです。
  • Draco 圧縮Draco は、3D 幾何メッシュや点群を圧縮および解凍するためのオープンソースライブラリです。3D グラフィックの保存と転送を改善することを目的としています。Cesium は、この圧縮を利用してファイルサイズをさらに小さくすることを提案しています。
  • 3D タイルセット3D タイルは Open Geospatial Consortium (OGC) のコミュニティ標準です。3D タイルセットは、デスクトップ、ウェブ、モバイルの各アプリケーションで、大規模な異種 3D 地理空間コンテンツの共有、視覚化、融合、および操作に使用されます。

AWS IoT TwinMaker は glTF 形式と 3D タイル形式の 3D アセットをサポートしています。glTF はウェブブラウザに 3D コンテンツを表示するための標準的なフォーマットですが、今日では、非常に大きな (100 MB 以上の) モデルや非常に複雑な (10,000 ノード以上の) モデルはレンダリングに時間がかかりすぎる場合があります。glTF とそのバイナリ形式の glb は、3D タイル形式に変換することで、ロード時間の増大やフレームレートの低下を回避できます。3D タイルは、階層的詳細レベル (HLOD) を使用して、空間的に制限されたタイル内のコンテンツをストリーミングします。コンテンツをストリーミングすることで、大きなアセットでも 3D シーン内でのユーザーの向きに対応した小さなチャンクしかレンダリングされません。タイルは、異なるモデルのチャンクをバッチでレンダリングすることも、同じモデルのインスタンスを最適にレンダリングすることもできます。点群データは、完全なモデルとしてタイルにレンダリングすることも、空間的に境界のあるポイントとして個別にレンダリングすることもできます。3D Tiles 1.0 形式では、JSON 形式とバイナリ形式を使用してさまざまなタイルタイプを格納します。このような大規模 3D アセットの再編成により、IoT TwinMaker は、忠実度の高い 3D シーンを、より高いフレームレートで、より速くロードすることができます。デジタルツインのデータを効果的に視覚化するには、3D シーンの高速レンダリングが不可欠です。

Cesium ion は、3D 地理空間データを管理するための強力でフルマネージド型のプラットフォームです。Cesium ion の 3D タイリングパイプラインは、さまざまな形式 (gltf, .glb, .obj, .las, .laz, .fbx, .dae) の大型 3D モデルを圧縮して 3D タイルに変換し、あらゆるデバイスへのコンテンツのレンダリングとストリーミングを最適化します。Cesium ion は 3D モデルを保存し、モデルを 3D タイルに変換し、タイルセットを AWS 上の Amazon S3 バケットにエクスポートします。この記事では、大きなモデルを 3D タイルセットに変換し、Cesium ion を使用して AWS IoT TwinMaker シーンとしてインポートする手順を順を追って説明します。このプロセスでは、提供されたスクリプトを実行して、変換された 3D タイルセットを使用して IoT TwinMaker シーンを構築します。

前提条件

    1. 3D タイルへの変換には Cesium ion アカウントが必要です。 Cesium の Pricing ページで、Cesium に登録し、ビジネス要件に基づいて適切なサブスクリプションプランを選択できます。この記事では、5 GB 未満のモデルを取り扱うため、無料のコミュニティ利用枠にて手順を再現いただけます。
    2. 既存の AWS IoT TwinMaker ワークスペースが必要です。IoT TwinMaker ワークスペースの作成方法については、AWS IoT TwinMaker の開始方法を参照してください。
    3. このブログでは AWS Cloud9 を使用します。これを別の環境で実行する場合は、以下が必要です。
      • Node.js と NPMGit のインストール
      • スクリプトを実行するための 5 GB 以上のストレージ容量と 4 GB 以上の RAM を備えたデスクトップ

オープンソースモデル

この記事では、オープンソースのクッキー工場ウェアハウスモデルを使用します。後の手順の中でモデルをダウンロードします。モデルファイル CF_BUILDING.glb は 57MB です。

Cookie Factory Warehouse Model prior to conversion

クッキー工場ウェアハウスモデル

チュートリアル

ステップ 1: Cesium のアクセストークンを作成する

  1. Cesium アカウントにログインし、トークンページに移動します
  2. Create token をクリックします
  3. TwinMaker Token という名前を付けてください
  4. トグルボタンをクリックして、次の権限スコープを有効にしてください
    • assets:read
    • assets:write
    • assets:list
    • archives:read
    • archives:write
  5. Create をクリックしますCesium authentication のチュートリアルリファレンスもご参照ください。

Cesium ion access token generation: toggle on the permissions in this image

Cesium ion のアクセストークン生成: この画像のとおりに Scope を設定してください

ステップ 2: Cesium のサンプルスクリプトを準備する

: このブログのスクリプトは実稼働環境にはお勧めできません。Cesium ion はサードパーティのサービスであるため、使用許諾条件を明示的に確認する必要があります。Cesium のウェブサイトでこのスクリプトに適用される利用規約を確認することをお勧めします。

  1. AWS コンソールにログオンし、AWS IoT TwinMaker をサポートするリージョンを選択します
  2. AWS コンソールで AWS Cloud9 を起動します
  3. t2.medium と Amazon Linux 2 を選択して、新しい環境を作成します
  4. AWS Cloud9 のターミナルで次のコマンドを実行して、クッキー工場ウェアハウスモデルをダウンロードします
    curl -O https://iot-blog-files.s3.amazonaws.com/tileset/CF_BUILDING.glb
  5. ターミナルで次のコマンドを実行してaws-iot-twinmaker-samples リポジトリのクローンを作成します
    git clone https://github.com/aws-samples/aws-iot-twinmaker-samples.git
    
  6. scene_utils ライブラリのノードモジュールをインストールします
    cd aws-iot-twinmaker-samples/src/libs/scene_utils
    npm install
  7. AWS Cloud9 以外の開発マシンを使用している場合は、AWS 認証情報を作成していることを確認してください
      • 以下のポリシー JSON が、最小限必要な権限です
        {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "iottwinmaker:CreateScene",
                        "iottwinmaker:GetScene",
                        "iottwinmaker:UpdateScene",
                        "iottwinmaker:GetWorkspace"
                    ],
                    "Resource": "arn:aws:iottwinmaker:<AWS_REGION>:<ACCOUNT_ID>:workspace/*"
                },
                {
                    "Effect": "Allow",
                    "Action": [
                        "s3:PutObject",
                        "s3:GetObject",
                        "s3:GetObjectAttributes",
                        "s3:ListBucket"
                    ],
                    "Resource": "*"
                }
            ]
        }
  8. 次のコマンドを実行して、AWS リージョン環境変数を AWS IoT TwinMaker ワークスペースのリージョンに設定します。以下のコマンドは us-east-1 を使用していますが、環境によって異なる場合があります。
    export AWS_REGION=us-east-1

ステップ 3: 自動変換とシーン作成

  1. ステップ 1 で作成したトークンを使用して環境変数 CESIUM_ACCESS_TOKEN を設定します
    export CESIUM_ACCESS_TOKEN=[TOKEN]
  2. RunTwinMaker Workspace ID, Scene ID, CF_BUILDING.glb へのローカルパスを置き換えて、サンプルスクリプトを実行します
    npx ts-node samples/cesium_sample/sample.ts --workspaceId [WORKSPACE_ID] --sceneId [SCENE_NAME] --assetFilePath [PATH_TO_3D_MODEL] --dracoCompression

    : ここでは –dracoCompression という引数を使用してアセットのサイズを小さくします。このブログで取り上げていない点群ファイル (.las/.laz) を使用する場合は、この引数を使用しないでください。

    このスクリプトは、3D モデルを Cesium ion にアップロードし、タイリングパイプラインの完了を待ってから、3D タイルセットを [WORKSPACE_ID] の S3 バケットにエクスポートします。次に [SCENE_ID] を作成/編集し、3D タイルセットモデルに 1 つのノードを追加します。AWS Cloud9 にアップロードしたモデルは、ホームディレクトリ ~/environment/CF_BUILDING.glb にあります

    a. オプトインのプロンプトが表示されたら、「yes」と入力します
    b. あなたに代わって次のアクションが実行されるまでお待ちください。

    • 3DモデルをCesium ionにアップロードし、タイリングパイプラインが 3D タイルの変換を完了するのを待ちます
    • 変換されたタイルセットのアーカイブを作成し、タイルセットを .zip 形式でダウンロードします
    • 展開したコンテンツを IoT TwinMaker ワークスペースの S3 バケットにアップロードします
    • タイルセットを IoT TwinMaker シーンのノードとして追加します
  3. IoT TwinMaker ワークスペースでシーンを表示して、作成したシーンとモデルを確認してください

結果

これで、3D タイルを使用して 3D アセットを圧縮した新しい IoT TwinMaker シーンができました。 右側の Snap to floor チェックボックスをクリックすると、床の上にあるモデル全体が表示されます。

Example scene with the CF_BUILDING 3D tileset

CF_BUILDING 3D タイルセットを使用したシーンの例

ファイルサイズ圧縮

次に、Amazon S3 に移動し、AWS IoT Twinmaker ワークスペース S3 バケットを探します。S3 で CF_BUILDING 3D タイルセットのサイズを確認すると、サイズが 57 MB から 2.9 MB に減少しています。これは 95% の圧縮率です。

S3 folder size calculation for the cookie factory tileset

CF_BUILDING 3D タイルセットの S3 フォルダーサイズの計算

ファイルロード時間の比較

元の 57MB の glb ファイルをシーンに直接追加した場合、シーンビューアー上でのロードに約 32 秒かかりました。

IoT TwinMaker scene with the original CF_BUILDING.glb – S3 GetObject network call timing tab shows >20s of load time

元の CF_BUILDING.glb を使用した IoT TwinMaker シーン — S3 GetObject の読み取り時間を参照すると、20 秒を超えるロード時間が表示されています

これに対し、 3D タイルセットは 1 つ約 40 ミリ秒で読み込め、読み込み時間を 99.9% 短縮できます。

IoT TwinMaker scene with the cookie factory 3D tileset – accumulation of S3 GetObject network calls complete within 1 second as seen on the request timeline

CF_BUILDING 3D タイルセットを使用した IoT TwinMaker シーン — S3 GetObject の読み取り時間の合計は、リクエストのタイムラインに表示されているように 1 秒以内に完了します

注目すべき相違点

3D Tiles によって 3D アセットの読み込みとレンダリングの体験が改善することは明らかです。ただし、3D タイルセットはまだジオメトリックメタデータとセマンティックメタデータをサポートしていません。Cesium チームは現在これに取り組んでいます。また現在、元のファイルのメッシュ階層を、TwinMaker シーンにおけるサブモデル選択機能に使用することができません。下の画像は、元の CF_BUILDING.glb とそのメッシュ階層分類を含むシーンを、階層の分類なしの CF_BUILDING タイルセットのシーンと比較したものです。

IoT TwinMaker scene with the original CF_BUILDING.glb – mesh hierarchy list is supported

オリジナルの CF_BUILDING.glb を使用した IoT TwinMaker シーン – メッシュ階層リストがサポートされています

IoT TwinMaker scene with the CF_BUILDING 3D tileset – there is no mesh hierarchy

CF_BUILDING 3D タイルセットを使用した IoT TwinMaker シーン – メッシュ階層はありません

シーンの背景のコンテキストとなる大きなアセットには、3D タイル変換を使用することをお勧めします。クッキー工場の例では、ハイライトされたノードをさらに分解して注釈を付けたい場合は、それを別の glTF/GLB アセットとして抽出して、シーンに直接追加する必要があります。これは、一般的なフリーの 3D ツールである Blender などで行うことができます。

トラブルシューティング

  1. Cesium ion タイリングプロセスの問題: タイリング変換処理中にエラーが発生した場合、サンプルスクリプトから Cesium ion サイトのアセットページでアセットを確認するように通知されます。よくある問題の1つは、モデルがすでに draco で圧縮されており、Cesium ion のソースファイルとしてはサポートされていないことです。その他の問題については、Cesium Community Forum に投稿して、Cesium ion チームに直接お問い合わせください。
  2. ステップに時間がかかりすぎるためにスクリプトが終了する: Cesium ion からのアーカイブのタイリングとダウンロードのデフォルトの待ち時間は、各ステップで 5 分です。非常に大きなファイル (1GB 以上) の場合は、さらに時間がかかることがあります。サンプルスクリプトのドキュメントを読んで、Cesium がアセットの処理を完了した後に次のステップに進む方法を確認してください。

まとめ

このブログでは、標準の glTF/GLB ファイルを最適化された 3D タイルに変換する方法を学び、AWS IoT TwinMaker で読み込みが高速化されたシーンを作成しました。これはどんな大きなアセットにも適用できます。ユースケースに合わせてスクリプトを編集することもできます。Scene Util スクリプトをカスタマイズする方法については、ソースサンプルコードをご覧ください。

モデル変換に関するブログは他にもあり、今後も追加していく予定です。
AWS IoT TwinMaker で使用するために OBJ モデルを GLTF に変換および圧縮する方法

この記事は Harry Wandersman および Chris Azar によって書かれた Convert glTF to 3D Tiles for streaming of large models in AWS IoT TwinMaker の日本語訳です。この記事はソリューションアーキテクトの岡本晋太朗が翻訳しました。

著者について

Harry Wandersman  Harry は IoT TwinMaker フロントエンドサービスチームのソフトウェア開発エンジニアです。Harry は 2018 年から IoT 分野で働いており、IoT SiteWise および TwinMaker サービスの構築と開発を支援してきました。Harry は、 3D グラフィックスと没入型の仮想体験、そしてデジタルツインをサポートする IoT での応用に情熱を注いでいます。
Chris Azer は、お客様のデジタルツイン構想を支援するプリンシパルIoTスペシャリストソリューションアーキテクトです。Chris は 2017 年から AWS でさまざまな役割を担い、IoT ソリューションの設計においてパートナーや顧客をサポートしてきました。これには、国防総省、製造業、州および地方自治体、連邦および民間、スマートシティ、パートナーなどを網羅する幅広いユースケースが含まれます。産業オートメーションにおける彼のキャリアは 2004 年にさかのぼり、現在も企業の製造プロセスのスマート化の取り組みを支援し続けています。