2011-06-21 4 views
3

Où puis-je trouver tous les outils pour concevoir un objet complexe dans OpenGL ES?OpenGL ES Tools pour Android

comme des carrés, des cubes, sphers ect

+0

Vous pouvez utiliser suivant l'exemple de ES http://blog.jayway.com/2009 OPENGL/12/03/opengl-es-tutoriel-pour-android-part-i /. –

+0

Hey MrComplicated comment et où avez-vous appelé sur cette classe que vous avez fourni le code ci-dessus? Est-il possible de poster un fichier zip contenant le projet exemple? Merci –

Répondre

7

Modélisez simplement vos objets et exportez-les dans un fichier OBJ, vous pouvez simplement charger le fichier OBJ dans votre scène.

Voici le code que j'ai écrit pour charger mes fichiers OBJ que j'ai exportés depuis Maya. Veuillez noter que cela ressemble plus au code expérimental, donc ce n'est pas propre, mais je l'ai testé et fonctionne parfaitement. La classe Vector3D contient les variables X, Y et Z, et la classe Face contient une ArrayList de UVW, de sommets et de normales de sommet.

Et vous devez dessiner votre objet en appelant glDrawElements btw. l'espoir que celui-ci contribuera =)

public class Model { 

    // Constants 
    private static final int FLOAT_SIZE_BYTES = 4; 
    private static final int SHORT_SIZE_BYTES = 2; 

    private FloatBuffer _vb; 
    private FloatBuffer _nb; 
    private ShortBuffer _ib; 
    private FloatBuffer _tcb; 

    private short[] indices; 

    private float[] tempV; 
    private float[] tempVt; 
    private float[] tempVn; 

    private ArrayList<Vector3D> vertices; 
    private ArrayList<Vector3D> vertexTexture; 
    private ArrayList<Vector3D> vertexNormal; 
    private ArrayList<Face> faces; 
    private int vertexCount; 

    private ArrayList<GroupObject> groupObjects; 

    //Android Stuff! 
    private Context context; 
    private int modelID; 

    public Model(int modelID, Context activity) 
    { 
     this.vertices = new ArrayList<Vector3D>(); 
     this.vertexTexture = new ArrayList<Vector3D>(); 
     this.vertexNormal = new ArrayList<Vector3D>(); 
     this.faces = new ArrayList<Face>(); 

     this.groupObjects = new ArrayList<GroupObject>(); 

     this.modelID = modelID; 
     this.context = activity; 

     loadFile(); 
    } 

    private int loadFile() 
    { 
     InputStream inputStream = context.getResources().openRawResource(modelID); 

     BufferedReader in = new BufferedReader(new InputStreamReader(inputStream)); 

     try { 
      loadOBJ(in); 
      Log.d("LOADING FILE", "FILE LOADED SUCESSFULLY===================="); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     try { 
      in.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return 1; 
    } 

    private void loadOBJ(BufferedReader in) throws IOException 
    { 
     Log.d("LOADING FILE", "STARTING!===================="); 
     GroupObject defaultObject = new GroupObject(); 
     GroupObject currentObject = defaultObject; 

     this.groupObjects.add(defaultObject); 

     String Line;   // Stores ever line we read! 
     String[] Blocks;  // Stores string fragments after the split!! 
     String CommandBlock; // Stores Command Blocks such as: v, vt, vn, g, etc... 

     while((Line = in.readLine()) != null) 
     { 
      Blocks = Line.split(" "); 
      CommandBlock = Blocks[0]; 

//   Log.d("COMMAND BLOCK" , "---------- " + CommandBlock + " ----------"); 

      if(CommandBlock.equals("g")) 
      { 
       if(Blocks[1] == "default") 
        currentObject = defaultObject; 
       else 
       { 
        GroupObject groupObject = new GroupObject(); 
        groupObject.setObjectName(Blocks[1]); 
        currentObject = groupObject; 
        groupObjects.add(groupObject); 
       } 
      } 

      if(CommandBlock.equals("v")) 
      { 
       Vector3D vertex = new Vector3D(Float.parseFloat(Blocks[1]), Float.parseFloat(Blocks[2]), Float.parseFloat(Blocks[3])); 
       this.vertices.add(vertex); 
//    Log.d("VERTEX DATA", " " + vertex.getX() + ", " + vertex.getY() + ", " + vertex.getZ()); 
      } 

      if(CommandBlock.equals("vt")) 
      { 
       Vector3D vertexTex = new Vector3D(Float.parseFloat(Blocks[1]), Float.parseFloat(Blocks[2]), 0.0f); 
       this.vertexTexture.add(vertexTex); 
//    Log.d("TEXTURE DATA", " " + vertexTex.getX() + ", " + vertexTex.getY() + ", " + vertexTex.getZ()); 
      } 

      if(CommandBlock.equals("vn")) 
      { 
       Vector3D vertexNorm = new Vector3D(Float.parseFloat(Blocks[1]), Float.parseFloat(Blocks[2]), Float.parseFloat(Blocks[3])); 
       this.vertexNormal.add(vertexNorm); 
//    Log.d("NORMAL DATA", " " + vertexNorm.getX() + ", " + vertexNorm.getY() + ", " + vertexNorm.getZ()); 
      } 

      if(CommandBlock.equals("f")) 
      { 
       Face face = new Face(); 
       faces.add(face); 

       String[] faceParams; 

       for(int i = 1; i < Blocks.length ; i++) 
       {    
        faceParams = Blocks[i].split("/"); 

        face.getVertices().add(this.vertices.get(Integer.parseInt(faceParams[0]) - 1));     

        if(faceParams[1] == ""){} 
        else 
        { 
         face.getUvws().add(this.vertexTexture.get(Integer.parseInt(faceParams[1]) - 1)); 
         face.getNormals().add(this.vertexNormal.get(Integer.parseInt(faceParams[2]) - 1)); 
        } 
       } 
      } 
     } 

//  fillInBuffers(); 
     fillInBuffersWithNormals(); 

     Log.d("OBJ OBJECT DATA", "V = " + vertices.size() + " VN = " + vertexTexture.size() + " VT = " + vertexNormal.size()); 

    } 

    private void fillInBuffers() { 

     int facesSize = faces.size(); 

     vertexCount = facesSize * 3; 

     tempV = new float[facesSize * 3 * 3]; 
     tempVt = new float[facesSize * 2 * 3]; 
     indices = new short[facesSize * 3]; 

     for(int i = 0; i < facesSize; i++) 
     { 
      Face face = faces.get(i); 
      tempV[i * 9]  = face.getVertices().get(0).getX(); 
      tempV[i * 9 + 1] = face.getVertices().get(0).getY(); 
      tempV[i * 9 + 2] = face.getVertices().get(0).getZ(); 
      tempV[i * 9 + 3] = face.getVertices().get(1).getX(); 
      tempV[i * 9 + 4] = face.getVertices().get(1).getY(); 
      tempV[i * 9 + 5] = face.getVertices().get(1).getZ(); 
      tempV[i * 9 + 6] = face.getVertices().get(2).getX(); 
      tempV[i * 9 + 7] = face.getVertices().get(2).getY(); 
      tempV[i * 9 + 8] = face.getVertices().get(2).getZ(); 
      tempVt[i * 6]  = face.getUvws().get(0).getX(); 
      tempVt[i * 6 + 1] = face.getUvws().get(0).getY(); 
      tempVt[i * 6 + 2] = face.getUvws().get(1).getX(); 
      tempVt[i * 6 + 3] = face.getUvws().get(1).getY(); 
      tempVt[i * 6 + 4] = face.getUvws().get(2).getX(); 
      tempVt[i * 6 + 5] = face.getUvws().get(2).getY(); 
      indices[i * 3]  = (short) (i * 3); 
      indices[i * 3 + 1] = (short) (i * 3 + 1); 
      indices[i * 3 + 2] = (short) (i * 3 + 2); 
     } 

     _vb = ByteBuffer.allocateDirect(tempV.length 
       * FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer(); 
     _vb.put(tempV); 
     _vb.position(0); 

     _tcb = ByteBuffer.allocateDirect(tempVt.length * FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer(); 
     _tcb.put(tempVt); 
     _tcb.position(0); 

     _ib = ByteBuffer.allocateDirect(indices.length 
       * SHORT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asShortBuffer(); 
     _ib.put(indices); 
     _ib.position(0); 
    } 

    private void fillInBuffersWithNormals() { 

     int facesSize = faces.size(); 

     vertexCount = facesSize * 3; 

     tempV = new float[facesSize * 3 * 3]; 
     tempVt = new float[facesSize * 2 * 3]; 
     tempVn = new float[facesSize * 3 * 3]; 
     indices = new short[facesSize * 3]; 

     for(int i = 0; i < facesSize; i++) 
     { 
      Face face = faces.get(i); 
      tempV[i * 9]  = face.getVertices().get(0).getX(); 
      tempV[i * 9 + 1] = face.getVertices().get(0).getY(); 
      tempV[i * 9 + 2] = face.getVertices().get(0).getZ(); 
      tempV[i * 9 + 3] = face.getVertices().get(1).getX(); 
      tempV[i * 9 + 4] = face.getVertices().get(1).getY(); 
      tempV[i * 9 + 5] = face.getVertices().get(1).getZ(); 
      tempV[i * 9 + 6] = face.getVertices().get(2).getX(); 
      tempV[i * 9 + 7] = face.getVertices().get(2).getY(); 
      tempV[i * 9 + 8] = face.getVertices().get(2).getZ(); 

      tempVn[i * 9]  = face.getNormals().get(0).getX(); 
      tempVn[i * 9 + 1] = face.getNormals().get(0).getY(); 
      tempVn[i * 9 + 2] = face.getNormals().get(0).getZ(); 
      tempVn[i * 9 + 3] = face.getNormals().get(1).getX(); 
      tempVn[i * 9 + 4] = face.getNormals().get(1).getY(); 
      tempVn[i * 9 + 5] = face.getNormals().get(1).getZ(); 
      tempVn[i * 9 + 6] = face.getNormals().get(2).getX(); 
      tempVn[i * 9 + 7] = face.getNormals().get(2).getY(); 
      tempVn[i * 9 + 8] = face.getNormals().get(2).getZ(); 

      tempVt[i * 6]  = face.getUvws().get(0).getX(); 
      tempVt[i * 6 + 1] = face.getUvws().get(0).getY(); 
      tempVt[i * 6 + 2] = face.getUvws().get(1).getX(); 
      tempVt[i * 6 + 3] = face.getUvws().get(1).getY(); 
      tempVt[i * 6 + 4] = face.getUvws().get(2).getX(); 
      tempVt[i * 6 + 5] = face.getUvws().get(2).getY(); 

      indices[i * 3]  = (short) (i * 3); 
      indices[i * 3 + 1] = (short) (i * 3 + 1); 
      indices[i * 3 + 2] = (short) (i * 3 + 2); 
     } 

     _vb = ByteBuffer.allocateDirect(tempV.length 
       * FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer(); 
     _vb.put(tempV); 
     _vb.position(0); 

     _tcb = ByteBuffer.allocateDirect(tempVt.length * FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer(); 
     _tcb.put(tempVt); 
     _tcb.position(0); 

     _nb = ByteBuffer.allocateDirect(tempVn.length * FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer(); 
     _nb.put(tempVn); 
     _nb.position(0); 

     _ib = ByteBuffer.allocateDirect(indices.length 
       * SHORT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asShortBuffer(); 
     _ib.put(indices); 
     _ib.position(0); 
    } 

    public FloatBuffer getVertices() 
    { 
     return _vb; 
    } 

    public FloatBuffer getTexCoords() 
    { 
     return _tcb; 
    } 

    public ShortBuffer getIndices() 
    { 
     return _ib; 
    } 

    public FloatBuffer getNormals() { 
     return _nb; 
    } 
} 

Si cela répond à votre question s'il vous plaît voter pour;)

+0

+1 pour rappeler aux nouveaux arrivants les fonctionnalités d'acceptation et de mise à jour. –

+0

Merci pour votre code, ça m'a vraiment aidé mais le problème est, je veux dessiner des objets complexes, dessiner un objet complexe comme une voiture serait une douleur en utilisant uniquement des sommets. Je me demandais si leur est un outil où nous pourrions rendre les choses plus faciles. le code que vous avez offert ne charge qu'un objet déjà fait. S'il vous plaît relply – karim

+0

Si vous voulez faire (ou modéliser) des objets complexes, vous devez apprendre à modéliser un objet 3D. Vous avez Blender qui est gratuit, et il ya des tonnes de tutoriels sur Internet sur la façon de l'utiliser et de modéliser des objets 3D complexes. D'autres logiciels comme Maya et 3DS Max feront aussi le travail mais vous devez acheter une licence pour eux. Et bien sûr, une fois que vous avez terminé la modélisation, vous devez exporter les modèles au format OBJ pour que le code que j'ai posté fonctionne;) – mrcomplicated