MRが楽しい

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

Unity上にx3d形式のジオメトリデータを取り込む

本日は Unity の技術調査枠です。
前回 ParaView で作成したデータを Blender に取り込みました。
bluebirdofoz.hatenablog.com

今回は更に、このデータを Unity 上で可視化します。
Unity ではx3d形式のジオメトリデータをそのまま3Dデータとして取り込むことはできません。
よって一度、Blender でFBX形式のファイルでエクスポートします。
f:id:bluebirdofoz:20170821005803j:plain

Unity に取り込みます。しかし、テクスチャがないので灰色のオブジェクトとして取り込まれます。
f:id:bluebirdofoz:20170821005814j:plain

Blender 上での見た目と同じようにするためには頂点カラーを表現する必要があります。
以下の記事を参考に頂点シェーダを作成します。
nn-hokuson.hatenablog.com

記事にある VertexColor.shader を作成し、マテリアルに反映すると以下の通り、色が付きました。
f:id:bluebirdofoz:20170821005834j:plain

Hierarchy に配置すると、以下のようにシーン上で確認できます。
f:id:bluebirdofoz:20170821005846j:plain

しかし、よくよく見るとポリゴンがおかしいですね。
どうも面の裏表が正しくないため、一部カラーが描画されていない部分があるようです。
以下を参考にシェーダを変更し、裏表どちらでもカラーが描画されるようにします。
nn-hokuson.hatenablog.com

カリングについて以前、空間に窓を作るシェーダを作成するときに学びました。それを利用します。
VertexColor.shader のコードは以下のようになります。

Shader "Custom/VertexColor" {
  SubShader{
    Tags{ "RenderType" = "Opaque" }
    LOD 200
    Cull off
    CGPROGRAM
#pragma surface surf Lambert vertex:vert
#pragma target 3.0
    struct Input {
    float4 vertColor;
  };
  void vert(inout appdata_full v, out Input o) {
    UNITY_INITIALIZE_OUTPUT(Input, o);
    o.vertColor = v.color;
  }
  void surf(Input IN, inout SurfaceOutput o) {
    o.Albedo = IN.vertColor.rgb;
  }
  ENDCG
}
FallBack "Diffuse"
}

シェーダを反映すると、以下のようにカラーが表示されました。
f:id:bluebirdofoz:20170821005906j:plain

ジオメトリデータの Unity への取り込みはこれで成功です。