ARToolKit基本プログラムで普通にCGモデルを描画することはできたと思います。
でも、静止画だとわかりませんが、実際実行してみるとCGの表示がガタガタしてしまう場合があると思います。 ある程度いい感じの距離で表示すれば気にならないのですが、カメラをマーカに近づけたり遠ざけたりすると顕著にわかると思います。
これはカメラがキャッチする光がそれほど安定していないからです。 微妙な誤差が生じているので、これによってマーカのエッジ検出に誤差が生じ、最終的には座標変換行列にも誤差が生じます。 これによってガタガタしてしまうのです。
こういう現象はセンサ関連でよく見られ、様々な安定化の方法がとられています。 ちなみにこの現象のことを「ジッタ」と言います。
このジッタを軽減するための処理をARToolKitの関数を使ってやります。
ソース構成 |
---|
|
ソースダウンロード |
ARTK_stabilization.zip |
使うマーカ |
|
プロジェクトの設定 |
プロジェクトの種類:Win32コンソールアプリケーション Debug時ライブラリ:libARd.lib libARgsubd.lib libARvideod.lib opengl32.lib glu32.lib glut32.lib Release時ライブラリ:libAR.lib libARgsub.lib libARvideo.lib opengl32.lib glu32.lib glut32.lib |
実行結果のイメージ |
ほとんどARToolKit基本プログラムのソースと同じです。 違うのはメインループ関数だけです。
static bool isFirstDetect = true; // 初回フラグARTK_stabilization.cpp(メインループ関数の中)
// マーカの位置・姿勢(座標変換行列)の計算 if( isFirstDetect ) { arGetTransMat( &marker_info[k], patt_center, patt_width, patt_trans ); } else { arGetTransMatCont( &marker_info[k], patt_trans, patt_center, patt_width, patt_trans ); } isFirstDetect = false; // 初回フラグ無効化
重要になってくるのはarGetTransMatCont関数です。
- double arGetTransMatCont (ARMarkerInfo *marker_info, double prev_conv[3][4],
double center[2], double width, double conv[3][4]) 【引数】
marker_info:マーカ情報を格納した変数へのポインタ
prev_conv:前回求めたマーカ→ビュー座標変換行列
center:マーカの原点位置(単位:mm)
width:マーカのサイズ(単位:mm)
conv:新しいマーカ→ビュー座標変換行列
この関数は前回求めた座標変換行列と今回のマーカ情報から、座標変換行列を生成する関数です。 前回の情報を使っているので、ジッタが軽減できるのです。 実際に何をやっているのか知りたい方は
ARToolKitルートディレクトリ/lib/SRC/AR/arGetTransMatCont.c
を見るといいと思います。
この前回の情報はどこから来るかというと、通常のarGetTransMat()を使います。
つまり、
1回目 → arGetTransMat()
2回目以降 → arGetTransMatCont()
という感じになります。 これを実現するためにあるのが、isFirstDetectによる分岐です。
これだけなので、実装しておくことをオススメします。