2012/01/25

マーカー検出計画2 3Dモデルをチェスボード上に表示

OpenGLで実寸表示できたので、今日は3次元モデルを表示する方法を探していました。
objファイル形式というものがいろいろなソフトでサポートしているようなので、objファイルを使うことにしました。
 OpenGLで遊ぼう6 -まとめ!- @毛の生えたようなものにobjファイルの取り込み方について書かれていたので、参考にして実装してみました。読み込ませる3次元モデルは、Blenderで作りました。Blenderはフリーの3次元モデリングソフトで、いろいろなプラットフォームで使えます。ダウンロードして使ってみましたが、機能が多すぎて使い方がよくわからず。その結果、なんだかよくわからない物体が出来上がりました。

Blenderで作った謎のモデル
glutのサンプルコード内に含まれている、glm.cというファイルにobjファイルを読み込んで描画する機能が実装されているので、モデルを渡して描画してもらいました。

glmを使ってobjファイルを描画
真っ黒になっていますが、謎モデルの形が画面上に出ています。
塗りつぶされているのは光源の設定がよくないからかもしれません。

glm.cとは別になりますが、OBJ2OPENGLというobjファイルをヘッダファイルに変換して、ソースコードに組み込めるようにするスクリプトもあるようです。こちらはOpenGL ES用もあるみたいです。


これまでのまとめ
  • OpenCVでカメラのキャリブレーションを行い、カメラの内部定数を求めた
  • OpenGLのProjectionMatrix にカメラの内部定数から計算した値を入れ、OpenGL上の座標をミリ単位で指定できるようになった( 参考:POSIT tutorial@OpenCVWiki
  • Blenderで作成した謎モデルをobjファイルにエクスポートして、GLUTに入っているglm.cを使ってOpenGLで描画した

参考資料
詳解OpenCV カメラキャリブレーションの章
コンピュータビジョン ピンホールカメラの章。高いけど詳しい本です。

OpenGLのProjection Matrix関係
POSIT tutorial@OpenCVWiki Projection Matrixを生成して、glLoadMatrixで読み込む方法。なぜこの数式になったのかの検証はまだしていません。
From Homography to OpenGL Modelview Matrix glFrustrumを使う方法。まだ試していません

今後の課題

  • カメラの内部定数からOpenGLのProjection Matrixを求めるところについてもう少し調べる
  • ソースコードが継ぎはぎ状態なので関数にまとめる
  • Blenderでパイプ椅子ぐらいは作れるようにする
  • OpenGLの光源について調べる


別館に、現時点でのソースコードをアップしておきました。ソースコード、今回使用しているチェスボードのPDF、謎の3Dモデル、カメラの内部定数ファイルを含めています。
ビルド環境はUbuntu 11.10 64bit と, Mac OS X 10.5.8です。OpenCVのバージョンは2.2を使用しています。

CGは難しいなぁ。

ではまた。



0 件のコメント:

コメントを投稿