執筆/雑誌/SD/2009/03

まず、動かすには。

  1. JMFをインストールする
    1. JMF 2.1.1e Softwareより、入手してください。
  2. Webカメラを接続する
    1. JMFに対応しているものである必要がありますが、たいていの場合は、大丈夫です。
  3. カメラサーバを起動する
    1. ソースコードのWebcamBroadcasterディレクトリのWebcamBroadcasterを実行します。
    2. コンパイル済みのバイナリがおいてありますので、下記のように実行できます。
      1. java WebcamBroadcaster
  4. 母艦PCのIPを調べる
    1. Androidエミュレータは、qemu上で動いているため、「localhost」によるアクセスは出来ません。そのため、母艦PCに何かしらのIPアドレスが必要になります。
      1. プライベートIPでも構いません。
    2. 調査法は、Windows系であれば「ipconfig」、Mac/Linux系であれば「ifconfig」で調べることが出来ます。
  5. ソースコード一式をEclipseに読み込む
    1. 技術評論社さんの特設ページからダウンロードしてください。
    2. File⇒Import⇒Existing Projects into Workspace を選択してください。
    3. 「Select root directory」に、解凍先のディレクトリを指定してください。
    4. 「Projects」欄に「NyARtoolkitAndroid」が表示されますので、選択して 「Finish」を押してください。
  6. ソースコードのIPアドレスの設定を変更する
    1. res/values/strings.xml
      <string name="server_addr">192.168.86.1</string>
      の 部分を上記で調べたものに変更します。
  7. マーカーを印刷する
    1. res/raw/marker.jpg
      1. を、印刷してください。
  8. 実行する
    1. Eclipseから、実行してください。エミュレータが起動して、カメラ画像が表示されるはずです。
    2. 上記で印刷したマーカーを、カメラで写すと、3Dオブジェクト(デフォルトでは、椅子)が表示されます。

表示させる3Dオブジェクトを変更する

  1. assetsディレクトリに、読み込ませたい3Dオブジェクトのデータをコピーしてください。
    1. メタセコイヤ形式ファイルに対応しています。
    2. Androidの制限により、1MBまでのファイルしか読み出せません。
  2. ソースコード「NyARToolkitAndroidActivity#onCreate()」
    mRenderer = new ModelRenderer(false, getAssets(), "chair01.mqo", 0.04f);
    1. の行をコピーしたファイル名に変更してください。
      1. 最後のfloat値は、倍率です。

G1やDev Phone 1で動かす

  1. res/values/strings.xml
    <string name="camera_name">jp.android_group.artoolkit.hardware.SocketCamera</string> 
    を、
    <string name="camera_name">jp.android_group.artoolkit.hardware.Dev1Camera</string>
    に変更する。

ソースコードを追いかける(詳細編)

細かい点について、コードを順番に追っていきます。

Dev Phone 1モードでの画像の向きについて

もしかすると、画面が傾いていませんか?
本来は、それを制御するためには、OrientationListenerクラスを利用します。
NyARToolkitAndroidActivity#onCreate(Bundle)内で、

mOrientationListener = new OrientationListener(this) {
   public void onOrientationChanged(int orientation) {
      mLastOrientation = orientation;
   }
};

と、インスタンス化しています。
が、これ、思ったように動いてくれません。Dev Phone 1を、立てているにもかかわらず、『横』の判定になってしまったり、動かしていないのに、縦から横になってしまったりと、いまいち、安定しません。
そのため、今回は、入れてはおきましたが、使っていません。

有効にするには、Dev1CameraクラスのインナークラスであるImageCapture#capture()内の

//final int latchedOrientation = NyARToolkitAndroidActivity.roundOrientation(arActivity.getLastOrientation() + 90 );
(略)
parameters.set("rotation", 90);
//parameters.set("rotation", latchedOrientation);

のコメントアウトをはずしてもらえれば、OKです。
安定させられた方、是非、ご連絡をお願いします。

キャリブレーションについて

上記のOrientationListenerによる姿勢制御により、縦横が切り替わったタイミングで画面のサイズが(縦横比)が変わります。そのため、この横サイズにあったARToolkit用のキャリブレーションファイル(res/raw/camera_para.dat)が必要になります。
今回は、用意していないので、ご自分で用意してください。

訂正とお知らせ

RGBの並びについて

Camera×Callback×Bitmap節にて、RGBの持ち方に関する記述がありますが、

ビットマップとOpenGL/ESとのRGBの持ち方の違い

という方が正しいとの、指摘がありましたので、訂正させていただきます。

NyARToolkitとメタセコの読み出しライブラリについて

現在、NyARToolkitのVer.2.0化 と Androidに付属しているfloat系のネイティブライブラリを使用するように変更を行っています。
それにあわせて公開する予定ですので、少々お待ちください。

Android Tips

おまけ

本節の1ページ目の写真の手

  • 手タレとして出演してもらったのは、これです。