MRが楽しい

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

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 です。
やはり読み込み後に手動で設定を行う必要があります。