- ARToolKit によるマルチマーカの考察 日付 2011年1月24日 阪南大学 経営情報学部 経営情報学科 5107171 筒井 亮 5107283 山岡大介 1 目次 第1章 拡張現実感(AR: Augmented reality)~はじめに~ ................................ 3 第2章 関連研究 ....................................................................................................... 4 第3章 ARToolKit の概要 ........................................................................................ 6 第4章 プログラムの構成 ......................................................................................... 7 Main() ................................................................................. 7 第1節 メイン関数 第2節 メインループ関数 第3節 オブジェクト描画関数 第4節 キーボード入力処理関数 第5節 マウス入力処理関数 第6節 終了処理関数 MainLoop()............................................................. 10 DrawObject() .................................................. 14 KeyEvent() .................................................. 16 MouseEvent() ..................................................... 16 Cleanup()....................................................................... 17 作成した 3DCG モデルの応用 .................................................................... 18 第5章 第1節 3DCG モデルの作成 Metasequoia ........................................................ 18 第2節 GLMetaseq の関数 ................................................................................. 18 第3節 モーションの連番 MQO 出力 ................................................................. 20 第6章 複数のマーカを利用した AR アプリケーション ...................................... ..22 第1節 構造体 .................................................................................................... 22 第2節 パターンファイルのロード ..................................................................... 23 第3節 マーカの信頼度の比較 ............................................................................ 23 第4節 3DCG とマーカの役割 ........................................................................ 24 第7章 まとめ ......................................................................................................... 28 参考文献 .................................................................................................................... 29 謝辞 ........................................................................................................................... 29 2 第1章 拡張現実感(AR:Augmented reality) ~はじめに~ 2007年前後から、拡張現実感技術を利用した新たなサービスに大きな注目が集まって いる。拡張現実感技術はディジタル情報を現実の世界に融合させることにより、新しいユー ザインタフェースを構築し、作業支援や情報提示に役立てることを目的としている。現在、拡 張現実感を利用した技術が医療・教育・建築・観光・エンタテイメントなどのさまざまな分野で の応用が期待されている。 まず AR とは、実環境の上にバーチャル環境を重畳する概念である。AR は実環境に対 し空間的整合性を保ちつつ、実時間でシームレスに情報を重畳提示する点が従来の位置 情報システムとの違いとなっている。 拡張現実感(Augmented reality)とは、仮想現実感(virtual reality)から派生した比較 的新しい研究領域で、実世界の映像に仮想的な物体の映像を重ね合わせるという発想に由 来している。カーナビゲーションシステムは、実世界における現在位置と地図上の現在位置 の間に常に関連を持たせ、現在位置とユーザーの目的に関連のある情報を提示することが できる。このようなシステムは、実世界を情報的に拡張しているという意味で一種の拡張現実 と言える。 拡張現実感をアプリケーションの側面からみると、その最も一般的な適用場面はユーザ の実世界でのタスク遂行を支援するというものである。例えば、仮想物体を実物体上に重畳 表示することによって組み立て作業、医療活動、メンテナンス作業を支援するシステムをあげ ることができる。 本論文では、ARToolKit を使ったアプリケーションを開発するために ARToolKit Home page[1]で配布されているC言語ライブラリ郡を扱うこととする。また、3DCG 作成ソフトで自 作のモデルを作り、技術的に応用した物の作成を試みる。 図 1-1 拡張現実モデル 3 第2章 関連研究 ま ず , 拡 張 現 実 の 実 際 の 利 用 例 を 示 す 。 自 動 車 メ ー カ ー の BMW ( Bayerische Motoren Werke AG)は、広告・販促活動の一環としてマーカの描かれたパンフレットなど をカメラにかざすと、車両の CG モデルを描画するウェブサイトを提供している[2]。単にウェ ブコンテンツとして AR ネタを見せるだけでなく、実際の BMW が「走り」でペイントする TV -CM(図 2-1 参照)の放映もしている。TOYOTA UK も IQ の広告・販促活動の一環として、 マーカ上に車両の3D モデルを重畳させるアプリケーション「Toyota IQ MagicSymbol」 を配布している。マーカの傾きを変化させることで走行状態の制御や、車両の内臓構造の確 認を行うことが可能となっている[3]。 図 2-1 BMW プロモーション映像. さらに、拡張現実の発展として、カメラと位置・姿勢センサーを搭載した携帯電話の普及に より、携帯型情報端末を用いた AR サービスの可能性が注目されている。2009 年9月から 「頓智ドット」が実環境の地理情報に対応したタグをカメラ映像に重畳する「セカイカメラ」が提 供されている[4]。iPhone のカメラ機能を使って撮影した場所の位置情報を取得し、ディス プレイに表示された対象にエアタグと呼ばれる付加情報を重ねて表示させるアプリケーショ ンである。エアタグはユーザが自由に貼り付けることができ、コンビニやファストフード店もエ アタグで見れる。セカイカメラは米国で開催されたネット・サービスのビジネス・コンテスト 「TechCrunch50」で発表され、米アップルの iPhone と AR を組み合わせたサービス像が 話題を集めた。iPhone アプリで最も注目されている AR アプリである。 図 2-2 セカイカメラ起動画面 4 そして、iPhone などのスマートフォン以外でも国内3キャリアの携帯電話で楽しめる AR ア プリ「AR3DPlayer」が登場した[5]。マーカの中に QR コードが含まれており、マーカを読み 取るだけでプロモーションのコンテンツのダウンロードができる。そのためマーカに対応した AR コンテンツをダウンロードする必要がなく利用できるので雑誌などで配布されている QR コード入りのマーカを読み込むことでスムーズに利用出来るのが特徴である。これは、プロ モーション媒体として活用が注目されている。 図 2-3 AR3DPlayer のマーカと動作例[6] 5 第3章 ARToolKit の概要 拡張現実感技術とは、Myron Krueger 氏が 1973 年に提唱した概念であり、現実の環 境から受ける知覚情報にコンピュータによって作り出された情報を重ね合わせることによって、 現実世界の情報を強化する技術である。日常私たちが感じている現実感とは、目や耳、鼻、 口などの感覚器に与えられる刺激を脳の中で処理し感じ取っている。つまり、その刺激を擬 似的に作り出して知覚器に与えることによって、存在しないものをあたかもそこにあるかのよう に実感し、体験することが出来るのである。 本章で扱う ARToolKit とは、奈良先端科学技術大学院大学の加藤博一教授が開発した C/C++言語用のプログラミングライブラリである。ARToolKit を使うことで、紙に印刷されたマ ーカをカメラで読み込み、位置、姿勢、座標などを計算してその上に3Dオブジェクトを描画 する(図 3-1 参照)ためのライブラリである。 ARToolKit が提供している主な機能は、カメラからの画像取得、マーカの検出とパターン の認識、マーカの3次元位置と姿勢の計測、実写画像の3次元CGの合成表示である。また、 カメラ画像の描画や仮想空間における視点の設定には GLUT(OpenGL Utility Toolkit) を用いている。これは 1994 年にSGI(シリコングラフィックス)社のマーク・ギルガード氏によ って開発 OpenGL の補助ライブラリであり、OSをシステムレベルで I/O を制御しているため、 OSに依存せずに描画できることが特徴である。[email protected][7]で配布されている補助 ライブラリ郡を利用する。 図 3-1 ARToolKit 起動画面 6 第4章 ARToolKit の内部構造 このプログラムは、登録しているマーカを Web カメラで撮影することでマーカの位置や姿 勢を計算し、あたかもそこにあるかのように3DCG を表示させるものである。本章では、青い 立方体を表示させるプログラムの流れ(図 4-1 参照)を説明していく。また ARToolKit のコマ ンドは arVideoOpen や arVideoInqSize などの先頭に「ar」がついて始まる。これらの先頭 文字列から定義されているヘッダーファイルを推測することが可能である。また、OpenGL の コマンドも「gl」、「glut」などの先頭文字列で始まるコマンドが用意されている。 図 4-1 ARToolKit のプログラム全体像[8] 第1節 メイン関数 Main() メイン関数では、ARToolKit を扱うための OpenGL やビデオデバイス、ウィンドウ設定 などの初期化処理とメインループ関数の呼び出しを行っている。初期化関数である Init() 7 関数を用いてコマンドを分けている場合もあるが、本プログラムでは Main()関数ですべて の初期化を行うことにする。以下にプログラムの説明を行う. int main( int argc, char **argv ) { ARParam cparam; // カメラパラメータ ARParam wparam; // カメラパラメータ(作業用変数) int xsize, ysize; // 画像サイズ // GLUT の初期化 ← (1) glutInit( &argc, argv ); // ビデオデバイスの設定 ←(2) if ( arVideoOpen( vconf_name ) < 0 ) { printf("ビデオデバイスのエラー"); return -1; } // カメラパラメータの設定 ←(3) if ( arVideoInqSize( &xsize, &ysize ) < 0 ) { printf("画像サイズを取得できませんでした\n"); return -1; } if ( arParamLoad( cparam_name, 1, &wparam ) < 0 ) { printf("カメラパラメータの読み込みに失敗しました\n"); return -1; } arParamChangeSize( &wparam, xsize, ysize, &cparam ); arInitCparam( &cparam ); // パターンファイルのロード ←(4) if ( (patt_id = arLoadPatt(patt_name)) < 0 ) { printf("パターンファイルの読み込みに失敗しました\n"); return -1; } // ウィンドウの設定 ←(5) argInit( &cparam, 1.0, 0, 2, 1, 0 ); // ビデオキャプチャの開始 ←(6) arVideoCapStart(); // メインループの開始 argMainLoop( MouseEvent, KeyEvent, MainLoop ); return 0; (1)GLUT の初期化 ARtoolKit ライブラリと、このプログラムにおいて GLUT のコードを使用している ので最初に GLUT の初期化を行う必要があるので glutInit()関数を実行する。ま た、この関数は初期化関数なので OpenGL や glut などの他の関数よりも先に呼び 出すことが前提である。 (2)ビデオデバイスの設定 arVideoOpen() 関数によってビデオデバイスなどの USB カメラを使える状態に 設定する。引数には、ビデオデバイスの設定ファイルの名前を指定する。本プログラ 8 ムでは、設定ファイルには WDM_camera_para_flipV.xml という xml ファイルから 読み込んでいる。この xml ファイルには、ビデオデバイス名の設定を行うことが可能 で初期の状態でエラーが発生した場合は名前を指定する。ビデオデバイスの設定に 失敗した場合は ARToolKit が起動できないのでプラグラムが終了する。 (3)カメラパラメータの設定 ここでは以下の処理を行っている。 ①画像サイズの取得(arVIdeoInqSize()) ②カメラパラメータファイルの読み込み(arParmLoad()) ③解像度に合わせてカメラパラメータの変更(arParamChengeSize()) ④カメラパラメータを内部の変数にロード(arInitCParam()) カメラパラメータの設定には使用するカメラの解像度によってカメラパラメータの変 更が必要なため、ファイルから値を読み込んで内部変数にセットする前に値の変更 を行っている。 (4)パターンファイルのロード マーカの認識に用いるパターン情報をパターンファイル(.patt)から読み込んで、パ ターンごとに ID を割り当てる。これらの 80mm×80mm のマーカ(図 4-2 参照)を自 作し、それを USB カメラを通してコンピュータにパターンファイルとして記録させるこ とでマーカを自由に変更することが可能である。 図 4-2 [hiro] マーカ arLoadPatt()関数を使って、ファイルから読み込んだパターン情報を ARtoolkit の内部変数に格納してから ID を生成する。ここで設定された ID を使ってマーカを 識別している。 (5)ウィンドウの設定 argInit()は ARToolKit のグラフィック処理機能の初期化を行う関数でウィンドウに 関する設定も行っている。argInit()関数には cparam のカメラパラメータを格納した 変数へのポインである。zoom の入力画像のサイズ又は表示サイズの拡大率、 fullFlag のフルスクリーンモードの有無、xwin の横方向の表示領域の追加数、 9 ywin の縦方向の表示領域の追加数、hmd_flag のステレオディスプレイモードの有 無などの引数が用意されている。フルスクリーン表示を行いたい場合は zoom と fullFlag を変更する必要がある。xwin と ywin は、ウィンドウ内に複数の表示領域 を設けたいときに使う。本プログラムでは zoom に 1.0、fullFlag に0、xwin に2、 ywin に1と設定している。これはメインのウィンドウの下に2つ表示領域を設けること を表している。 (6)ビデオキャプチャの開始とメインループのスタート 各種設定が済んだら arVideoCapStart()関数によってビデオキャプチャを開始さ せ、argMainLoop()関数を呼ぶ。argMainLoop()関数はマウス入力処理関数、キ ーボード入力処理関数、メインループ関数の登録を行い、メインループをスタートさ せる関数である。 第2節 メインループ関数 MainLoop() ここでは毎フレームに行う処理を書いている。1秒間に表示するフレーム数を計算する処 理も行う。また、終了処理が実行するまでメインループ関数は延々と繰り返して実行される。 以下にプログラムの説明をする。 void MainLoop(void) { ARUint8 ARMarkerInfo int int *image; *marker_info; marker_num; j, k; // カメラ画像の取得 ←(1) if ( (image = arVideoGetImage()) == NULL ) { arUtilSleep( 2 ); return; } // カメラ画像の描画 ←(2) argDrawMode2D(); // 入力画像の描画 argDispImage( image, 0, 0 ); argDispImage( image, 1, 1 ); // 内部画像の描画 if (arDebug && arImage != NULL ) { argDispImage( arImage, 2, 1 ); } // マーカの検出と認識 ←(3) if ( arDetectMarker( image, thresh, &marker_info, &marker_num ) < 0 ) { Cleanup(); exit(0); } // 次の画像のキャプチャ指示 ←(4) arVideoCapNext(); // マーカの信頼度の比較 ←(5) k = -1; 10 for( j = 0; j < marker_num; j++ ) { if ( patt_id == marker_info[j].id ) { if ( k == -1 ) k = j; else if ( marker_info[k].cf < marker_info[j].cf ) k = j; } } if ( k != -1 ) { // マーカの位置・姿勢(座標変換行列)の計算 ←(6) arGetTransMat( &marker_info[k], patt_center, patt_width, patt_trans ); // 3D オブジェクトの描画 DrawObject(); } // バッファの内容を画面に表示 ←(7) argSwapBuffers(); } (1)カメラ画像の取得 arVideoGetImage()関数によってビデオデバイスから画像を取得し、画像データ へのポインタである image に返す。ここで使う image は、ARUint8 という unsigned char 型と同義のオリジナルのポインタ型を使っている。取得した画像は arVideoCapNext()または、ビデオデバイス終了処理が実行されるまでバッファに保 持される。もし、画像が準備されていなければ NULL を返して、arUtilSleep()を実 行して休止時間をおいてから一度メインループを抜ける。これは、画像データが準備 できていないと以後の処理を行えないためである。 (2)カメラ画像の描画 AR アプリケーションでは、カメラ画像を描画した後で3D オブジェクトを重ねて描 画している。カメラ画像を描画するには、まず argDrawMode2D()という関数によっ て2次元画像を描画するための準備をした後で、argDispImage()関数を使って画 像を描画する。これらの関数は3D オブジェクトを描画する前に実行する必要がある。 argDispImage()関数の引数 xwin と ywin は、メイン関数のウィンドウ設定の際に 値を入れたものである。ウィンドウ内に複数の表示領域を設けたい際に、描画する場 所を指定するために使う。メインの表示領域の下に2つ領域を設けたい場合は xwin に 2、ywin に 1 を入れることで表示することが可能である。本プログラムでは、右下 にデバッグ用のモノクロでマーカをどのように表示しているかを確認する領域と左下 にユーザー視点である 3DCG が見えない領域を用意する(図 4-3 を参照)。 11 図 4-3 デバッグ画面 (3)マーカの検出と認識 ARToolkit では、画像をモノクロ化してからマーカの候補領域を探している。引数 thresh は画像をモノクロ化する際の閾値である。ウィンドウの右下に表示しているの がこの結果である。arDetectMarker()関数はカメラ画像の中からマーカを見つけ、 そのマーカのパターンを認識する関数である。キャプチャ画像に含まれるすべての マーカらしき部分を取得し、その情報を構造体である ARMarkerInfo 型に格納して いる。 marker_num は検出したマーカらしき部分の数を示している。以下に表示 するメンバをもとに一致度を比較することになる。 typedef struct{ int int int double double double double } ARMarkerInfo; area; id; dir; cf; pos[2]; line[4][3]; vertex[4][2]; //マーカのピクセル数 //マーカID //マーカの回転方向(3:↑, 2:→, 1:↓, 0:←) //相関係数 //マーカの中心 //枠線 //マーカの頂点座標 (4)次の画像のキャプチャ指示 取得した画像について、画像の描画とマーカの検出処理が終わったら、次の画像 を出す必要があるので、次フレームのキャプチャを指示するために arVideoCapNext()という関数を使う。これは arVideoImage()関数を実行してから arVideoCapNext()関数を実行するまで取得したデータが維持されるので、それま でにマーカの検出処理を終了させる必要がある。 12 (5)マーカの信頼度の比較 マーカとして検出される領域の中にはマーカではない領域(誤検出)も含まれる。 マーカごとに対応したオブジェクトを正しく表示するためには、検出されたマーカの 中から、指定のパターン ID を持ち、かつ最も高い信頼度を持つものを探し出す必 要がある。ここでは、検出したマーカらしき部分と以下に予め宣言してあるパターン ファイルとの比較を行う。 char int double double double *patt_name = "Data\\patt.hiro"; patt_id; width = 80; center[2] = { 0.0, 0.0 }; trans[3][4]; // // // // // パターンファイル名 パターンID パターンの幅(mm単位) パターンの中心座標 座標変換行列 (6)マーカの位置・姿勢の計算 ARToolKit 最大の仕掛けが arGetTransMat()という関数である。この関数では、 検出されたマーカの情報からマーカ・カメラ間の座標変換行列を求めている。 patt_center はマーカ上のどこに原点を置くかを決めるパラメータの役割をする。値 はミリメートル単位で指定し、マーカの中央に原点を置きたい場合は、以下のように 指定する。 double center[2] = {0.0,0.0}; 原点をずらして右上を原点にして3DCG を表示させたい場合はそれぞれの座標を4.0 にパラメータを設定することで座標をずらして原点を置くことが可能である。 patt_width はマーカのサイズで、マーカの一辺の長さをミリメートル単位で設定す る。この値を正しく設定しないと、実世界における長さの単位と、表示させた3DCG の長さの単位が一致しないので注意が必要である。 patt_trans[3][4]ではマーカ座標系からカメラ座標系への座標変換行列で計算さ れた結果を格納している。これらのマーカやカメラの位置、姿勢を計算してから3D オブジェクトを表示している。 図 4-4 座標変換行列[9] (Xc , Yc , Zc , 1)はカメラ座標系を、(Xm , Ym , Zm , 1)にはマーカ座標系、R3*3 に回転要素、T3*1 に平行移動要素を示している(図 4-4 参照)。これらのように ARToolKit で求められた座標変換行列を用いてマーカ座標にカメラ座標を変換(図 13 4-5 参照)して、マーカの上に仮想物体を現実世界の映像に融合させて表示させる ことが可能になるのである。 図 4-5 カメラ座標とマーカ座標の関係 (7)バッファの内容を画面に表示 ARToolKit のグラフィックス処理系ではダブルバッファが使われており、画像や CG を連続で描画する際にちらつきが起きないようにするための仕組みがある。表画 面と裏画面という2つのバッファを用意して表画面を表示している間に裏画面に描画 し、表と裏を入れ替えることにより、描画の過程を表にださないようにするという考え 方がダブルバッファである。argSwapBuffers()関数が表画面と裏画面を入れ替える 役割をしている。 第3節オブジェクト描画関数 DrawObject() 以下にプログラムを示し、内容を説明する。 void DrawObject(void) { double gl_para[16]; // 3D オブジェクトを描画するための準備 ←(1) argDrawMode3D(); argDraw3dCamera( 0, 0 ); // 座標変換行列の適用 ←(2) argConvGlpara( patt_trans, gl_para ); glMatrixMode( GL_MODELVIEW ); glLoadMatrixd( gl_para ); // 3D オブジェクトの描画 ←(3) glTranslatef( dx, dy, dz ); //オブジェクトの移動 glRotatef( rot, 0.0, 0.0, 1.0 ); glRotatef( 90.0, 1.0, 0.0, 0.0 ); glTranslatef( 0.0, 0.0, 20.0 ); glColor3f( 0.0, 1.0, 0.0 ); glLineWidth( 3.0 ); glutWireTeapot( 40.0 ); } (1) 3D オブジェクトを描画するための準備 14 3 D オ ブ ジ ェ ク ト を 描 画 す る 前 に 、 argDrawMode3D() 関 数 と argDraw3dCamera()関数を実行する必要がある。argDrawMode3D()は、3次 元空間における座標系の状態を保存している OpenGL の行列を初期化する関数 である。argDraw3dCamera()は、カメラパラメータに基づいて仮想空間における 視野の範囲を決めて撮影する仮想カメラの射影変換の設定を行う関数である。 (2) 座標変換行列の適用 AR アプリケーションでは、座標変換行列を ARToolKit 形式から OpenGL 形式 にフォーマットさせる必要があるので arGetTransMat()によって得られた座標変換 行列をモデルビュー行列に適応させて、以後の作業をマーカ座標系の上で行えるよ うにします。argConvGlpara( patt_trans, gl_para )は、ARToolKit 形式である arGetTransMat(&marker_info[k], patt_center, patt_width, patt_trans)で求 めた座標変換行列を OpenGL 形式に変換し、gl_para に格納する役割をしている。 glMatrixMode( GL_MODELVIEW )関数は、現在の座標変換行列をモデル ビューに変換してから glLoadMatrixd( gl_para )関数でマーカの中心を原点とす る座標系にすることで、以後の 3D オブジェクトの描画と操作は OpenGL の関数に よって行います。OpenGL の特徴は長さの単位を、実世界と同じミリメートル単位で 扱えることである。ただし、これを実現するためには、座標変換行列を計算する際に マーカの大きさが正しく設定されていることが前提である。 (3)3D オブジェクト描画 ここでは、オブジェクトの色や描画する図形の種類、線の太さなど様々な設定を OpenGL の命令を用いて行う。glColor3f( 1.0, 0.0 , 0.0)では赤色の 3D オブジェク トを描画する色を指定する命令である。パラメータは赤・緑・青の順に並んでいる。 glLineWidth()関数は線の太さをピクセル単位で指定するものである。また、初期値 は 1.0 になっている。これらの設定はオブジェクトを描画する前にあらかじめ行ってお く必要がある。OpenGL の補助ライブラリである GLUT には、立方体や球体、ティー ポットやそれらのワイヤーフレームなどの3D オブジェクトがあらかじめ関数として用意 されており、その関数を用いることで簡単にオブジェクトを表示することが可能である。 立方体の描画関数(glutSolidCube()、球体の描画関数(glutSolidSphere())、ティ ーポットの描画関数(glutSolidTeapot())など様々な関数が用意されている(図 4-6 参照)。他に平行移動関数(glTranslatef())、回転関数(glRotatef())、拡大・縮小 (glScalef())などを使って 3D オブジェクトに動きや変化を付加することが可能である。 15 図 4-6 3D オブジェクトの球体 第4節キーボード入力処理関数 KeyEvent() void KeyEvent( unsigned char key, int x, int y ) { // ESC キーを入力したらアプリケーション終了 if( key == 0x1b ){ Cleanup(); exit(0); //初期値へ } } キーボード入力処理関数はプログラムの初期化時に argMainLoop()関数で登録してい る関数である。本プログラムでは ESC キーを押すとプログラムを終了するように設定している。 第5節 マウス入力処理関数 MouseEvent() void MouseEvent(int button, int state, int x, int y) { //入力状態を表示 printf("ボタン:%d 状態:%d 座標:(x,y)=(%d,%d) \n", button, state, x, y); } マウス入力処理関数は画像を表示しているウィンドウをクリックしたときにこの関数が呼ば れる。引数 button には押されたボタンの種類、state にはボタンの状態、x,y にはマウスポ インタの座標値が渡される。クリック時のマウスポインタの x 座標と y 座標を表示させている 例を図 4-7 に示す。 16 図 4-7 マウスポインタの座標 第6節 終了処理関数 Cleanup() void Cleanup(void) { arVideoCapStop(); arVideoClose(); argCleanup(); } // ビデオキャプチャの停止 // ビデオデバイスの終了 // グラフィック処理の終了 終了処理関数では、ビデオキャプチャを停止・終了させ、グラフィック処理系の終了処理を 行う。arVideoCapStop()関数は arVideoCapStart()関数と対になっていてビデオキャプチ ャ処理はスタートさせたら必ずストップさせる必要がある。また、同様に arVideoClse()関数も arVideoOpen()関数と対になっており、Open したビデオデバイスは必ず Close させる。 17 第5章 作成した 3DCG モデルの応用 ARToolKit では OpenGL の補助ライブラリである GLUT で用意されている。3D オブジ ェクトだけでなく、自ら作成した 3DCG モデルを表示することも可能である。これを利用する ことにより 3DCG モデルに動きをつけてアニメーション表示させる。 第1節 3D モデル描画 Metasequoia(メタセコイア)でモデリングした MQO 形式の3DCG を ARToolKit 上で表 示する。まず、Metasequoia とは、Osamu Mizuno が開発した 3D ポリゴンモデラー(図 51 参照)である[10]。ポリゴンメッシュによる3DCG 作成に特化したソフトウェアである。データ の可変性を重視しており、様々なファイル形式で出力することが特徴である。ただし、 ARToolKit で利用するためには「メタセコイアオブジェクト(*mqo)」で保存する。 図 5-1 メタセコイアの起動画面 第2節 GLMetaseq 関数 Metasequoia で作成した MQO 形式の 3D モデルを ARToolKit のプログラムで表示 (図 5-2 参照)させるために用いるのが GLMetaseq 関数である。この GLMetaseq 関数は 工学ナビ[11]で配布している OpenGL で MQO ファイルを表示するための C/C++言語用 のライブラリである。これを用いることで自作の 3DCG モデルを簡単に拡張現実世界で表示 させることが可能である。 18 図 5-2 ARToolKit で表示させた自作 3DCG モデル (1)GLMetaseq の初期化 mqoInit(); これはプログラム開始時に行なう必要がある。初期化を行なう関数は mqoInit()で ある。また、mqoInit()関数はかならずウィンドウ設定の argInit()関数より後に行なう。 (2)モデルの読み込み if ((model = mqoCreateModel( mqo_name, 1.0)) == NULL ){ printf("モデル読み込み失敗\n"); } mqoCreateModel()関数を使って MQO ファイルからモデルデータの読み込みを 行なう。モデル情報を読み込みメモリに格納し、MQO_MODEL 型という GLMetaseq で定義されているオリジナルの型に値を返す。この中にはモデル情報を 格納している領域を保持しているのである。以後はこの値を使ってモデルの描画と削 除を行なっている。この関数の引数はモデルのファイル名と大きさを指しており、1.0 で当倍である。 (3)モデルの描画 glPushMatrix(); glRotatef( 90.0, 1.0, 0.0, 0.0 ); mqoCallModel( model ); glPopMatrix(); mqoCallModel()は読み込んだモデルを画面に描画する関数である。引数に MQO_MODEL 型の変数を指定している。Metasequoia の作成画面とは異なって おり Y 軸が上を向いているものを、ARToolKit ではマーカが Z 軸が上を向いてい るため、この関数を呼ぶ前に座標を X 軸まわりに90度回転させる必要がある。これ は glRotatef()で軸を調整している。 (4) モデルの削除 19 mqoDeleteModel( model ); 不要になったモデルを mqoDeleteModel()関数によって削除する。プログラムの 終了時に、ファイル読み込みを行なった全ての変数に対してモデルの削除を行なう 必要がある。また、モデルの削除を行なった変数に対して mqoCreateModel()関数 で新しいモデルを読み込むことも出来る。 (5) GLMetaseq の終了処理 mqoCleanup(); プログラムの終了時に GLMetaseq の終了処理も行なう必要があり、これを行なう 関数が mqoCleanup()である。これは mqoDeleteModel()でモデルの削除した後 に実行する。 第3節 モーションの連番 MQO 出力 Metasequoia で作成した3D モデルをアニメーションにして ARToolKit で表示する。ま ず3D モデルに動きをつけて連番にして出力するために RokDeBone2 ()というモーション 作成ソフト(図 5-3 参照)で生成する。このソフトウェアは MQO ファイルに動きを付けてパラ パラ漫画の要領でフレームごとに連番ファイルとして出力する「連番 MQO 出力」機能を利 用してアニメーションを作ることが出来る。 GLMetaseq では、MQO_SEQUENCE 型を使ってアニメーションを ARToolKit で表示 出来る。この型は、モデルとフレーム数を格納している。これは、1 節で作成した 3DCG の人 形にモーションをつけて表示させる。人形にはその場で手足を交互に動かさせて歩行をして いるように見せるモーションを付加することにする。 図 5-3 RokDeBorn の起動画面 (1)シーケンスの作成 MQO_SEQUENCE mqo_seq mqo_seq = mqoCreateSequence( seq_name, n_frame, 0.05 ); if( mqo_seq.n_frame <= 0 ){ printf("シーケンス読み込み失敗\n"); return -1; 20 } mqo_seq.now_frame = 0; printf("シーケンス作成完了\n"); 連番 MQO アニメーションを作るために MQO ファイルから生成したアニメーションをシ ーケンスとして扱い、mqoCreateSequence()関数を使って連番 MQO ファイルからシー ケンスを作成する。 seq_name には連番アニメーションのファイル、n_frame にはアニ メーションのフレーム数がそれぞれ格納されている。0.05 は、3DCG モデルの大きさを表 している。 (2)シーケンスの描画 Static int j = 0; mqoCallSequence(mqo_seq,j); j++; if( j >= n_frame ) j = 0; mqoCallSequence()関数を使ってアニメーションを描画させます。jには連番アニメー ションのシーケンスから表示させたいフレーム番号を表しており順に描画させている。フ レームの上限に達した場合jを0に戻して繰り返して、順番に描画する。 (3)シーケンスの削除 mqoDeletSequence( mqo_seq ); MQO_MODEL の時とどうように MQO_SEQUENCE でも削除用の関数があり、シーケ ンスを終了する場合には、mqoDeleteSequence()関数によってシーケンスの削除を行う。 21 第6章 マルチマーカの考察 本章では前述したプログラムを応用して複数の模様の違うマーカを使ってそれぞれの マーカに別々のコマンドとしての役割を与えて実験することが目的である。まず、3DCG は前章で使用したものを使うこととする。パターンファイルは図 6-1 から図 6-4 に示す 4 種 類を使うこととする。 図 6-1 hiro 図 6-2 kanji 図 6-3 sample1 図 6-4 sample2 これら4つにマーカには以下のコマンドを設定することにする。 ① [hiro]:マーカの上に 3DCG を表示させる。 ② [hito]:表示している 3DCG をキューブに変える。 ③ [sample1]:表示している 3D オブジェクトを回転させる。 ④ [sample2]:[hiro]マーカから[sample2]マーカ上まで 3D オブジェクトを移動させる。 第1節 構造体 これまでのマーカを1つだけ使う場合は、以下に記述してある5つの変数でパターンフ ァイルを管理している[13]。 char *patt_name int patt_id; double patt_trans[3][4]; double patt_center[2] double patt_width = "Data/patt.hiro"; //パターンID //座標変換行列 //パターン中心座標 //パターンサイズ ={ 0.0, 0.0 }; =80.0; しかし、複数のマーカを個別に識別して管理する必要があるため、これらを1つにまと めて以下に記述する構造体として管理する。 define PTT_NUM 4 // マーカの数 define PTT1_MARK_ID 0 define PTT1_PATT_NAME define PTT1_SIZE "Data\\patt.hiro" 80.0 //パターン.hiro define PTT2_MARK_ID 1 define PTT2_PATT_NAME define PTT2_SIZE "Data\\patt.kanji” 60.0 define PTT3_MARK_ID 2 define PTT3_PATT_NAME define PTT3_SIZE "Data\\patt.sample1" 60.0 //パターン.kanji //パターンsample1 22 define PTT4_MARK_ID 3 define PTT4_PATT_NAME define PTT4_SIZE typedef struct { char int int int double double double } PTT_T; //パターンsample2 "Data\\patt.sample2" 60.0 *patt_name; patt_id; mark_id; visible; width; center[2]; trans[3][4]; // // // // // // // パターンファイル名 パターンID マーカID 検出 パターンの幅 パターンの中心座標 座標変換行列 PTT_T object[PTT_NUM] = { {PTT1_PATT_NAME, -1, PTT1_MARK_ID, 0, PTT1_SIZE, {0.0,0.0}}, {PTT2_PATT_NAME, -1, PTT2_MARK_ID, 0, PTT2_SIZE, {0.0,0.0}}, {PTT3_PATT_NAME, -1, PTT3_MARK_ID, 0, PTT3_SIZE, {0.0,0.0}}, {PTT4_PATT_NAME, -1, PTT4_MARK_ID, 0, PTT4_SIZE, {0.0,0.0}} }; 1つのマーカで処理していた5つの変数で管理していたものに、mark_id と visible を 追加した。mark_id にはパターンファイルを識別するために PTT1_MARK_ID などに 格納した番号をそれぞれに与えるためのものである。visible は、パターンファイルごとに 見つかったマーカが一致するか一致しないかを表すために使う。 第2節 パターンファイルのロード マーカを複数個使うのでそれぞれのパターンファイルを PTT_NUM に登録された数だ け arLoadPatt()を実行するように書き換える。また、パターンファイルのロードに失敗した 場合はどのパターンファイルか特定するために読み込みに失敗したパターンファイルを表 示させる。 for (i = 0; i < PTT_NUM; i++){ if ( (object[i].patt_id = arLoadPatt(object[i].patt_name)) < 0 ) { printf("パターンファイルの読み込みに失敗しました: %s\n",object[i].patt_name); return -1; } } 第3節 マーカの信頼度の比較 これもパターンファイルのロードと同じで、PTT_NUMの値だけ繰り返す。Webカメラでキ ャプチャした画像に一致するパターンファイルが検出されなかった場合にはパターンファ イルごとに用意されているobject[i].visibleに 0 を入れて前の処理を繰り返す。 for (i = 0; i < PTT_NUM; i++){ k = -1; for( j = 0; j < marker_num; j++ ) { if ( object[i].patt_id == marker_info[j].id ) { if ( k == -1 ) k = j; else if ( marker_info[k].cf < marker_info[j].cf ) k = j; } 23 } if ( k == -1 ) { // 3Dオブジェクトの描画 object[i].visible = 0; continue; } 第4節 3Dオブジェクトとマーカの役割 本節では、マーカにそれぞれの役割を与えることでマーカにコマンドとしての意味を持 た せ る 。 一 致 す る パ タ ー ン フ ァ イ ル が あ っ た 場 合 、 arGetTransMat() が 実 行 さ れ object[i].visibleに1を入れる。 //座標変換行列取得 else{ arGetTransMat(&marker_info[k], object[i].center, object[i].width, object[i].trans); object[i].visible = 1; } } if(object[1].visible == 1) cube = 1; else cube = 0; if(object[2].visible == 1) exRz = exRz + 5.0; if (object[3].visible == 1){ //マーカ1の座標でカメラの位置を取得 arUtilMatInv(object[0].trans, wmat1); //マーカ2の座標でカメラの位置を取得 arUtilMatMul(wmat1, object[3].trans, wmat2); exTx = exTx + (wmat2[0][3] * 0.01); exTy = exTy + (wmat2[1][3] * 0.01); if(wmat2[0][3] > 0){ if(exTx >= wmat2[0][3]){ exTx = wmat2[0][3]; exTy = wmat2[1][3]; } }else{ if(exTx <= wmat2[0][3]){ exTx = wmat2[0][3]; exTy = wmat2[1][3]; } } }else{ exTx = 0.0; exTy = 0.0; } //オブジェクトを描画 if (object[0].visible == 1){ draw(object[0].trans); } 24 if (object[0].visible > 0 && object[3].visible > 0){ arUtilMatInv(object[0].trans, wmat1); arUtilMatMul(wmat1, object[3].trans, wmat2); printf("%5.3f %5.3f %5.3f\n", wmat2[0][3], wmat2[1][3], wmat2[2][3]); } ここでは以下の処理を行っている。 object[0].visible == 1 [hiro]を検出した時、マーカが一つの時と同じようにマーカの上 に 3DCGを表示する(図 6-5 参照)。 図 6-5 object[0] visible == 1 object[1].visible == 1 [kanji]を検出した時、3DCGを キューブに切り替える。もし visibleに 0 が入っていたら 3DCGを表示する(図 6-6 参照)。 図 6-6 object[0]・[1] visible == 1 object[2].visible == 1 [sample1]を検出した時、3DCGを回転させる。(図 6-7 参照) 25 図 6-7 object[0]・[2] visible == 1 object[3].visible == 1 [sample2]を検出した時、object[0].visibleでマーカの上に表示 された 3DCGをobject[3]のマーカに移動させる。マーカの上に着くと 3DCGはその位置 で停止する。(図 6-8 参照) 図 6-8 object[0]・[3] visible == 1 また、[sample2]マーカが表示されている間、[hiro]マーカから見た[sample2]マーカの 位置情報(図 6-9 参照)を表示する。これは、3DCGの移動する向きと距離を出すために wmatの配列を利用する。wmatから得た座標に近づけるための計算をしている。 26 図 6-9 2つのマーカ間の距離 上記 object[1]から[3]の動作は object[0]の[hiro]マーカを検出して 3DCG を表示させ ているときに限る。また、役割を設定した全てのマーカを検出した場合には全ての動作を 組み合わせた状態を表示する。つまり object[0]で 3DCG が表示され、object[1]で 3DCG がキューブとして表示され、object[2]で 3DCG を回転、object[3]で sample2 マーカの位置まで 3DCG を平行移動させる(図 6-10 参照)。 図 6-10 object[0]・[1]・[2]・[3] 27 visible == 1 第 7 章 まとめ ARToolKit のライブラリを利用して AR アプリケーションの開発を行ってきた。3DCG やマーカを工夫して利用することで様々な複雑な動きや改良が可能であることが分かった。 本論文では複数マーカを利用した AR アプリケーションの開発において構造体を使うこと で簡単にマーカごとのコマンドを設定することが出来た。また、コマンドを設定するにあ たって2つのマーカ間の位置関係を取得することで、マーカからマーカへの 3DCG の平 行移動を可能にした。これを利用して、マーカ間の位置関係を記録させて相対的な位置 関係にある複数のマーカを1つのマーカとして扱うマルチマーカにすることも可能だと思わ れる。また、もっと多くのコマンドとマーカ、3DCG モデルを用いることでカードゲームなど への利用も可能である。 これからの AR アプリケーションの開発において、パソコンと Web カメラでは利用出来る 場所が限られてしまうことで改良する幅が狭められてしまうことが問題である。今後の課題 としては、利用する場所が限定されない iPhone などのネットワークを利用した携帯端末 用の AR アプリケーション開発を目指す。 28 参考文献 [1]http://www.hitl.washington.edu/artoolkit/ [2]http://www.bmw.co.uk/bmwuk/augmented_reality/homepage?bcsource=vanity [3] http://www.iajapan.org/Review/pdf/IAJReviewVol9-3.pdf [4]http://sekaicamera.com/ [5]http://ar3d.jp/ [6] http://plusd.itmedia.co.jp/mobile/articles/1008/27/news027.html [7]http://www. xmission.com/~nate/glut.html [8]橋本 直:「ARToolKit 拡張現実感プログラミング入門」 発行所:株式会社アスキー・ メディアワークス,2008. [9] http://www.metro-cit.ac.jp/~yamasho/PDF/2010surika.pdf [10] http://www.metaseq.net/metaseq/index.html [11]http://kougaku-navi.net/ARToolKit.html#MakeModel [12] http://www5d.biglobe.ne.jp/~ochikko/ [13]谷尻豊寿:「ARToolKit プログラミングテクニック」発行所:株式会社 カットシステ ム,2008. 謝辞 研究を進めるにあたりプログラムの作成や開発環境の設定などで助言をいただいた花川 ゼミの高橋一氏に感謝します。 本論文を作成するにあたりご指導をいただいた、花川典子先生に感謝します。 29
© Copyright 2024 Paperzz