2013-04-29 60 views
0

我正在開發基於android的跟蹤系統,在android上使用相機和其他傳感器。我感興趣的是從AndAR讀取轉換矩陣,而不是在檢測到標記時顯示某個對象(例如立方體)。我有另一種跟蹤系統,它使用ARToolkit的風格開發,稱爲jARToolkit,運行在臺式機上,並在網絡攝像機和模式之間提供轉換矩陣。 現在我正在從AndAR獲得轉換矩陣,但是如果我們將它與我從jARToolkit獲得的轉換矩陣進行比較,則完全不同。原因可能是以下問題 -從andar讀取轉換矩陣

  1. 我在android上看到的表面預覽始終旋轉90度。所以我在翻譯矩陣中的X和Y座標交換了他們的位置。
  2. 我不確定翻譯矩陣的單位。它在物理世界每釐米約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 

    } 
} 

請讓我知道如果我需要提供更多的信息.​​.謝謝

回答

0

原來的C的ARToolKit有兩個類型的轉換相關聯一個標記:

  • 3x4矩陣(來自姿態的計算機視覺矩陣e從arGetTransMat獲得)

  • 4x4矩陣(類似於OpenGL的矩陣,從argConvGLcpara獲得,具有上述3x4矩陣)。

在ANDAR:

  • 3x4的矩陣:可以通過從ARObject調用getTransMatrix()來獲得。
  • 4x4矩陣:不能從您的ARObject公開存取,存儲在glCameraMatrix中的矩陣(請參閱ARObject.java的代碼)。

    • 3×4矩陣:可以通過調用getTransMatrix獲得
    • 4x4矩陣:可以通過調用getCamTransMatrix
    • 獲得

    也許你訪問ANDAR之間不同的矩陣

在JARToolKit

和JARToolKit。

單位是相對於您的標記大小。通常以mm爲單位,在object_hiro聲明中的參數:80.0代表80mm寬度。您可以將標記打印到此大小,以便在物理對象和虛擬內容之間找到匹配。

+0

感謝您的回覆Raphael;但是我在AndAR中使用了getTransMatrix()方法,並且仍然得到了一個4X4矩陣(轉化爲double [])。關於單位,我會嘗試使用不同大小的標記,並比較變換矩陣。再次感謝你的回覆.. – aboli81 2013-05-20 19:10:20