Azure Remote Rendering用のアセットを作る
mixpaceと連携させてみた
先日public previewで公開されたAzure Remote Rendering(以下、ARR)について、mixpaceでもARR用のアセットを作るコンバータのプロトタイプを作ってみました。
mixpace にモデル(CAD/BIM/CG)を突っ込むと勝手にAzure Remote Renderingに入るようになったw #HoloLens #さすやま pic.twitter.com/EsppFHlxp1
— 中村 薫(Kaoru Nakamura)@HoloLab Inc. (@kaorun55) April 11, 2020
mixpaceはCADやBIMといった3DデータをコンバートしてHoloLens 2やiPad上のクライアントアプリで閲覧できるサービスなのですが、コンバート後のファイルフォーマットとしてGLBを採用しています。ARRではアセットを作るためのデータソースとしてFBX、glTF、GLBをサポートしているのでmixpaceにとっては都合が良いです。
ARR用のアセットを作るための方法として、サンプルプロジェクトのリポジトリにてPowerShellスクリプトが公開されています。中身をみると分かるのですが、ARR用のアセットへのコンバートはREST APIを叩くだけで実行できます。
今回はARR用アセットの作り方を少し紹介したいと思います。
ARR用アセットへのコンバート
コンバートの手順はざっくり以下の通りです。
- Blob Storageを用意する
- Blob Storageにソースファイルをアップロードする
- コンバートジョブをトリガーするためREST APIをたたく
- コンバートジョブの進捗を確認するためREST APIをたたく
Blob Storageを用意する
Azure Storage Account
を準備すればOKです。StorageV2でもBlob Storage onlyでもどちらでも大丈夫です。
Blob Storageにソースファイルをアップロードする
方法は問いません。Storage Explorerからアップロードしてもいいし、REST APIからアップロードしてもOKです。
ドキュメントをみると、入力となるソースファイルを格納するコンテナと出力となるARR用アセットを格納するコンテナを用意するように書いてありますが、同じコンテナにしても問題ありません。
コンバートジョブをトリガーするため、REST APIを実行する
アクセストークンの取得
model conversion REST APIにアクセスするためにはアクセストークンが必要となります。アクセストークンは専用のエンドポイントが用意されているのでそちらから取得できます。アクセストークン取得のためにはARRのAccountIDとAccess Keyが必要となります。(確認方法はこちらのキャプチャを参考に)
- ドメイン
- sts.mixedreality.azure.com
- エンドポイント
- accounts/{ARRのAccountID}/token
- メソッド
- GET
- 必要なヘッダ
- Authorization
- Bearer {ARRのAccountID}:{ARRのAccessKey}
コンバート用APIの選択
コンバート用のAPIは2つ用意されています。出力されるARR用アセットに違いはなく、ARRからBlob Storageへのアクセス方法の選択によって変わります。アクセス方法としてはIAMを使う方法とSASを使う方法があります。
IAMを使ってアクセスする
Storage Accountに対して、Owner
、Storage Account Contributor
、Storage Blob Data Contributor
のロールをARRのManaged Identityに割り当てます。設定方法はこちら。
設定完了後、APIを叩くとAzure上でコンバートが開始されます。
- ドメイン
- 以下の4つから選ぶ
- remoterendering.southeastasia.mixedreality.azure.com
- remoterendering.eastus.mixedreality.azure.com
- remoterendering.westeurope.mixedreality.azure.com
- remoterendering.westus2.mixedreality.azure.com
- エンドポイント
- /v1/accounts/{ARRのAccountID}/conversions/create
- メソッド
- POST
- 必要なヘッダ
- Authorization
- Bearer {アクセストークン}
リクエストボディのフォーマットは以下の通り
{
"input":
{
"storageAccountname": "ソースファイルが置いてあるストレージアカウントの名前",
"blobContainerName": "ソースファイルが置いてあるコンテナの名前",
"folderPath": "ソースファイルが置いてあるコンテナの中のフォルダの名前(オプション)",
"inputAssetPath" : "ソースファイル名"
},
"output":
{
"storageAccountname": "ARR用アセットの出力先のストレージアカウントの名前",
"blobContainerName": "ARR用アセットの出力先のコンテナの名前",
"folderPath": "ARR用アセットの出力先のフォルダ名(オプション)",
"outputAssetFileName": "ARR用アセットのファイル名。拡張子を`.arrAsset`にする必要がある"
}
}
レスポンスとしてコンバートジョブのIDが返ってきます。コンバートの進捗を確認するときに必要となります。
{
"conversionId": "GUID"
}
SASを使ってアクセスする
SASとはStorage Account内のデータへアクセスするための時限式トークンみたいなものです。こちらもStorage ExplorerやREST APIから取得することが可能です。
ソースファイルと出力先のSASをそれぞれ取得したあと、それを使ってAPIを叩きます。
- ドメイン
- 以下の4つから選ぶ
- remoterendering.southeastasia.mixedreality.azure.com
- remoterendering.eastus.mixedreality.azure.com
- remoterendering.westeurope.mixedreality.azure.com
- remoterendering.westus2.mixedreality.azure.com
- エンドポイント
- /v1/accounts/{ARRのccountID}/conversions/createWithSharedAccessSignature
- メソッド
- POST
- 必要なヘッダ
- Authorization
- Bearer {アクセストークン}
リクエストボディのフォーマットは以下の通り
{
"input":
{
"storageAccountname": "ソースファイルが置いてあるストレージアカウントの名前",
"blobContainerName": "ソースファイルが置いてあるコンテナの名前",
"folderPath": "ソースファイルが置いてあるコンテナの中のフォルダの名前(オプション)",
"inputAssetPath" : "ソースファイル名",
"containerReadListSas" : "ソースファイルのSAS"
},
"output":
{
"storageAccountname": "ARR用アセットの出力先のストレージアカウントの名前",
"blobContainerName": "ARR用アセットの出力先のコンテナの名前",
"folderPath": "ARR用アセットの出力先のフォルダ名(オプション)",
"outputAssetFileName": "ARR用アセットのファイル名。拡張子を`.aarAsset`にする必要がある",
"containerWriteSas" : "出力先のSAS"
}
}
レスポンスとしてコンバートジョブのIDが返ってきます。コンバートの進捗を確認するときに必要となります。
{
"conversionId": "GUID"
}
コンバートジョブの進捗を確認するためREST APIを実行する
コンバートの進捗を確認するためのREST APIも用意されています。
- ドメイン
- 以下の4つから、コンバートジョブを実行したときと同じものを選ぶ
- remoterendering.southeastasia.mixedreality.azure.com
- remoterendering.eastus.mixedreality.azure.com
- remoterendering.westeurope.mixedreality.azure.com
- remoterendering.westus2.mixedreality.azure.com
- エンドポイント
- /v1/accounts/{ARRのAccountID}/conversions/{conversionId}
conversionId
はジョブ実行時のレスポンスから取得したもの
- メソッド
- GET
- 必要なヘッダ
- Authorization
- Bearer {アクセストークン}
レスポンスとしてコンバートの進捗が文字列で返ってきます。
{
"status": "'Created' | 'Running' | 'Success' | 'Failure' "
"error": "string or null"
}
コンバートが完了すると、Success
かFailure
が返ってきます。
まとめ
ARR用のアセットを作る手順をまとめました。まだ各言語用のSDKは用意されていませんが、コンバートに必要なREST APIの種類も少なくシンプルなので実装に困ることはそれほどないかなと思います。今回作ったプロトタイプもNode.js + TypeScriptでaxiosを使って実装しました。
参考
Convert models - MS公式ドキュメント
Azure Remote Rendering - Hiromuブログ