首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从andar中读取变换矩阵

从andar中读取变换矩阵
EN

Stack Overflow用户
提问于 2013-04-29 20:07:15
回答 1查看 808关注 0票数 0

我正在开发一个基于android的跟踪系统,使用摄像头和android上的其他传感器。我感兴趣的是从AndAR读取转换矩阵,而不是在检测到标记时显示某个对象(例如立方体)。我有另一个使用ARToolkit风格开发的跟踪系统,名为jARToolkit,它运行在台式计算机上,并给出网络摄像机和模式之间的转换矩阵。现在,我正在从AndAR获得转换矩阵,但是如果我们将它与从jARToolkit获得的转换矩阵进行比较,它是完全不同的。原因可能是以下问题-

  1. 我在android上看到的表面预览总是旋转90度。所以,我的X和Y在平移矩阵中的坐标交换了它们的位置。
  2. 我不确定翻译矩阵的单位。在物理世界中,它大约是每厘米4个单位,但我无法证实这一点。

如果有人能帮我解决这些问题,或者让我知道我错过了什么,我将不胜感激。提前谢谢。

下面是我正在使用的代码。它与AndAR文档中的内容基本相同。

代码语言:javascript
复制
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 -

代码语言:javascript
复制
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

    }
}

如果我需要提供更多的信息,请告诉我。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-10 15:33:09

原始C ARToolKit有两种类型的转换与标记关联:

  • 一个3x4矩阵(从位姿估计得到的计算机视觉矩阵,从arGetTransMat获得)
  • 一个4x4矩阵(一个类似OpenGL的矩阵,从上面的3x4矩阵从argConvGLcpara得到)。

在AndAR中:

  • 3x4矩阵:可以通过从您的getTransMatrix()调用ARObject获得。
  • 4x4矩阵:不能从ARObject公开访问,存储在glCameraMatrix中的矩阵(参见ARObject.java代码)。

在JARToolKit中:

  • 3x4矩阵:可以通过调用getTransMatrix获得
  • 4x4矩阵:可以通过调用getCamTransMatrix获得

也许您可以访问AndAR和JARToolKit之间的另一个矩阵。

该单位相对于您的标记大小。通常它以mm为单位,参数在您的object_hiro声明中: 80.0表示80毫米宽。您可以将标记打印到此大小,以便在物理对象和虚拟内容之间进行匹配。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16287297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档