ARToolKit入門【処理の流れと座標変換行列】

artoolkit_trans

ARToolKitを使ったプログラミングの処理の流れと座標変換行列について紹介します。

ARToolKitの基本的な導入ですが、工学ナビさんのARToolKitを使った拡張現実感プログラミングがとても洗練されているので、ここであえて説明はしません。

工学ナビさんとはちょっと違った視点での入門講座を書きたいと思います。

ARToolKitの処理の流れ

まず、ARToolKitの基本的な流れについて説明します。

ARToolKit_flow

かなり大きく分けるとこんな感じです。 まず、画像をWEBカメラなどのビデオデバイスから取ってきます。 これに、マーカ処理(検出、認識、位置・姿勢計算など)を行います。 このマーカ処理によって得られたデータから3Dモデルを描画します。

この中で重要なのはマーカの処理です。
ARToolKit Frameworkを見るとわかるのですが、ARToolKitはモジュール設計(プログラムの機能ごとに部品みたいに分かれている設計)になっています。 ARToolKit標準のやり方でいけば、カメラ画像の取得・表示はARToolKitのビデオツール、3Dモデル描画はOpenGLを使いますが、これに関しては他のビデオキャプチャツールやDirectXで代用することもできます。(部品を取り換えるイメージです。)

ですが、マーカの処理に関してだけは、ARToolKitを必ず使います。(つまり、ここがARToolKitのメインとなる部分だと思ってください。)

要するに何が言いたいのかというと、このマーカの処理に関しての部分をいかに理解できるかでARToolKitの使いこなし具合が変わってきます。

マーカ処理の流れ

では、このマーカ処理の部分について詳しく見ていきましょう。

ARToolKit_flow2

マーカの検出は渡した画像から検出を行うarDetectMarker()という関数を使います。 マーカIDや一致度などの情報を含んだ構造体とマーカの数を返してくれます。

これを使って、マーカの一致度を比較します。 検出されたマーカの中から最も一致度の高いものを探します。 一致するマーカがなかったら、次の位置・姿勢計算を行わずに再度画像を取得して検出します。

そして、一致するマーカがあった場合は、一致したマーカの情報(マーカIDや一致度などの情報を含んだ構造体)を使って、マーカの位置・姿勢計算を行います。 これがARToolKitの目玉となるような機能になります。

座標変換行列

一致したマーカの情報から姿勢計算の結果得られるものが↓の座標変換行列になるのですが、これがどういう意味を表しているのかを詳しく解説します。

artoolkit_trans

まぁ、見ればわかる通りマーカ座標系をカメラ座標系に変換する行列が得られます。 3DCGの幾何変換を意識できてればなんてことはないのですが、ここを理解できてるかどうかで大きく変わるので詳しく説明します。

結論から言ってしまえば、この座標変換行列は「マーカ→ビュー変換行列」です。 「カメラから見たマーカの位置・姿勢」を示しています。

ここで、レンダリング時の3DCGの幾何変換について思いだしてみましょう。

3DCGの幾何変換

大体このような変換をたどって3DCGのモデルは描画されます。 スクリーン行列に関しては、3Dライブラリ(OpenGLやDirectX)でやってくれるので気にしなくていいとして、気にする必要があるのはその他3つの行列です。

射影行列に関しては、ARToolKitのキャリブレーションデータ(camera_para.dat)に入っているカメラパラメータを使って設定されます。 なぜ一意に決定されるかというと、射影行列というのは要するにカメラのレンズ設定のようなもの(ズームとか)だからです。 WEBカメラにズーム機能なんてないですよね。

問題はモデル座標からビュー座標への変換です。

ワールド座標系はいわば仮想世界です。 このワールド座標系にローカル座標系のモデルを配置します。 ワールド行列の中身としては、平行移動、回転、拡大縮小の行列が掛けられたものが入っています。

では、マーカ座標とはなんなのか考えてみます。 いくつかのマーカがあると考えましょう。 ↑のフローでいけばマーカ座標=ワールド座標となりそうですが、それだとワールド座標がいくつもあることになります。 本来の意味であれば、下の図のようにワールド座標というのは一つのはずです。 そこにカメラやモデルやライトが配置されるのですから。

world_image

これは言葉の捉え方の問題です。
語弊はあるかもしれませんが、ARToolKitの座標系にワールド座標系はありません。 あえて作るのならば、ワールド座標系はビュー座標系と同じになります。 ワールド座標系の原点(0, 0, 0)に無回転の状態でカメラが置いてある感じです。

つまり、カメラが世界の中心になります。

よって、↑のフローを書き変えると、↓みたいな感じになります。

artoolkit_coord_trans

このマーカ行列はマーカ座標を基準とした平行移動、回転、拡大縮小の行列が掛けられたものが入っています。 このフローのマーカ→ビュー座標変換(ビュー行列)に当たるのが、ARToolKitで得られる行列になります。 つまりはカメラから見たマーカの位置・姿勢です。

以上です。なんとなくですが、理解できましたでしょうか^^; わからなかったら、座標変換行列の働きについて調べるとわかるようになるかもしれません。 このようにしてレンダリングを行います。 詳しくはARToolKit Coordinate Systemsを参考にするといいと思います。

とりあえず、実際にプログラムを組んでいけば理解できると思います。

PAGE TOP

Twitter

    人気記事

    新着まとめ