Swampdog part22 -ポリゴン数削減-

はじめに

前回、Raycastで視線を当てた部位の名称を取得できるようになりました。

次はラベルをAir Tapしたら詳細画面が出るようにしたい、のですがその前に久しぶりにOsiriXを触って肺と心臓をざっくり取ってきました。

後ほど骨と臓器の表示切替などを行うのでそれ用と、あとは8/22にデモがあるので骨だけだとさみしいので見栄えよくするためです。

 

肺、心臓の3Dモデル作成

CTから骨を取ってくるのは大変でしたが、おかげで今回はスムーズにできました。

もちろん、3Dモデルは改めてきれいなものを作成します。今回は動作確認用のものです。

肺葉や心室の分割もしていないのでほんとにざっくりです。

肺に気管とかくっついてすらいる始末。

 

心臓はボリュームレンダリングを駆使しました。

詳しい方法は「OsiriX画像処理パーフェクトガイド」が大いに参考になりました。

 

取ってきたのがこちら。テクスチャを設定していないのでまっしろ。

 

そしてちょっと困ったことに、心臓や肺は骨と違って複数のメッシュで構成されています。

 

オレンジの枠が1つ1つのメッシュです。画面横軸で分断されていることがわかります。

 

肋骨なんかはこんな感じで1つのメッシュで構成されています。

 

ここでメッシュだのマテリアルだのについて復習。

 

メッシュとは

メッシュは立体を三角形や四角形の集まりで表現したものです。

要するに莫大な情報を持った現実の物体を近似したものです。

 

下の画像は丸みを帯びたイルカを、三角形のメッシュで表現したものです。

荒くなりますが、情報量が圧倒的に少なくて済みます。

(曲線を完全に再現しようとするなら無限の点の情報が必要だが、メッシュにすれば三角形の頂点の分だけ済む)

出展: Wikipedia | ポリゴンメッシュ

 

マテリアルとは

オブジェクトの形はメッシュで表現されました。

マテリアルは、オブジェクトの見た目を担います。

つまり先ほどのイルカのメッシュに、何色をどんな風に当てるかというのがマテリアルです。

 

 

話を戻します。

要するに何が問題かというと、前回メッシュの本体(下図grp9)にコライダーを設定し、そのメッシュの親オブジェクトである入れ物(下図肋骨r11)に部位の名称を設定しました。

心臓の方では複数のメッシュをまとめるために一つ余分なオブジェクト(下図grp9)が挟まれているので困るのです。(心臓にカーソルを当てたとき、ラベルに「grp9」と表示されてしまう。)

 

というわけで、メッシュを1つにまとめる方法を探します。

余談ですが実は胸のことをChestって言ってるのめっちゃダサい。

医学用語だとthoraxですかね。

thoracic xxxと形容詞ではよく見たけど、自信なかったのでchestってつけてしまいました。

早いとこカラーアトラス購入して解剖学も勉強しなおさないといけない。。。

 

Unity上でメッシュを結合できるか調査

調べると処理の軽減という文脈でオブジェクトやメッシュの結合の話がいくつかでてきました。

スクリプトで処理する段階で結合して扱うというものはありましたが、

 

実際に結合したメッシュをつくるようなものは有料のアセットしか見つかりませんでした。

 

わざわざ有料のものがあるということは基本機能の範囲内ではできないんだろうと断念。

Unity外での結合を調査します。

OsiriXでobjファイル吐き出すときの設定でいじれたりしないのか、とも思いますが手元にMacがないので帰ったら調べよう。

 

Unityにobjファイルをインポートする際の挙動

とか思いながら調べていると気になる記事を発見。

fbx形式だと大きすぎる場合自動で分割されるとのこと。

 

objファイルでも大きすぎてUnity側で勝手に分割されているというのはありえますね。

元ファイルの心臓.objを開いてみます。

WindowsのView 3Dというソフトがサジェストされる。

分割されているようには見えないですね。Unity側で分割された可能性が有力になってきました。

 

その場合、ポリゴン数がカギになるのでUnityにインポートする前にメッシュを荒くしてポリゴン数減らすなどの工夫が必要になりそうです。

といっても基本的にバラバラにして3Dモデルにする予定なのであまり気にしなくてもいいかも。

今回は心臓、肺という大きな括りで3Dモデルにしましたが実際には心室、肺葉で分けてカーソルを当てたときに名前を出したいので。

 

しかし心室って内側の空間のことであって、外側からの見た目で名前を付けていいべきものか、とも考えたり。

そう考えると外部から見たときは「心臓」とひとまとめで表示して、さらに心臓をタップすることで詳細な断面図が表示されてそこで改めて心房・心室などを表示した方がいいのかな。とか。

 

全身解剖の3Dモデルで詳細を見たい部分をタップするとシームレスに詳細画面に移行するとかできたら使い勝手がよい。技術力がいりますが。

 

Mayaでobjファイルを確認

話を戻します。

Mayaをインストールしてobjファイルを確認します。

メッシュが分割されているかどうか。

「ファイル -> 読み込み」からobjファイルを選択しますが、

 

が、なにやらエラーが出て開けず。

なんか文字化けしているし。

00:00:00 736MB WARNING | node “MayaMultiplyDivide” is already installed
00:00:00 736MB WARNING | node “MayaClamp” is already installed
00:00:00 736MB WARNING | node “MayaGammaCorrect” is already installed
00:00:00 736MB WARNING | node “MayaCondition” is already installed
00:00:00 736MB WARNING | node “MayaReverse” is already installed
OBJ ファイルの 4214 行目の頂点法線インデックス 16727 は不ウです

 

調べても原因不明なので後で詳しい人に聞きます。

ちなみに、Mayaを使ったメッシュの統合の参考として以下リンクを残しておきます。

 

MeshLabでobjファイルを確認

そういえばMeshLabというソフトウェアの話も聞いたことがあったので試してみます。

公式からダウンロード、インストール。

開けました。

 

特にメッシュが分割されているようには見えないですね。

Unity側で分割されたというのがもっともらしい気がします。

もし分割がポリゴン数に依存しているなら、MeshLab上でポリゴン数を減らせば(メッシュを荒くすれば)解決できるかも?

ちなみに上の肺の画像の画面下部、Facesというところがメッシュ数らしいです。

 

MeshLabでポリゴン数を削減

「Filters -> Remeshing, Simplification and Reconstruction -> Simplification : Quadric Edge Collapse Decimation」を選択します。

 

「Target number of faces」か「Percentage reduction」で絶対値か相対値でポリゴンの削減を行えます。

 

 

fbxでの上限65534を「Target number of faces」に入力します。

「Apply」します。

左がbefore、右がafterあまり違いは感じません。

 

さっそくこれを保存します。

「Files -> Export Mesh As」で保存画面を開き、「Files of type」からobjを選択します。

適当な名前を付けて保存。

 

これをUnityにインポートしてチェックします。

左が元の心臓、右がポリゴン数を減らした心臓です。

メッシュが分割されず1つのメッシュとなっていることがわかります。

メッシュ名が変わってしまっていますが、そこは問題なしです。

 

これにて解決。

肺も同様にしてポリゴン数を減らします。

 

ちなみに、肺のポリゴン数を65535にしたらメッシュが分割されました。

肺オブジェクトの端っこ(というか気管)だけちょびっとオレンジで選択されているのがわかります。

 

結論、Unityにobjファイルをインポートするときはポリゴン数が65535以上になると勝手にメッシュを分割されるということがわかりました。

(何かしら確認ダイアログを出して欲しかった。)

 

ポリゴンの軽量化はいずれクリアすべき課題としていたので、MeshLabの機能を確認できたのはよかったです。

コライダーを設定して、Buildして実機で確認。

 

やれやれ。とおもいきや。

肺、心臓のラベルも取得できているのですが、謎の白い線が。。。

 

 

確認したところMeshLabの段階で出現してました。

やり直したら消えました。なんだったんだろうか。

 

次回

「ラベルタップで詳細説明を表示」という機能を先にやるつもりでしたが、

折角、骨・肺・心臓と用意できたので個別に表示できるようにしてみたいです。

「骨だけ表示」とか「骨と心臓合わせて表示」とか、自由に選択できるような感じで。

もう一つオブジェクトの操作機能も付けたいので、

  • ラベルタップで詳細説明ウィンドウ表示機能
  • 個別に表示非表示選択機能
  • オブジェクト操作機能

 

のいずれかを実装します。

8/22のSummer Fouders Program中間発表で見る人をおおっと言わせたいですね。

コメントを残す