3Dモデルをいろいろ作ってみたい

3Dモデルをいろいろ作ろうとがんばっています。苦労した点、役に立ちそうな情報を発信していきます。

vedo libraryを使って3DのViewerを作ってみた

IM-NETを使った3Dモデルの生成の可能性が確認できたところで、さらに手法をいろいろ試すためにはGUIを持ったテストベッドを用意したいと思うようになりました。まず欲しい機能としては以下の2種類の3Dデータ:

  1. ボクセルデータ(NxNxNの格子の点の有無で形を表現する、Pixelの3D版)
  2. サーフェスデータ(頂点と面の集合で形を表現する)

の表示機能です。

ボクセルデータは今までmatplotlibを使った自作プログラムで表示していたのですが、Nが大きくなると「重い」、「遅い」で非常に使いにくい。サーフェスデータの表示はMeshLabなどの既存のツールを使って表示していたのですが、複数のモデルを同時に表示しての比較がやりにくい等細かい点で自分の使い方に合わないところがあります。

じゃあ、ちょっとしたViewerを自分で作ろうか、3Dゲーム用のライブラリのPygletを使えばすぐにできるんじゃないか、と思ったのですが試してみると意外と難しい。こちらが期待するとおりの見え方にするためには投影変換(レンズの選定に相当)とビューイング変換(カメラの位置に相当)の設定を(どちらかというと低レベルの)OpenGLの機能を呼び出して行わなければならない。さらにサーフェスデータの表示(レンダリング)のためには頂点と面の情報だけでなく、各頂点ごとの法線ベクトルを呼び出し側で計算して供給してあげないといけない(無しで表示すると影がなく同じ色で塗りつぶされた全く立体感のない表示になる)。法線ベクトルの計算はやればできるけど、objやplyといったファイルフォーマットごとに頂点と面の情報を抜き出して法線を計算するコードを書くのはいかにもめんどくさい。

結局、解答として見つけたのはvedoというライブラリです。EMBL(European Molecular Biology Laboratory)という欧州19か国の出資で1974に創設された分子生物学の研究所が公開しているライブラリです。" python module for scientific analysis and visualization of эd objects"ということで研究者が自分たちで使うために作ったのではないかと推察しています。Anacondaとpipの両方でインストールできることになっていますが、私の環境ではconda installコマンドではインストールに失敗するためpipでインストールしました。

日本語のドキュメントは見つけられなかったけどapiのマニュアルと豊富なサンプルプログラムが提供されているので見よう見まねで何となくやりたいことをプログラムすることができました。PyQTと組み合わせることもできるので、ボタンや表示用のウィジェットを配置して以下のような簡易viewerを作ってみました。

f:id:ichidaya:20220118224923j:plain

vedoを使った簡易viewerの画面

ボクセルデータはnumpyファイルを読み込み後、legosurface()というメソッドでレゴブロックが並んだような形状のサーフェスデータを作って表示しています。