Android ArbiTrack の基礎

このチュートリアルは、Kudan ArbiTrack 機能の使用に関する基礎を紹介します。


このチュートリアルは、ターゲット ノードと画像ノードのアセットを使用します。これらのアセットは、こちらからダウンロードできます。

このアセット バンドルには、次のものが含まれます。

  • Cow Target.png – ターゲット ノードに使用する画像です。デバイスのジャイロスコープとともに移動して、ArbiTracker のプレビューとして機能します。
  • Cow Tracking.png – 画像ノードに使用する画像です。ArbiTrack がトラッキングを開始すると表示されます。

ファイルをダウンロードしたら、展開してアセットを Android Studio プロジェクトに追加します。

ArbiTrack の初期化

Kudan ArbiTrack 機能を使用する前に、2 つのものを初期化する必要があります。1 つは、環境内の一連の特徴点をトラッキングしてノードを所定の位置にロックする ARArbiTrack です。もう 1 つは、デバイスのジャイロスコープを使用してノードを配置する ARGyroPlaceManager です。これらを初期化するには、次のコードをアクティビティに追加します。

MainActivity.java
@Override
public void setup() 
{
  super.setup();
  
  // ArbiTrack を初期化
  ARArbiTrack arbiTrack = ARArbiTrack.getInstance();
  arbiTrack.initialise();
  
  // ジャイロスコープの配置を初期化 
  ARGyroPlaceManager gyroPlaceManager = ARGyroPlaceManager.getInstance();
  gyroPlaceManager.initialise();
}

このコードは、ジャイロスコープと KudanCV の ArbiTracker を含む、ArbiTrack が必要とするすべてのものを初期化します。

特徴点が少ない環境

ArbiTrack は、正確にトラッキングするため、環境内の多数の特徴点を使用します。特徴点の少ない環境では、トラッキングの一貫性が損なわれることがあります。

ターゲット ノードの設定

ワールド空間にモデルを配置するには、ターゲット ノードを使用する必要があります。このノードは、トラッキングの開始点を決定します。デバイスの向きに応じてターゲット ノードの位置は変わるため、ターゲット ノードの位置をグラフィカルに表現すると便利です。

ターゲット ノードは ARNode であるため、単純なプレビュー画像やトラッキング対象のモデルを含む、あらゆるものをプレビューすることが可能です。このチュートリアルでは、ターゲットに Kudan Cow を使用します。

ターゲット ノードを作成して ArbiTracker に追加するには、次のコードを setup メソッドの最後に追加します。

MainActivity.java
// ターゲットとして使用されるノードを作成
ARImageNode targetNode = new ARImageNode("Cow Target.png");
        
// デバイスのジャイロスコープとともに移動するように、ジャイロスコープ配置マネージャーのワールド空間にターゲット ノードを追加
gyroPlaceManager.getWorld().addChild(targetNode);
        
// 正しく表示されるようにノードを回転およびスケーリング
targetNode.rotateByDegrees(90.0f, 1.0f, 0.0f, 0.0f)
targetNode.rotateByDegrees(180.0f, 0.0f, 1.0f, 0.0f);

targetNode.scaleByUniform(0.3f);
        
// 正しく表示されるようにノードを回転およびスケーリング
arbiTrack.setTargetNode(targetNode);

このコードは、画像ノードを作成して、ジャイロスコープ配置マネージャーのワールド空間に追加し、ArbiTracker に割り当てます。

ArbiTrack でのコンテンツの設定

ターゲット ノードは作成しましたが、ArbiTrack の開始時に表示するものが必要です。ターゲット ノードと同様に、ArbiTrack では任意のノードを使用して任意のコンテンツを表示できます。このチュートリアルでは、画像ノードを使用します。次のコードを setupContent メソッドの最後に追加します。

MainActivity.java
// トラッキングされるノードを作成
ARImageNode trackingNode = new ARImageNode("Cow Tracking.png");

// 正しく表示されるようにノードを回転
trackingNode.rotateByDegrees(90.0f, 1.0f, 0.0f, 0.0f);
trackingNode.rotateByDegrees(180.0f, 0.0f, 1.0f, 0.0f);

// ArbiTracker のワールド空間に子としてノードを追加
arbiTrack.getWorld().addChild(trackingNode);

このコードは、トラッキング画像を使用して画像ノードを作成し、ArbiTracker のワールド空間に追加します。

タッチ入力の実装と ArbiTrack の開始

これで、ターゲット ノードとコンテンツの画像ノードを作成し、ArbiTrack とジャイロスコープの設定が完了しましたが、どのようにトラッキングを開始したらよいのでしょうか? 画像トラッカーは、マーカーを探すだけだったため自動で開始できましたが、ArbiTracker には探すものがありません。つまり、いつ開始すべきかを知らせる必要があります。幸いにも、これは非常に簡単です。

さまざまな入力方法を利用できます。例えば、画面にボタンを追加できます。しかし、これには多くの設定とアクティビティ レイアウトの調整が必要です。より簡単な方法は、GestureDetector を実装することです。アクティビティを次のように変更します。

MainActivity.java
public class MarkerlessActivity extends ARActivity implements GestureDetector.OnGestureListener
{
  ...
  private GestureDetectorCompat gestureDetect;
  ...
  
  @Override
  protected void onCreate(Bundle savedInstanceState) 
  {
      super.onCreate(savedInstanceState);

      // ArbiTrack を開始および停止するジェスチャ認識機能を作成
      gestureDetect = new GestureDetectorCompat(this,this);
  }
  
  ...
  
  @Override
  public boolean onTouchEvent(MotionEvent event) 
  {
    gestureDetect.onTouchEvent(event);
    return super.onTouchEvent(event);
  }
  
  @Override
  public boolean onSingleTapUp(MotionEvent e) 
  {
    ARArbiTrack arbiTrack = ARArbiTrack.getInstance();

    // ArbiTrack がトラッキング中の場合は、トラッキングを停止してワールド空間がレンダリングされないようにし、ターゲット ノードを表示
    if (arbiTrack.getIsTracking())
    {
      arbiTrack.stop();
      arbiTrack.getTargetNode().setVisible(true);
    }

    // トラッキング中でない場合は、トラッキングを開始してターゲット ノードを非表示にする
    else
    {
      arbiTrack.start();
      arbiTrack.getTargetNode().setVisible(false);
    }
    
    return false;
  }

  // このサンプルには不要だが、GestureDetector のほかのオーバーライドの実装も必要
  @Override
  public boolean onDown(MotionEvent e) 
  {
    return false;
  }

  @Override
  public void onShowPress(MotionEvent e) 
  {
  }

  @Override
  public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 
  {
    return false;
  }

  @Override
  public void onLongPress(MotionEvent e) 
  {
  }

  @Override
  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 
  {
    return false;
  }
}

上記の変更により、タッチ入力の認識機能がアクティビティに追加されます。画面をタップすると、すでにトラッキング中かどうかに応じて、ArbiTrack が開始または停止します。

アプリをビルドして Android デバイスで実行すると、画面中央にターゲット ノードが表示され、デバイスの移動に合わせて移動します。画面をタップすると、ターゲット ノードが非表示になり、トラッキング ノードが表示されます。再度タップすると、トラッキング ノードが非表示になり、ターゲット ノードが表示されます。