2011-05-04 40 views
1
package edu.dhbw.andar.sample; 

import java.io.ByteArrayOutputStream; 
import android.app.AlertDialog; 
import java.nio.ByteBuffer; 
import java.nio.FloatBuffer; 
import java.nio.IntBuffer; 

import javax.microedition.khronos.opengles.GL10; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.util.Log; 

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 { 

    int[] texture; 
    private static final int TEX_SIZE=64; 
     int tex; 
     ByteArrayOutputStream baos; 
     byte[] b; 
     float texCoords1[] = {0f, 0f,20f,20f}; 
     FloatBuffer texCoords; 
    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}; 

     texCoords= GraphicsUtil.makeFloatBuffer(texCoords1); 
     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); 


     //draw cube 
     try 
     { 
    // gl.glColor4f(0, 1.0f, 0, 1.0f); 
     // gl.glTranslatef(0.0f, 0.0f, 12.5f); 
     if (texture==null) 
       texture=new int[1]; 
      gl.glGenTextures(1, texture, 0); 
      Bitmap bMap = BitmapFactory.decodeFile("/sdcard/Classic_scaled.png"); 
      int pixels[]=new int[TEX_SIZE*TEX_SIZE]; 
      bMap.getPixels(pixels, 0, TEX_SIZE, 0, 0, TEX_SIZE, TEX_SIZE); 
      int pix1[]=new int[TEX_SIZE*TEX_SIZE]; 
      for(int i=0; i<TEX_SIZE; i++) 
      { 
       for(int j=0; j<TEX_SIZE; j++) 
       { 
         //correction of R and B 
         int pix=pixels[i*TEX_SIZE+j]; 
         int pb=(pix>>16)&0xff; 
         int pr=(pix<<16)&0x00ff0000; 
         int px1=(pix&0xff00ff00) | pr | pb; 
         //correction of rows 
         pix1[(TEX_SIZE-i-1)*TEX_SIZE+j]=px1; 
       } 
      }  

      IntBuffer tbuf=IntBuffer.wrap(pix1); 
      tbuf.position(0);  

      tex = texture[0]; 
      baos = new ByteArrayOutputStream(); 
      bMap.compress(Bitmap.CompressFormat.PNG, 100, baos); 
      b = baos.toByteArray(); 

      gl.glBindTexture(GL10.GL_TEXTURE_2D, tex); 

      gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_LUMINANCE, TEX_SIZE, TEX_SIZE, 0, GL10.GL_LUMINANCE, GL10.GL_UNSIGNED_BYTE, tbuf); //I am loading the texture 
      gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
      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); 

      gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texCoords); 


     //draw the box 
     box.draw(gl); 
     } 
     catch(Exception e) 
     { 

      e.printStackTrace(); 
      Log.d("error", "IOException e = " + e.toString()); 


     } 
    } 
    @Override 
    public void init(GL10 gl) { 


    } 
} 

截圖:http://blinksolution.com/110504-213626.jpg我無法將圖像紋理添加到此多維數據集。我得到一個綠色扭曲的立方體。我不知道是什麼問題

+1

爲什麼不呢?你從哪裏得到什麼錯誤?你真的希望我們通讀一大段代碼並弄清楚嗎?如何處理一些具體問題? – Goz 2011-05-04 15:45:36

+0

每次你想繪製的時候都會產生和加載一個紋理,就像地獄一樣慢。你不能只加載一次,並繼續使用它? – Goz 2011-05-04 15:46:32

+0

我很抱歉聽到它。你有問題嗎? – 2011-05-04 15:46:49

回答

0

你可能需要調用gl.glEnable(GL_TEXTURE_2D)。

+0

我已啓用此功能。所以這不是問題。我得到一個混亂的立方體,所以圖像越來越成熟 – user690961 2011-05-04 16:20:02

+1

我不知道這是否是原因,但你的texCoords是我從未見過的東西。根據我的理解,它們通常保持在[0f,1f]範圍內,並在渲染過程中映射到實際紋理大小。 – harism 2011-05-04 17:08:55

+0

如何做到這一點? – user690961 2011-05-04 18:04:31

相關問題