MRが楽しい

MRやVRについて学習したことを書き残す

3Dモデルのテクスチャを切り替える

本日は Blender と Unity の技術調査枠です。
前回、UIパネルにテクスチャを反映する方法を試してみました。今回はこれの番外編です。
bluebirdofoz.hatenablog.com

目の前にデバッグ用に作成したタブレットの3Dモデルがあるのに、UIパネルに写真を表示するのは味気ないです。
今回はUIパネルではなく、タブレットモデルの画面部分にテクスチャを反映してみたいと思います。

まずは Blender で、タブレットモデルの画面部分を一枚のテクスチャを参照する形に修正します。
f:id:bluebirdofoz:20180323025536j:plain

Unityで一つのオブジェクトのマテリアルを分割する方法の詳細については以下にまとめています。
bluebirdofoz.hatenablog.com

モデルを修正したら fbx 形式で出力して Unity に取り込みます。
デバッグタブレットと見分けがつくようデフォルト色を赤色に変更しています。
f:id:bluebirdofoz:20180323025607j:plain

ゲームオブジェクトを選択すると、以下のような形です。
二つ目の「TabletProject_Gamen」が画面のマテリアルなので、このマテリアルのテクスチャを変更する必要があります。
(Materials 内の Element の順番と DynamicOccluded 以下の順番が異なるので注意。恐らく後者はアルファベット順?)
更に今回はUIとして見易くするため、該当シェーダを「UI/Default」に変更しています。
f:id:bluebirdofoz:20180323025616j:plain

MeshRenderer の二つ目のマテリアルを変更するため、前回作成したマテリアルの変更処理を以下のように修正しました。
・CaptureTest.cs

    /// <summary>
    /// テクスチャをマテリアルに反映する
    /// </summary>
    public void RefMaterial(Texture2D texture)
    {
        // 反映用マテリアルを作成
        changeMaterial = new Material(formatMaterial);
        changeMaterial.SetTexture("_MainTex", texture);
        
        // マテリアルリストを取得し、二つ目のマテリアルのみ変更する
        Material[] materials = targetObject.GetComponent<MeshRenderer>().materials;
        materials[1] = changeMaterial;
        
        // マテリアルリストを反映
        targetObject.GetComponent<MeshRenderer>().materials = materials;
    }

因みに下記サイトによると Renderer の Materials は個々には変更が反映されないようです。
kido0617.github.io

オブジェクトの参照を設定しなおして、HoloLens にインストールします。
f:id:bluebirdofoz:20180323025640j:plain

HoloLens でアプリを起動します。デフォルト状態だと画面には何も表示されていません。
f:id:bluebirdofoz:20180323025648j:plain

タップ操作を行うと……。
f:id:bluebirdofoz:20180323025657j:plain
タブレットの画面部分に写真が反映されました。成功です。
……が、こういったディスプレイ的な使い方においては文字表示の容易さを考えると、パネルを使った方が使い勝手が良いですね。