0

Androidのカメラやその他のセンサーを使用して、Androidベースの追跡システムを開発しています。マーカーが検出されたときにオブジェクト (立方体など) を表示するのではなく、AndAR から変換行列を読み取ることに関心があります。jARToolkit と呼ばれる ARToolkit のフレーバーを使用して開発された別の追跡システムがあります。これはデスクトップ マシンで実行され、Web カメラとパターンの間の変換マトリックスを提供します。今は AndAR から変換行列を取得していますが、jARToolkit から取得している変換行列と比較すると、まったく異なります。その理由は次の問題である可能性があります -

  1. Android で表示されるサーフェス プレビューは、常に 90 度回転しています。したがって、平行移動行列の X 座標と Y 座標は位置を交換します。
  2. 平行移動行列の単位がわかりません。物理世界では 1 cm あたり約 4 単位になりますが、これを確認する方法はありません。

誰かがこれらの質問に対処するのを手伝ってくれるか、何か不足している場合はお知らせください. 前もって感謝します。

以下は私が使用しているコードです。AndAR のドキュメントとほとんど同じです。

boolean keepRunning = true;
try {
    ARToolkit artoolkit = getArtoolkit();
    CustomObject object_hiro = new CustomObject("test_hiro", "hiro.patt", 80.0,new double[] { 0, 0 });
    artoolkit.registerARObject(object_hiro);
}
catch (AndARException ex)
{       
    System.out.println("");
}
while(keepRunning)
{
    double[] transMatrix = (double[]) object_hiro.getTransMatrix();
}

ここに CustomObject.java があります -

import java.nio.FloatBuffer;
import javax.microedition.khronos.opengles.GL10;
import edu.dhbw.andar.ARObject;
import edu.dhbw.andar.pub.SimpleBox;
import edu.dhbw.andar.util.GraphicsUtil;

/**
 * An example of an AR object being drawn on a marker.
 * @author tobi
 *
 */
public class CustomObject extends ARObject {

    public CustomObject(String name, String patternName,
            double markerWidth, double[] markerCenter) {
        super(name, patternName, markerWidth, markerCenter);
        float   mat_ambientf[]     = {0f, 1.0f, 0f, 1.0f};
        float   mat_flashf[]       = {0f, 1.0f, 0f, 1.0f};
        float   mat_diffusef[]       = {0f, 1.0f, 0f, 1.0f};
        float   mat_flash_shinyf[] = {50.0f};

        mat_ambient = GraphicsUtil.makeFloatBuffer(mat_ambientf);
        mat_flash = GraphicsUtil.makeFloatBuffer(mat_flashf);
        mat_flash_shiny = GraphicsUtil.makeFloatBuffer(mat_flash_shinyf);
        mat_diffuse = GraphicsUtil.makeFloatBuffer(mat_diffusef);

    }
    public CustomObject(String name, String patternName,
            double markerWidth, double[] markerCenter, float[] customColor) {
        super(name, patternName, markerWidth, markerCenter);
        float   mat_flash_shinyf[] = {50.0f};
        mat_ambient = GraphicsUtil.makeFloatBuffer(customColor);
        mat_flash = GraphicsUtil.makeFloatBuffer(customColor);
        mat_flash_shiny = GraphicsUtil.makeFloatBuffer(mat_flash_shinyf);
        mat_diffuse = GraphicsUtil.makeFloatBuffer(customColor);

    }

    private SimpleBox box = new SimpleBox();
    private FloatBuffer mat_flash;
    private FloatBuffer mat_ambient;
    private FloatBuffer mat_flash_shiny;
    private FloatBuffer mat_diffuse;


    /**
     * Everything drawn here will be drawn directly onto the marker,
     * as the corresponding translation matrix will already be applied.
     */
    @Override
    public final void draw(GL10 gl) {       
        super.draw(gl);
        gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR,mat_flash);
        gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, mat_flash_shiny);    
        gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, mat_diffuse);  
        gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, mat_ambient);

        //draw cube
        gl.glColor4f(1.0f, 0f, 0, 1.0f);
        gl.glTranslatef( 0.0f, 0.0f, 12.5f );

        box.draw(gl);      
    }

    @Override
    public void init(GL10 gl) {
        // TODO Auto-generated method stub

    }
}

追加情報を提供する必要がある場合はお知らせください..ありがとう

4

1 に答える 1

0

元の C ARToolKit には、マーカーに関連付けられた 2 種類の変換があります。

  • 3x4 マトリックス (arGetTransMat から取得したポーズ推定からのコンピューター ビジョン マトリックス)

  • 4x4 マトリックス (上記の 3x4 マトリックスを使用して argConvGLcpara から取得される、OpenGL に似たマトリックス)。

AndAR では:

  • 3x4 マトリックス: ARObject から getTransMatrix() を呼び出すことで取得できます。
  • 4x4 マトリックス: ARObject からはパブリックにアクセスできず、glCameraMatrix に格納されているマトリックス (ARObject.java のコードを参照)。

JARToolKit で:

  • 3x4 行列: getTransMatrix を呼び出して取得できます
  • 4x4 行列: getCamTransMatrix を呼び出して取得できます

AndAR と JARToolKit の間で別のマトリックスにアクセスしている可能性があります。

単位は、マーカーのサイズに相対的です。通常は mm 単位で、object_hiro の宣言のパラメータ: 80.0 は 80mm 幅を表します。マーカーをこのサイズに印刷して、物理オブジェクトと仮想コンテンツを一致させることができます。

于 2013-05-10T15:33:09.460 に答える