MRが楽しい

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

HoloLensの開発環境構築手順 Unity編

2017/10/21現在。以下の 2017.2 版のインストール記事を新たに作成しました。
bluebirdofoz.hatenablog.com
以下は2017/8/5時点の 2017.1 版のインストール手順となります。

Unityのインストール手順を記録します。

Unityのダウンロードページは以下です。
store.unity.com
2017/8/5現在、Unityの最新バージョンは version 2017.1 です。

利用規約に同意して、Unityのインストーラをダウンロードします。
f:id:bluebirdofoz:20170805230226j:plain

ダウンロードした UnityDownloadAssistant-2017.1.0f3.exe を実行します。
インストーラが起動するので、Nextをクリックします。
f:id:bluebirdofoz:20170805230240j:plain

利用規約が表示されます。チェックボックスをチェックし、Nextをクリックします。
f:id:bluebirdofoz:20170805230254j:plain

コンポーネントの選択しが表示されます。以下を選択し、Nextをクリックします。
・Unity 2017.1.0f3(デフォルトで選択済み)
・Documentation (デフォルトで選択済み)
・Standard Assets (デフォルトで選択済み)
Microsoft Visual Studio Community 2017 (デフォルトで選択済み)
Windows Store .NET Scripting Backend (追加で選択)
Windows Store IL2CPP Scripting Backend (追加で選択)
f:id:bluebirdofoz:20170805230303j:plain
f:id:bluebirdofoz:20170805230311j:plain

インストールディレクトリの選択です。
Unityのインストール先を指定し、Nextをクリックします。
f:id:bluebirdofoz:20170805230319j:plain

合わせてインストールする Microsoft Visual Studio利用規約に関する確認表示です。
チェックボックスをチェックし、Nextをクリックします。
f:id:bluebirdofoz:20170805230331j:plain

インストールが開始します。後は完了まで待つだけです。
f:id:bluebirdofoz:20170805230342j:plain

以上でUnityのインストールは完了です。
f:id:bluebirdofoz:20170805230350j:plain

追記。
2017/8/5現在、Unity5.6で作成したプロジェクトをUnity2017.1で読み込むとエラーが発生することがあります。
・Error Loading Launcher
 https://forum.unity3d.com/threads/error-loading-launcher.486127/

現状、明確な解決方法がありませんので、過去のプロジェクトを利用する場合は 2017.1 のインストールは控えた方が良さげです。
(自分もこの後、Unity5.6を改めてインストールし直しました)
よくよく読んでみると、空のプロジェクトでもエラーが発生したとあります。
2017.1 の不具合だとすれば解消されるのを待つのが吉ですね。

HoloLensの開発環境構築手順をまとめる

hololensの備忘録枠です。
突然ですが、新しいノートPCを購入しました。こちらにもhololensの開発環境をセットアップします。
折角なので自分が実施したインストール手順を備忘録として記録するページを作成します。
今後もインストールするものがあれば、順次、ページを追加していきます。

以下が公式のHoloLens開発環境の案内ページです。
・Install the tools
 https://developer.microsoft.com/en-us/windows/mixed-reality/install_the_tools

開発環境構築

Unity のインストール

bluebirdofoz.hatenablog.com

Windows 10 SDK のインストール

bluebirdofoz.hatenablog.com

3Dモデル操作

Blender のインストール

bluebirdofoz.hatenablog.com

ParaView のインストール

bluebirdofoz.hatenablog.com

SketchUp のインストール

bluebirdofoz.hatenablog.com

Visual Studio CodeとglTF Tools for Visual Studio Codeのインストール

bluebirdofoz.hatenablog.com

動画編集

Bandicam のインストール

bluebirdofoz.hatenablog.com

MovieStudio のインストール

bluebirdofoz.hatenablog.com

その他

SubversionforWindowsのインストール

bluebirdofoz.hatenablog.com

GitForWindows のインストール

bluebirdofoz.hatenablog.com

TortoiseGit のインストール

bluebirdofoz.hatenablog.com

CMake のインストール

bluebirdofoz.hatenablog.com

Hololensで壁の向こうの世界が見える窓を作る その3

hololensの学習枠の続きです。
bluebirdofoz.hatenablog.com

以下の技術ブログを参考にしています。
tips.hecomi.com

今回は「方法2」プロジェクトの動作を確認します。
HoloLens_Stencil_Window/Scenes にある Pattern2 のシーンです。
f:id:bluebirdofoz:20170804011026j:plain

ビルド設定の方法や、Skyboxのマテリアルの設定方法は「方法1」と変わらないので省略します。
bluebirdofoz.hatenablog.com

hololensにインストールして起動します。
窓の向こう側に空とCubeオブジェクトが見えました。
f:id:bluebirdofoz:20170804011046j:plain

方法1と明確に違うのは、窓が壁に設置していない点です。
f:id:bluebirdofoz:20170804011114j:plain
窓以外の壁を遮蔽する仕組みの方法1と、窓を通した場合のみ描画する仕組みの方法2の違いの一つですね。


では合わせてプロジェクト内のコードを確認して、方法2の理解を深めます。
今回のシェーダは、窓を通したときのみ描画を行う MaskedSky のシェーダと、窓を開ける Window オブジェクトのシェーダです。

まずは、窓を開ける Window オブジェクトのシェーダですが、これは方法1の Window.shader と同じです。
窓オブジェクトの位置のステンシルバッファに 1 を書き込みます。

ですので早速、窓を通したときのみ描画を行う Skybox シェーダについて読み解きます。
・MaskedSky.shader

Shader "HoloLens/MaskedSky"
{
  Properties
  {
    _Mask("Mask", Int) = 1
    _Tint ("Tint Color", Color) = (.5, .5, .5, .5)
    [Gamma] _Exposure ("Exposure", Range(0, 8)) = 1.0
    [NoScaleOffset] _Cube ("Cubemap (HDR)", Cube) = "grey" {}
  }
  SubShader
  {
    // タグ付け
    Tags 
    { 
      // "RenderType(レンダータイプ)"を"Opaque(不透明)"に指定
      "RenderType" = "Opaque" 
      // Background→Geometry→AlphaTest→Transparent→Overlayの順で描画される。
      // つまり通常オブジェクトより背景に近いシェーダとして設定している
      "Queue" = "Geometry-1"
      // マテリアルのインスペクタープレビューの表示形式
      // Skybox:空テクスチャのように表示
      "PreviewType" = "Skybox"
    }
    CGINCLUDE
    // "UnityCG.cginc"をインクルード
    #include "UnityCG.cginc"

    samplerCUBE _Cube;
    half4 _Cube_HDR;
    half4 _Tint;
    half _Exposure;

    // v2f構造体の定義
    // 頂点シェーダからフラグメントシェーダに複数の値を渡す時に利用する
    struct v2f 
    {
      // float4 SV_POSITION  MVP 変換後の座標
      float4 vertex : SV_POSITION;
      // float3 TEXCOORD0    1番目のテクスチャの UV 座標
      float3 texcoord : TEXCOORD0;
      // VRのシングルパスステレオレンダリングのマクロ
      UNITY_VERTEX_OUTPUT_STEREO
    };
    // 頂点シェーダ
    v2f vert(appdata_base v)
    {
      // 返り値として利用するv2f構造体の変数を作成
      v2f o;
      // インスタンス ID がシェーダー関数にアクセス可能になる
      UNITY_SETUP_INSTANCE_ID(v);
      // VR向けの頂点シェーダーへの変換を行う
      UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
      // 同次座標において、オブジェクト空間からカメラのクリップ空間へ点を変換する
      o.vertex = UnityObjectToClipPos(v.vertex);
      // 物体の頂点ごとのワールド座標を取得し、テクスチャの UV 座標に代入している
      o.texcoord = v.vertex.xyz;
      return o;
    }
    // フラグメントシェーダ
    fixed4 frag(v2f i) : SV_Target
    {
      // テクスチャの UV 座標からカラーを取得している
      half4 tex = texCUBE(_Cube, i.texcoord);
      half3 c = DecodeHDR(tex, _Cube_HDR);
      // ガンマ補正やら何やら……
      c = c * _Tint.rgb * unity_ColorSpaceDouble.rgb;
      c *= _Exposure;
      // 最終的なカラーを出力する
      return half4(c, 1);
    }
    ENDCG

    Pass
    { 
      // Cull:ポリゴンのどちら側をカリングする(描画しない)か制御。
      // Front 表側のポリゴンをレンダリングしない。オブジェクトを反転するのに使用する。
      Cull Front
      // ZWrite:デプスバッファに書き込みするか制御
      // 不透明なオブジェクトを描画する場合、On
      ZWrite On

      // Stencil:ステンシルバッファはピクセルマスクごとにピクセルを保存や廃棄することを目的とする
      // ステンシルバッファは、通常、1 ピクセルあたり 8 ビットの整数である
      Stencil 
      {
        // バッファに_Maskの 1 の整数が書き込まれる
        Ref [_Mask]
        // Comp:関数はバッファの現在の内容と基準値の比較に使用される
        // NotEqual:ピクセルのレファレンス値がバッファの値と等しい場合のみレンダリングする
        Comp Equal
      }

      CGPROGRAM
      #pragma fragmentoption ARB_precision_hint_fastest
      #pragma vertex vert
      #pragma fragment frag
      #pragma target 5.0
      #pragma only_renderers d3d11
      ENDCG
    }
  }
}

重要なのは Stencil 内の Comp Equal です。
要は方法1と異なり、ステンシルバッファに 1 が書き込まれている場所のみ、Skybox の描画を行うという仕組みです。
Cube オブジェクトについても MaskedObject という全く同じレンダリング条件を持ったシェーダが割り当てられています。

また、本プロジェクトでは、窓に対して、一つの Skybox と 一つのオブジェクトでしたが。
この方法2ではステンシルバッファへの書き込み値を変えることで、窓ごとに表示オブジェクトを変更することが可能です。

試してみましょう。
プロジェクトに、新しい窓、オブジェクト、Skyboxを用意します。これらのシェーダのマスク値は"2"を設定します。
f:id:bluebirdofoz:20170804011213j:plain

アプリを起動します。一方の窓からは先ほどと同様、空とCubeオブジェクトが確認できます。
f:id:bluebirdofoz:20170804011224j:plain

新しい窓を覗いてみると……。
f:id:bluebirdofoz:20170804011232j:plain
夜空とSphereオブジェクトが確認できました。


さて、これで技術に関する理解は完了です。理解してみると、仕組みとしては思った以上に単純です。
機会があれば活用アイデアを考えて自作アプリへ応用してみます。

Hololensで壁の向こうの世界が見える窓を作る その2

hololensの学習枠の続きです。
bluebirdofoz.hatenablog.com

以下の技術ブログを参考にしています。
tips.hecomi.com

今回は「方法1」プロジェクト内のコードを確認して、技術への理解を深めます。

改めてプロジェクトの全体像を確認します。
f:id:bluebirdofoz:20170803034755j:plain

Sceneタブの視点を遠ざけていくと、巨大な円形のSkyboxオブジェクトがあることが分かります。
f:id:bluebirdofoz:20170803034806j:plain

アプリが開始すると、SpatialMapping のメッシュが視界を覆います。
SpatialMapping のメッシュに穴を開けて、その奥にある Skybox オブジェクトのメッシュを覗き見るという仕組みです。
f:id:bluebirdofoz:20170803034839j:plain

視界を遮る SpatialMapping のシェーダと、そこに窓を開ける Window オブジェクトのシェーダを読み解きます。
まずは、視界を遮る SpatialMapping のシェーダです。
・Wall.shader

Shader "HoloLens/Wall"
{
  Properties
  {
    _Mask("Mask", Int) = 1
  }
  SubShader
  {
    // タグ付け
    Tags 
    { 
      // "RenderType(レンダータイプ)"を"Opaque(不透明)"に指定
      "RenderType" = "Opaque" 
      // "Queue(描画順)"を"Geometry(デフォルト)-1"に指定
      // Background→Geometry→AlphaTest→Transparent→Overlayの順で描画される。
      // つまり通常オブジェクトより背景に近いシェーダとして設定している
      "Queue" = "Geometry-1"
    }
    CGINCLUDE
    // "UnityCG.cginc"をインクルード
    #include "UnityCG.cginc"

    // v2f構造体の定義
    // v2fという名前は慣例で Vertex To Fragmentの略
    // 頂点シェーダからフラグメントシェーダに複数の値を渡す時に利用する
    struct v2f
    {
      // float4 SV_POSITION  MVP 変換後の座標
      float4 vertex : SV_POSITION;
      // VRのシングルパスステレオレンダリングのマクロ
      UNITY_VERTEX_OUTPUT_STEREO
    };
    // 頂点シェーダ
    v2f vert(appdata_base v)
    {
      // 返り値として利用するv2f構造体の変数を作成
      v2f o;
      // インスタンス ID がシェーダー関数にアクセス可能になる
      UNITY_SETUP_INSTANCE_ID(v);
      // VR向けの頂点シェーダーへの変換を行う
      UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
      // 同次座標において、オブジェクト空間からカメラのクリップ空間へ点を変換する
      o.vertex = UnityObjectToClipPos(v.vertex);
      // 構造体を返す
      return o;
    }
    // フラグメントシェーダ
    fixed4 frag(v2f i) : COLOR
    {
      // 描画するカラーを返却する
      // 必ず 0 を返却する
      // ただし ColorMask 0 が設定されているため、カラーチャネルは書き込まれない
      return 0;
    }
    ENDCG

    Pass
    {
      // カラーチャネルの書き込みを設定
      // ColorMask 0 ですべてのカラーチャネルのレンダリングを無効化
      ColorMask 0
      // ZWrite:デプスバッファに書き込みするか制御
      // 不透明なオブジェクトを描画する場合、On
      ZWrite On
      // ZTest:デプステストの実行方法
      // LEqual:既に描画されているオブジェクトと距離が等しいか、より近い場合に描画する
      //        それより遠い場合はオブジェクトで隠す
      ZTest LEqual

      // Stencil:ステンシルバッファはピクセルマスクごとにピクセルを保存や廃棄することを目的とする
      // ステンシルバッファは、通常、1 ピクセルあたり 8 ビットの整数である
      Stencil 
      {
        // バッファに_Maskの 1 の整数が書き込まれる
        Ref [_Mask]
        // Comp:関数はバッファの現在の内容と基準値の比較に使用される
        // NotEqual:ピクセルのレファレンス値がバッファの値と等しくない場合のみレンダリングする
        Comp NotEqual
      }

      CGPROGRAM
      #pragma vertex vert
      #pragma fragment frag
      #pragma target 5.0
      #pragma only_renderers d3d11
      ENDCG
    }
  }
}

次に、壁に穴を開ける Window のシェーダです。
・Window.shader

Shader "HoloLens/Window"
{
  Properties
  {
    _Mask ("Mask", Int) = 1
  }
  SubShader
  {
    // タグ付け
    Tags 
    { 
      // "RenderType(レンダータイプ)"を"Opaque(不透明)"に指定
      "RenderType" = "Opaque" 
      // "Queue(描画順)"を"Geometry(デフォルト)-2"に指定
      // つまり先ほどの Wall オブジェクトより先駆けて描画する
      "Queue" = "Geometry-2"
    }
    CGINCLUDE
    // "UnityCG.cginc"をインクルード
    #include "UnityCG.cginc"

    // v2f構造体の定義
    // v2fという名前は慣例で Vertex To Fragmentの略
    // 頂点シェーダからフラグメントシェーダに複数の値を渡す時に利用する
    struct v2f
    {
      // float4 SV_POSITION  MVP 変換後の座標
      float4 vertex : SV_POSITION;
      // VRのシングルパスステレオレンダリングのマクロ
      UNITY_VERTEX_OUTPUT_STEREO
    };
    // 頂点シェーダ
    v2f vert(appdata_base v)
    {
      // インスタンス ID がシェーダー関数にアクセス可能になる
      UNITY_SETUP_INSTANCE_ID(v);
      // 返り値として利用するv2f構造体の変数を作成
      v2f o;
      // 同次座標において、オブジェクト空間からカメラのクリップ空間へ点を変換する
      o.vertex = UnityObjectToClipPos(v.vertex);
      // VR向けの頂点シェーダーへの変換を行う
      UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
      // 構造体を返す
      return o;
    }
    // フラグメントシェーダ
    fixed4 frag (v2f i) : SV_Target
    {
      // 描画するカラーを返却する
      // 必ず 0 を返却する
      // ただし ColorMask 0 が設定されているため、カラーチャネルは書き込まれない
      return 0;
    }
    ENDCG

    Pass
    {
      // カラーチャネルの書き込みを設定
      // ColorMask 0 ですべてのカラーチャネルのレンダリングを無効化
      ColorMask 0
      // ZWrite:デプスバッファに書き込みするか制御
      // 透明なオブジェクトを描画する場合、Off
      ZWrite Off
      // Stencil:ステンシルバッファはピクセルマスクごとにピクセルを保存や廃棄することを目的とする
      // ステンシルバッファは、通常、1 ピクセルあたり 8 ビットの整数である
      Stencil 
      {
        // バッファに_Maskの 1 の整数が書き込まれる
        Ref [_Mask]
        // Comp:関数はバッファの現在の内容と基準値の比較に使用される
        // Always:常にステンシルテストをパスさせる
        Comp Always
        // Pass:ステンシルテスト(及びデプステスト)をパスした場合、バッファの内容をどうするか決める
        // Replace:リファレンス値をバッファに書き込む
        Pass Replace
      }

      CGPROGRAM
      #pragma vertex vert
      #pragma fragment frag
      ENDCG
    }
  }
}

要は Window.shader が先駆けてステンシルバッファに 1 を書き込み。
その後、Wall.shader がステンシルバッファに 1 が書き込まれていない箇所のみ、デプスバッファを設定して背景の Skybox の描画を遮蔽しています。

以下の記事も参考になります。
tips.hecomi.com

次回は、方法2の動作と仕組みについて理解します。
bluebirdofoz.hatenablog.com

Hololensで壁の向こうの世界が見える窓を作る その1

本日はhololensの学習枠です。
今回トライするのは、壁や空間に窓が開いてその向こうに別の風景が見える、という技術です。

まずは技術の理解からです。以下の技術ブログでサンプルプロジェクトが提供されています。
tips.hecomi.com

今回はこちらを参考に技術を理解していきます。
hecomi/HoloLensPlayground をダウンロードしてプロジェクトを開きました。
f:id:bluebirdofoz:20170802005009j:plain

シェーダやSpatialMappingを利用するため、合わせてHoloToolKitもインポートします。
f:id:bluebirdofoz:20170802005106j:plain

「方法1」の技術について確認します。
HoloLens_Stencil_Window/Scenes にある Pattern1 のシーンがそれのようです。
f:id:bluebirdofoz:20170802005123j:plain

HoloToolkit -> Configure -> Apply Hololens Project Settings でビルド設定を変更します。
f:id:bluebirdofoz:20170802005134j:plain

本プロジェクトは Spatial Mapping を使うので SpatialPerception の許可設定が必要です。
Edit -> Project Setting -> Player から PlayerSettings を開きます。
Windows Store App Settings の Publishing Settings にある Capabilities から SpatialPerception をチェックします。
f:id:bluebirdofoz:20170802005144j:plain

後は File -> Build Settings でビルド設定を開き、Add Scene でシーンを追加して「Build」をクリックで完了です。
f:id:bluebirdofoz:20170802005153j:plain

hololensにインストールして起動します。
f:id:bluebirdofoz:20170802005204j:plain

壁をタップすると……。
f:id:bluebirdofoz:20170802005226j:plain

窓が出ました……が、この時点では窓の向こうには何も見えません。
これは、そのままだとSkyboxオブジェクトのNormalSkyマテリアルにテクスチャが割り当てられていないためです。
プロジェクト内を探しましたが、サンプルテクスチャはないので自分で好きな画像を設定してくださいと言う事だと思います。
(違ってたらすいません)

全天球の表示を行うため、Cubemapに対応したテクスチャが必要となります。
丁度、手元にBlender講座で利用したイイ感じの空テクスチャがあったので利用します。
画像ファイルをインポートしたら、画像のInspectorから以下の設定を行います。
 TextureType:Default
 TextureShape:cube
f:id:bluebirdofoz:20170802005316j:plain

「Apply」ボタンを押して反映すると、以下のようにCubemapテクスチャが作成されます。
f:id:bluebirdofoz:20170802005325j:plain

ではテクスチャを適用してみます。
HoloLens_Stencil_Window -> Materials にある NormalSky.mat のInspectorを開きます。
Cubemapに先ほどインポートしたCubemapテクスチャを設定します。
f:id:bluebirdofoz:20170802005701j:plain

この状態で改めてビルドしてみると……。
f:id:bluebirdofoz:20170802005344j:plain

今度は窓の向こうに空が見えるようになりました。
次回は本プロジェクトのシェーダの処理を読み解き、技術について理解を深めます。
bluebirdofoz.hatenablog.com

Blenderで3Dモデルを作る(準備手順)

本日はBlenderの学習枠です。
ただ、新しい技術習得ではなく、週一で何か作ってないとBlenderの操作方法を忘れそうなので小物を作るだけです。
今回はメガネを作ります。
f:id:bluebirdofoz:20170801032851j:plain

ただ作るだけなのも味気ないので、私がBlenderで3Dモデルを作るときの最初の準備手順を紹介します。


まず、これから作る3Dモデルの三面図を作成します。
三面図が綺麗に書けていれば、後はどれだけ時間をかけようと、それをなぞるだけなので、この三面図の完成度が3Dモデリングの8割方という印象です。
今回、利用するメガネの三面図は以下です。
f:id:bluebirdofoz:20170801033014j:plain

以下の特許図面から作成しました。
フロント及びフロントの製造方法

こんな用途の図面ではないでしょうが。特許図面なだけに図面の精度は折り紙付きです。

Blednerを起動します。
f:id:bluebirdofoz:20170801033112j:plain
Cubeオブジェクトは要らないので削除してください。

次に3Dビューウィンドウの右上にある摘みをドラッグします。
f:id:bluebirdofoz:20170801033121j:plain

すると3Dビューウィンドウが分割されます。
f:id:bluebirdofoz:20170801033133j:plain

同じ要領で四分割していきます。
f:id:bluebirdofoz:20170801033149j:plain

三面図は並行投影で描かれた図ですので、カメラの視点を並行投影にします。
・透視投影(Perspective)と平行投影(Orthographic)
 https://wiki.blender.org/index.php/Doc:JA/2.6/Manual/3D_interaction/Navigating/3D_View

3Dビューウィンドウ上でテンキーの 5 キーを押すと、透視投影と平行投影が切り替わります。
f:id:bluebirdofoz:20170801033226j:plain

それぞれのウィンドウ上でテンキーの 5 キーを押し、右上以外を全て並行投影にします。
f:id:bluebirdofoz:20170801033235j:plain

更にテンキーの他の数字で、正面、右正面、真上からの視点に変更可能です。以下の通り、視点変更します。
 左上:7キー(真上)
 左下:1キー(正面)
 右下:3キー(右正面)
f:id:bluebirdofoz:20170801033252j:plain

はてなブログ上の画像だと見えづらいかもしれませんが、それぞれ異なる方向からの視点となります。
テンキーによる視点変更ルールの詳細は以下を参照ください。
blender-cg.net


次に各ウィンドウに三面図を表示させます。ウィンドウ右上の「+」ボタンを押してください。
f:id:bluebirdofoz:20170801033314j:plain

プロパティシェルフが開きます。下の方に「下絵」という項目があります。「画像を追加」をクリックしてください。
f:id:bluebirdofoz:20170801033323j:plain

作成した三面図を指定すると、ウィンドウ内に画像が表示されます。
サイズや位置のパラメータを変更して画像の位置を調整できます。
f:id:bluebirdofoz:20170801033334j:plain

左下、右下の3Dビューウィンドウでも同様の操作を行います。
三面図のそれぞれの図を、それぞれの方向から辻褄が合う位置に移動させてください。
f:id:bluebirdofoz:20170801033346j:plain
これで準備OKです。

後はひたすら各方面から見た点の位置が合うように3Dモデルを作り込んでいけば、三面図通りの3Dモデルが完成します。
f:id:bluebirdofoz:20170801033405j:plain

最後にテクスチャを貼って、細分割局面モディファイアをかけてやれば、あっという間にそれっぽく。
f:id:bluebirdofoz:20170801033423j:plain

やったぜ!
f:id:bluebirdofoz:20170801033431j:plain

Blenderで作成した3DモデルをUnityに取り込む その4

前回記事の続きです。
bluebirdofoz.hatenablog.com

今回解決するのは検出された問題の3点目です。
次は「ゴーグル部分の透過が行われていない」を解決します。
f:id:bluebirdofoz:20170731000855j:plain

早速調べてみましょう。Unityの公式ページで以下の情報が見つかりました。
docs.unity3d.com

RenderingMode を Opaque 以外に設定して Alpha 値を設定しろとのことです。
因みに RenderingMode についても確認しました。
docs.unity3d.com

今回の用途を鑑みるに、Transparent の設定を用いるのが適切ですね。
手順を追って、試してみます。
 1.透過したいオブジェクトのマテリアルを開く。
 2.RenderMode を Transparent に設定する。
 3.Albedo のパレットをクリックして Color ダイアログを開く。
 4.A(Alpha)値を設定する。(デフォルト 255 は不透明、0 は完全透明)
f:id:bluebirdofoz:20170731001001j:plain

確かに透明になりました……が、見ての通り、ゴーグル部分だけではなく全体が透過されてしまいました。
f:id:bluebirdofoz:20170731001013j:plain
これは Color ダイアログで設定する Alpha 値がテクスチャ全体の設定となるためですね。

意図した個所のみ透過するには、意図した個所にのみ Alpha 値が設定されている Alpha マップが必要です。
そういえば、透過の学習をしたときに、Alpha マップを設定した png ファイルを使う実験をしていました。
bluebirdofoz.hatenablog.com
これの画像ファイルなら、ゴーグル部分にのみ Alpha 値が設定されています。

このとき、作成した png ファイルをインポートしてみます。
f:id:bluebirdofoz:20170731001035j:plain

RGB/Alphaボタンをクリックして、RGB チャンネル と Alpha チャンネルを切り替えてみます。
f:id:bluebirdofoz:20170731001048j:plain
こちらのテクスチャファイルにはゴーグル部分にのみ、Alpha 値が設定されていることが確認できます。

このテクスチャを使いましょう。RenderMode を Transparent のまま。
Color ダイアログの Alpha を 255 に戻してテクスチャを選択しなおします。
f:id:bluebirdofoz:20170731001102j:plain
成功です。ゴーグル部分のみが透過されました。

これで解決……としてもよいのですが。この解決方法では alpha マップを指定した png ファイルが必要です。
透明度の変更に png ファイルを修正するは面倒だからと、Blender で色々工夫したのです。
折角ですから、Unity上でも切り分けを行いたいところです。


さて、ここで気になるのは hololens モデルのマテリアルです。
f:id:bluebirdofoz:20170731001114j:plain
Blender では本体とゴーグルで別の透明度を設定するため、マテリアルを分けていたはずなのに、Unity上では1つしかありません。

Materialsという項目があり、そこで本体とゴーグルに反映するマテリアルは分けられています。
しかし、マテリアルの一覧を見るとマテリアルが一つしか取り込まれておらず、両方がそちらを参照しています。
f:id:bluebirdofoz:20170731001127j:plain

Blenderのプロジェクトを確認すると、以下の通りマテリアルを分割しています。
f:id:bluebirdofoz:20170731001139j:plain

本事象はどうも Unity のインポータによる動きのようです。
docs.unity3d.com

参照しているテクスチャ毎にマテリアルを作成するとあります。
Blenderのインポートに関する情報を確認してもマテリアルがインポート対象になっていません。
docs.unity3d.com

つまり Unity 向けのオブジェクトを作成する際、Blender 側でできる設定は UV のメッシュ設定まで。
マテリアルの設定は Unity 側で行う必要があるという訳ですね。

試しに Unity 内で解決してみましょう。効果を分かりやすくするため、まずはマテリアルを透明度のない状態に戻します。
f:id:bluebirdofoz:20170731001227j:plain

マテリアルを複製します。因みに Unity の Asset を複製する際は複製したいファイルを選択して Ctrl + D で複製できます。
f:id:bluebirdofoz:20170731001238j:plain
名前を「hololens_circle_texture_alpha」としておきます。

先ほど話した通り UV 展開の設定はインポートされています。
MeshRenderer の Materials からゴーグルの Element を選択して、複製したマテリアルを設定します。
f:id:bluebirdofoz:20170731001246j:plain

後は先ほど同様「hololens_circle_texture_alpha」のマテリアルに alpha 値を設定して透過させてください。
f:id:bluebirdofoz:20170731001256j:plain
「hololens_circle_texture_alpha」はゴーグル部分にのみ設定されたマテリアルのため、本体部分とは分けて透過レベルの変更が行えるようになりました。

以上で「ゴーグル部分の透過が行われていない」の問題について解決できました。


余談。
.fbxファイルを取り込んだ時点でマテリアルを分けておきたい場合についてです。
これはBlenderでのマテリアル設定時に、それぞれのマテリアルが参照するファイルを別にしておけばOKです。
f:id:bluebirdofoz:20170731001310j:plain
それぞれのマテリアルで「hololens_circle_texture_band」「hololens_circle_texture_glass」という内容は同じ別名のテクスチャを別々に読み込ませるようにします。

2つのテクスチャを Unity にインポートして、作成した.fbxファイルを読み込むと……。
f:id:bluebirdofoz:20170731001326j:plain
この通り、読み込み時点でマテリアルが2つ作成され、それぞれの UV に設定された状態となっています。


しかし、このとき、新たな問題が発生しました。
UV に対応するテクスチャを示すマテリアルが読み込めていないため、マテリアルリストの順番がズレています。
(上記画像だと、1つ目が「~_glass」2つ目が「~_band」となっていますが、対応が逆です)
本件の対応方法は調査中……以下に情報がありましたが、自分の環境だとこの方法では解決せず。
soucolle.jp

以下の割り当てをBlender上でもう一度実施することで何とか解決しました。
qiita.com

おそらく内部的にソート以外にも何か関連を持っているのでしょうが、現状原因は不明です。
f:id:bluebirdofoz:20170731001408j:plain

因みに.fbx読み込み時に3Dモデルを予め、透過にしておくのは難しそうです。
例え、alpha マップを含んだテクスチャを参照していても、マテリアルのデフォルトの RenderingMode は Opaque です。
やはり読み込み後に手動で設定を行う必要があります。