我正在開發基於android的跟蹤系統,在android上使用相機和其他傳感器。我感興趣的是從AndAR讀取轉換矩陣,而不是在檢測到標記時顯示某個對象(例如立方體)。我有另一種跟蹤系統,它使用ARToolkit的風格開發,稱爲jARToolkit,運行在臺式機上,並在網絡攝像機和模式之間提供轉換矩陣。 現在我正在從AndAR獲得轉換矩陣,但是如果我們將它與我從jARToolkit獲得的轉換矩陣進行比較,則完全不同。原因可能是以下問題 -從andar讀取轉換矩陣
- 我在android上看到的表面預覽始終旋轉90度。所以我在翻譯矩陣中的X和Y座標交換了他們的位置。
- 我不確定翻譯矩陣的單位。它在物理世界每釐米約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
}
}
請讓我知道如果我需要提供更多的信息..謝謝
感謝您的回覆Raphael;但是我在AndAR中使用了getTransMatrix()方法,並且仍然得到了一個4X4矩陣(轉化爲double [])。關於單位,我會嘗試使用不同大小的標記,並比較變換矩陣。再次感謝你的回覆.. – aboli81 2013-05-20 19:10:20