2012-02-22 4 views
1

Я планирую создать приложение для Android. на основе Дополненная реальность. Я googled это и также искал на SO, но не нашел ничего очень полезного.Создание, использование и сопоставление шаблона в дополненной реальности

Что я хочу сделать, это когда приложение запущено, оно запустит камеру и начнет сканирование шаблона. Если в любом случае шаблон совпадает с предопределенным шаблоном, присутствующим в локальной базе данных, он должен выполнить определенное действие.

я говорил this tutorial Когда я использую следующий код, эти файлы будут созданы на SDCard: patt.hiro, android.patt, barcode.patt.

В открывшемся файле .patt имеется матрица, состоящая из значений между 0-255. Как я могу использовать настраиваемый шаблон через активы вместо этих файлов?

CustomActivity.java

public class CustomActivity extends AndARActivity { 

    CustomObject someObject; 
    ARToolkit artoolkit; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     CustomRenderer renderer = new CustomRenderer(); 
     super.setNonARRenderer(renderer); 
     try { // register a object for each marker type 
      artoolkit = super.getArtoolkit(); 
      someObject = new CustomObject("test", "patt.hiro", 80.0, 
        new double[] { 0, 0 }); 
      artoolkit.registerARObject(someObject); 
      someObject = new CustomObject("test", "android.patt", 80.0, 
        new double[] { 0, 0 }); 
      artoolkit.registerARObject(someObject); 
      someObject = new CustomObject("test", "barcode.patt", 80.0, 
        new double[] { 0, 0 }); 
      artoolkit.registerARObject(someObject); 
     } catch (AndARException ex) { 
     } 
     startPreview(); 
    } 
} 

CustomObject.java

/** An example of an AR object being drawn on a marker. */ 
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); 
    } 

    /** Just a box, imported from the AndAR project. */ 
    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(0, 1.0f, 0, 1.0f); 
     gl.glTranslatef(0.0f, 0.0f, 12.5f); 

     // draw the box 
     box.draw(gl); 
    } 
    @Override 
    public void init(GL10 gl) {} 
} 

CustomRenderer.java

/** A custom OpenGL renderer, that gets registered to the {@link AndARRenderer}. It allows you to draw non Augmented Reality stuff, and setup the OpenGL environment.*/ 
public class CustomRenderer implements OpenGLRenderer { 

    /** Light definitions */ 
    private float[] ambientlight1 = { .3f, .3f, .3f, 1f }; 
    private float[] diffuselight1 = { .7f, .7f, .7f, 1f }; 
    private float[] specularlight1 = { 0.6f, 0.6f, 0.6f, 1f }; 
    private float[] lightposition1 = { 20.0f, -40.0f, 100.0f, 1f }; 

    private FloatBuffer lightPositionBuffer1 = GraphicsUtil 
      .makeFloatBuffer(lightposition1); 
    private FloatBuffer specularLightBuffer1 = GraphicsUtil 
      .makeFloatBuffer(specularlight1); 
    private FloatBuffer diffuseLightBuffer1 = GraphicsUtil 
      .makeFloatBuffer(diffuselight1); 
    private FloatBuffer ambientLightBuffer1 = GraphicsUtil 
      .makeFloatBuffer(ambientlight1); 

    /** Do non Augmented Reality stuff here. Will be called once after all AR objects have been drawn. The transformation matrices may have to be reset.*/ 
    public final void draw(GL10 gl) { 
    } 

    /**Directly called before each object is drawn. Used to setup lighting and other OpenGL specific things.*/ 
    public final void setupEnv(GL10 gl) { 
     gl.glEnable(GL10.GL_LIGHTING); 
     gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_AMBIENT, ambientLightBuffer1); 
     gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_DIFFUSE, diffuseLightBuffer1); 
     gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_SPECULAR, specularLightBuffer1); 
     gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_POSITION, lightPositionBuffer1); 
     gl.glEnable(GL10.GL_LIGHT1); 
     gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
     gl.glDisable(GL10.GL_TEXTURE_2D); 
     initGL(gl); 
    } 

    /** Called once when the OpenGL Surface was created. */ 
    public final void initGL(GL10 gl) { 
     gl.glDisable(GL10.GL_COLOR_MATERIAL); 
     gl.glEnable(GL10.GL_CULL_FACE); 
     gl.glShadeModel(GL10.GL_SMOOTH); 
     gl.glDisable(GL10.GL_COLOR_MATERIAL); 
     gl.glEnable(GL10.GL_LIGHTING); 
     gl.glEnable(GL10.GL_CULL_FACE); 
     gl.glEnable(GL10.GL_DEPTH_TEST); 
     gl.glEnable(GL10.GL_NORMALIZE); 
    } 
} 

Как захватить шаблон из сфокусированной области камеры и как я могу сопоставить его с другим шаблоном?

Я знаю, что я немного неясен в этом вопросе, но, поскольку я новичок в развитии Android, любое предложение могло бы оказать большую помощь.

ответ

2

вам необходимо увидеть CustomObject.java, где создается зеленый куб, используя opengl ... для создания этих трехмерных объектов, которые вам необходимо знать, opengl ... Даже если я пытаюсь создать некоторые другие объекты используя тот же код .. это немного сложно, и нам нужно потратить некоторое время, чтобы узнать, что ...

+0

Я использовал его из самой демонстрации. Мое фактическое требование не отображает зеленый куб. Вместо этого, если шаблон совпадает с предопределенным шаблоном в базе данных, необходимо выполнить определенное действие (например, должен отображаться «Toast».) – GAMA

+0

см. Эту ссылку, это может помочь нам понять, что такое файлы шаблонов (.patt) [link] (http://www.artoolworks.com/support/library/Creating_and_training_new_ARToolKit_markers) и [ссылка] (http://www.artoolworks.com/support/library/Category:ARToolKit_Professional) – Pavan

 Смежные вопросы

  • Нет связанных вопросов^_^