公開日:2012/1/22 0:00:00

ARToolKitWrapper と ARBaseLib を用いた開発手順

ARToolKit professional for Android の開発手順やTipsの紹介

Section 2.3 マルチマーカー対応

About

ARSimpleのソースコードを修正して異なる複数のマーカーに反応して何かを表示するアプリケーションに書き換えます。

状態確認

ARSimpleプロジェクト内にassetsフォルダがあるのでその内部にpatt.hiropatt.kanjiがあることを確認して下さい。

ARSimple resource tree

配布ファイル内に下記のマーカーのPDFが含まれているのでそれを印刷して利用してください。 印刷できない場合はこの画面を利用しても良いでしょう。

Hiro Marker Kanji Marker

ソースコード修正

大半の処理はARBaseLibARActivityやその下にあるネイティブライブラリに含まれているため、それをそのまま使うのであれば修正箇所は対してありません。
描画に当たる部分である、com.artoolworks.ar.samples.ARSimple.SimpleRendererを開いてください。

本来は配列を使って記述するのが良いのですが、わかりやすさ重視のためあえて使わずに変更していきます。
まずは、パターンと内部処理で使用するマーカーIDの関連付けを行います。

private int markerID _Hiro = -1;
private Cube cube = new Cube(40.0f, 0.0f, 0.0f, 20.0f);
// Kanji Marker
private int markerID_Kanji = -1;
private Cube cube2 = new Cube(20.0f, 0.0f, 0.0f, 20.0f);

マーカー管理のIDをmarkerID_Hiroに変更し、追加するマーカーのIDをmarkerID_Kanjiとしています。 それに加えて、表示する箱も大きさが同じではわかりにくいので半分サイズにしたcube2を作りました。
次に進んでマーカーを登録する処理に移ります。

**configureARScene()**内部を編集します。

markerID _Hiro = ARToolKit.getInstance().addMarker("single;Data/patt.hiro;80");

markerID_Kanji = ARToolKit.getInstance().addMarker("single;Data/patt.kanji;80");

if (markerID_Hiro < 0) return false;

if (markerID_Kanji < 0) return false;

ここで追加したのはマーカーパターンのファイルを読み込んでIDと関連付ける部分になります。 元々あった変数は書き換えてしまったのでそれに合わせて修正しています。また、追加したマーカーのIDに対してaddMarker関数を使ってkanjiパターンを読み込みIDを振っています。 addMarkerについては機会があれば別途触れます。

これでマーカーの判別のための情報はセットし終わったので表示部分に移ります。 表示部分では単純にどのパターンなら何を表示するという処理を書くだけなので、パターンの数だけIF文を書くという感じです。 今回は手抜きをして、**queryMarkerVisible()**のIFブロックをコピーして使いましょう。

// If the marker is visible, apply its transformation, and draw a cube
if (ARToolKit.getInstance().queryMarkerVisible(markerID_Hiro)) {
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadMatrixf(ARToolKit.getInstance().queryMarkerTransformation(markerID_Hiro), 0);
    cube.draw(gl);
}

if (ARToolKit.getInstance().queryMarkerVisible(markerID_Kanji)) {
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadMatrixf(ARToolKit.getInstance().queryMarkerTransformation(markerID_Kanji), 0);
    cube2.draw(gl);
}

あとは実行するだけです。

複数のマーカーに同時に反応するようになりました。ちなみに、漢字マーカーの代わりに同じHiroマーカーのパターンファイルをセットしても2つのHiroマーカーに反応するようになるわけではありませんのでご注意ください。

バーコードマーカー

ARToolKitでは複数のマーカーを識別することができますが、多くのパターンを作っていくと、だんだんと似たようなモノになりご誤認識するようになります。 論文上では50パターンが限度と書かれていますが、図柄を無視して20パターン、そうでないのであれば10パターン程度で限界ではないかというのが個人的な見解です。

そこで、数多くのパターンを識別するために存在するのがバーコードマーカーと呼ばれるパターンです。 バーコードを読み込むわけではなく、マーカーの白領域内を分割してそれを白黒のビットパターンで表現したものになります。 マーカーは下記サイトから入手することができます。

使用するにはNDKを用いた開発手順の中にあるARToolKitとARToolKitWrapperのリビルドを行う必要があります。 手順はそちらで確認するとして簡単にバーコードマーカーへの対応方法を説明します。 まず、各NDKのライブラリのリビルド前にARToolKit/android/jni/include/AR/arConfig.hファイルを編集します。

28: #define  AR_TEMPLATE_MATCHING_MONO_AND_MATRIX  4
29: #define  AR_DEFAULT_PATTERN_DETECTION_MODE     AR_MATRIX_CODE_DETECTION // AR_TEMPLATE_MATCHING_COLOR
30: 

この状態でNDKライブラリをリビルドしてください。

その後、com.artoolworks.ar.samples.ARSimple.SimpleRendererのマーカーを追加する部分のコードを下記のようにします。

markerID = ARToolKit.getInstance().addMarker("single_barcode;0;80");

single_barcode;_0_;80とありますが、2つ目の数字が認識するIDになります。必要な数だけ追加してください。 デフォルトでは 3x3 パターンなので 64パターンですが、arConfig.hを修正することでその上のパターンを用いて8,000パターン処理することができるようになります。