Blob Storageに保存した3Dモデル(GLB形式)を表示する

はじめに

Unityで3Dオブジェクトを表示する場合、一番簡単な方法はアプリケーションの中に組み込むことです。ただ、これだと3Dオブジェクトが固定されてしまいます。そこで今回は外部のストレージから3Dオブジェクトを取得する方法について調査しました。

やりたいことの図解

環境

Unity2020.3.36f1
MRTK 2.8.2
Azure.Storage.Blobs version 12.13.0

実装のポイント

Blob StorageのSDKの導入

UnityでBlob Storageのデータを取得するためにSDKを利用します。導入方法については以前投稿した記事に書きました。

blog.jbs.co.jp

実装手順内のNuGetForUnityの導入Blob Storageのパッケージの導入を参考にしていただければと思います。
今回はSDKを使ってGLB形式の3Dモデルをバイト配列として取得します。

3Dモデルの表示

MRTKのGltfUtilityというクラスを使うとスクリプトからGLB形式の3Dモデルを取得することができます。

learn.microsoft.com

今回はGetGltfObjectFromGlbというメソッドを利用します。これを使うとバイト配列で取得した3DモデルをUnityで利用する形に変換することができます。

手順

Blob Storageにアップロード

GLB形式の3Dモデルをアップロードします。具体的な手順は以下のドキュメントをご覧ください。

learn.microsoft.com

Unityでの実装

まずはUnityで以下のスクリプトを作ります。

using Azure.Storage.Blobs;
using Microsoft.MixedReality.Toolkit.Utilities.Gltf.Serialization;
using UnityEngine;

public class GlbTest : MonoBehaviour
{
    string connectionString = "[Blob Storageの接続文字列]";
    string containerName = "[3Dモデルを保存したコンテナ名]";
    string fileName = "[3Dモデルのファイル名]";

    async void Start()
    {
        //Blob Storageのクライアントを作成
        BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);

        //Blob Storageのコンテナのクライアントを作成
        BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(containerName);
        
        //ダウンロードした3Dモデルを取得
        var content = await containerClient.GetBlobClient(fileName).DownloadContentAsync();

        //バイト配列に変換
        byte[] glbByteArray = content.Value.Content.ToArray();

        //GLB形式の3Dモデルのバイト配列からUnity上で使えるように変換
        GameObject glbModel = await GltfUtility.GetGltfObjectFromGlb(glbByteArray).ConstructAsync();
        
        //現在の位置情報を取得
        Vector3 currentPosition = Camera.main.transform.position;

        //3Dモデルの位置を調整(自分の目の前に来るようにする)
        glbModel.transform.position = new Vector3(currentPosition.x, currentPosition.y, currentPosition.z + 0.5f); ;
    }
}

次に①Unityエディタで空のオブジェクトを作り、②先ほど作成したスクリプトを追加します。

以上で準備完了です。
あとはUnityエディタの実行、またはHoloLens 2にデプロイしてアプリを起動すれば自動的に目の前にオブジェクトが現れます。

HoloLens 2で実行した場合の写真。Blobストレージに保存した3Dオブジェクト(立方体)が表示されます。

最後に

今回は3Dオブジェクト固定、タイミングもアプリ起動時に指定していましたが、Blob Storageにたくさん3Dモデルを保存しておき、ユーザーがアプリ側で選択して表示できたら役立ちそうですね。

執筆担当者プロフィール
古川 貴浩

古川 貴浩(日本ビジネスシステムズ株式会社)

HoloLens 2アプリケーションの開発をしています。

担当記事一覧