Azure Remote Rendering (ARR) サンプルの機能の纏め

#この記事について
Azure Remote Renderingとは3Dモデルを最高の品質でMixed Realityデバイスに体験できます。Azureのコンピューティング力を利用して、クラウドでレンダリング、そうしてデバイスへストリーミングとは可能です。こんな方法で各ユーザーは3Dモデルと最大の詳細で操作してコラボレーションができます。この記事で、ARRドキュメンテーションからのサンプルに機能を纏めさせていただきます。

#条件
[Azure Remote Rendering](https://docs.microsoft.com/ja-jp/azure/remote-rendering/tutorials/unity/tutorial-landing)チュートリアルを完成。
「チュートリアル:素材、ライト、および効果の調整」までだけはOK!

#モデル選択
このModel Pathの入力に自分のモデルのリンク（Arrファイル）入れてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156398/a4061d7b-7792-d886-286b-9da481cd5f00.png)

モデル用意しなかった場合はこのデフォールトリンクいれても大丈夫です。
"builtin://Engine"

下のサンプルはMRTKのREST APIを使って、ARRファイルをModel Path入力に自動で入れます。

```python:ArrDownloader.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.MixedReality.Toolkit.Utilities;
using TMPro;
using UnityEngine.UI;

public class ArrDownloader : MonoBehaviour
{
    string endpoint = "<こちらは自分のエンドポイント>";
    string authorizationKey = "<自分のキー>"
    public GameObject modelSlot;

    [System.Serializable]
    public class SasUrl{
        public string results;
    }

    private void Awake() {
        getSas();
    }

    async void getSas(){
        Response response = new Response();
        try{
            var headers = new Dictionary<string, string>();
            headers.Add("x-api-key", authorizationKey);
            var parameters = new Dictionary<string, string>();
            response = await Rest.GetAsync(endpoint, headers, -1, null, true);
            if (!response.Successful)
            {
                debugText.text = "サーバーにアクセスできません。#0031";
                return;
            }
            //Debug.Log(response.ResponseBody);
            var sasUrl = JsonUtility.FromJson<SasUrl>(response.ResponseBody);
            Debug.Log(sasUrl.results);
            modelSlot.GetComponent<RemoteRenderedModel>().ModelPath = sasUrl.results;
        }        
        catch (Exception e)
        {
            Debug.LogError(e.Message);
            debugText.text = "サーバーにアクセスできません。#0032";
            return;
        }
    }
}

```


#操作
MRTKの環境のようにEditorでキーボード「スペース」を押したらハンドポインターが出てくる。ハンドポインターで左クリックしたら、ボタンを押せます。右クリックを押すと移動したら、頭を回転するように、ビューを回転します。

アプリを起動したら、Connectボタンでセッションを始めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156398/e5811086-6a62-2d96-4d03-1aa68d1a8657.png)

セッションを作成します。普段は2-3分をかかったけれど、最大5分ぐらいもかかるかもしてません。
参考：[セッション起動は長すぎて](https://docs.microsoft.com/en-us/answers/questions/411261/connectingtonewremotesession-of-remote-rendering-t.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156398/0a4c6d3e-076e-5bbe-c1b9-d7689528e46d.png)

セッション接続できましたら、モデルを自動に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156398/c237436d-5d55-6c14-4d2b-c62f4c7491e8.png)

キーボードで「m」ボタンを押したら、操作UIを左手に移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156398/4f76b298-184d-f594-43eb-94ad72614b8b.png)

操作のサンプルです。

https://twitter.com/hf_mandak/status/1398231158756765698?s=20


#機能
Azure Remote Rendering機能については、次のセクションで説明します。

##Model Tools
まずはストリーミングされたモデルの操る道具を説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156398/79c173fb-c471-d8a2-62c3-90f2129c51c6.png)

###Load/Unload
「Load/Unload」ボタンはレンダーされたモデルを表示すると標示されないのボタンです。

###Edit Material
Azure Remote RenderingのモデルのMaterialを変更できます。この例では、モデルは簡略すぎて、変更できるものはあまり選択はないです。今度は別のモデルで試します。

https://twitter.com/hf_mandak/status/1398231995642122240?s=20

この下の例では、もっとコンプレックスモデルで体験した。

https://twitter.com/hf_mandak/status/1399657173823549444

###Hierearchical State Override
Hierarchical State Overrideとは各オブジェクトを操られることができます。

https://twitter.com/hf_mandak/status/1398232865737904128?s=20

この別の映像で、車の部分を隠すことができました。

https://twitter.com/hf_mandak/status/1399666362138562561?s=20

###Lock/Unlock
この機能で、モデルの状態をロックされて、操ることはできなくなる。

##Session Tools
Session Toolsとは、ARRセッションの環境を操る。各道具は別々の機能を持ってます。各機能でストリーミングされたモデルを影響する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156398/492dce78-a373-0869-ecb8-433946d4c7d9.png)


###Cut Planes
Cut Planesとは平面のオブジェクトです。この平面で、切られた部分を表示されていません。なので、モデル中身を見れます。

https://twitter.com/hf_mandak/status/1398235301924020226?s=20



###Directional Light
Directional Lightとは光の源を色が更できます。光の源を変更すれば、オブジェクトの色も影響受けます。

https://twitter.com/hf_mandak/status/1398237150441656324?s=20

###Skybox
Skyboxとはシーン全体の環境です。これを操る場合は、自分のモデルをそれぞれの環境で違いが見えます。

https://twitter.com/hf_mandak/status/1398237150441656324?s=20