2012年8月2日木曜日

ARToolKitをProcessingで使う(2)

第二回はサンプルプログラムを解析します.

では以下がSimpleLiteを見ていきます.

/**
  NyARToolkit for proce55ing/1.0.0
  (c)2008-2011 nyatla
  airmail(at)ebony.plala.or.jp
**/

import processing.video.*;
import jp.nyatla.nyar4psg.*;

Capture cam;
MultiMarker nya;

void setup() {
  size(640,480,P3D);
  colorMode(RGB, 256);
  println(MultiMarker.VERSION);
  cam=new Capture(this,640,480);
  nya=new MultiMarker(this,width,height,"camera_para.dat",NyAR4PsgConfig.CONFIG_PSG);
  nya.addARMarker("patt.hiro",80);
}

void draw()
{
  if (cam.available() !=true) {
      return;
  }
  cam.read();
  nya.detect(cam);
  background(0);
  nya.drawBackground(cam);//frustumを考慮した背景描画
  if((!nya.isExistMarker(0))){
    return;
  }
  nya.beginTransform(0);
  fill(0,0,255);
  translate(0,0,20);
  box(40);
  nya.endTransform();
}

以上がサンプルプログラムです.
一行づつ関数の働きを見ていきます.

setup(),draw()はProcessingの関数です.
draw()内部の処理は,実行中繰り返されます.
setup()は実行時に一度呼び出されます.

プログラムの実行順に解析をしていきます.
まずsetup()内部から見ていきます.
size()関数はProcessing実行時のウインドウの大きさを指定します.
第一引数は横幅のピクセル数,第二引数は縦幅のピクセル数,第三引数は描画モードです.

camはCaptureクラスのインスタンスです.
cam=new Capture(this,640,480)でカメラからの画像取得サイズを決定します.

nyaはNyARToolKitで複数マーカを使用するためのクラスMultimarkerクラスのインスタンスです.
nya=new MultiMarker(this,width,height,"camera_para.dat",NyAR4PsgConfig.CONFIG_PSG)
ここでcamera_para.datはカメラ内部のパラメータを記述したファイルで,dataフォルダ内に存在しています. これは汎用的な値を採用しているため,自分が使用するカメラでキャリブレーションを行い,置き換えることでマーカ位置計測精度等を向上させることができるようになります.
このカメラのキャリブレーション方法については後日書こうとおもいます.

nya.addARMarker("patt.hiro",80)ではマーカのファイルを読み込むためのメソッドです.
patt.hiroはdataフォルダ内に存在します.このファイルを自分が作成したマーカのものに置き換えることで,好きなマーカでNyARToolKitを扱うことができます.

次にDraw()内部です.
最初のif文条件分岐処理でカメラが利用できない場合の処理について記述しています.
cam.availacle()では新しい画像が取得できたかどうか判断します.
この場合,新しい画像が取得できなかった場合にループを中断し,先頭に移動します.

cam.read()では,カメラで撮影した最新の画像を読み込みます.

nya.detect(cam)では画像からマーカを検出し,3次元位置を計算します.
この引数は,PImageクラスのオブジェクトである必要があります.

ここではcamを入れていますが,このクラスで扱う画像はPImageだと思われるため問題ありません.

 background(0)は重畳表示したものをリフレッシュする働きがあります.この部分をコメントアウトすると以下のようになります.
 次のif文ではマーカを検出したかどうかで分岐します.nya.isExistMarker(0)では対象としたマーカが存在する場合にtrueを返します.引数としている0は読み込んだマーカのIDです.今回はマーカを一つしか読み込んでいないためIDは0のみになっています.

対象とするマーカが存在することを確認できたら,重畳表示する3Dオブジェクトの描画処理に移ります. nya.beginTransform(0)および nya.endTransform(0)で囲んだ部分がそれに該当します.
  fill(0,0,255);
  translate(0,0,20);
  box(40);
となっている部分で最も重要なのがtranslateです.これは座標系を並進させるメソッドです.今回box(40)ということで一辺40mmの立方形を描画したいのですが,boxの中心は箱の中心になっています.そのため,transrateさせずに描画するとboxの半分つまり20mmしかマーカの上に出ていないことになってしまい,マーカの白いところに表示させるはずだったboxがずれてしまいます.

下の写真はtransrateさせた場合とtransrateさせない場合を比較したものです.

 私自身ARToolKitではこのように座標系をどう動かすかといった座標変換の考え方が最も難しいと感じています.

fillは塗りつぶしの色を指定するメソッドです. 第一引数から順にRed,Green,Blueに対応していて,それぞれ0~255の範囲の値で色の強さを指定することができます.ですから例えば,fill(255,0,0)とすることによって赤い立方体を描画することが可能になります.

これでSimpleLiteがどのような処理を行なっているのかわかるようになりました.
このサンプルプログラムはNyARToolKitを扱う上で最小の構成になっています.さらに様々な機能を追加していくためにはもっと長いサンプルを読む必要がありそうですが,ドキュメントがかなりしっかりと書かれているためそれほど苦労しないですみそうです.

0 件のコメント:

コメントを投稿